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.
@@ -3069,10 +3069,10 @@ class ZenduPhoneInputComponent {
3069
3069
  }
3070
3070
  }
3071
3071
  ZenduPhoneInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduPhoneInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3072
- 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"] }] });
3072
+ 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"] }] });
3073
3073
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduPhoneInputComponent, decorators: [{
3074
3074
  type: Component,
3075
- 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"] }]
3075
+ 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"] }]
3076
3076
  }], ctorParameters: function () { return []; }, propDecorators: { phone: [{
3077
3077
  type: Input
3078
3078
  }], maxLength: [{
@@ -3083,6 +3083,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
3083
3083
  type: Output
3084
3084
  }], disabled: [{
3085
3085
  type: Input
3086
+ }], width: [{
3087
+ type: Input
3086
3088
  }] } });
3087
3089
 
3088
3090
  class ZenduSortHeaderComponent {
@@ -5909,10 +5911,10 @@ class ZenduTimepickerComponent {
5909
5911
  }
5910
5912
  }
5911
5913
  ZenduTimepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduTimepickerComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
5912
- 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"] }] });
5914
+ 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"] }] });
5913
5915
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduTimepickerComponent, decorators: [{
5914
5916
  type: Component,
5915
- 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"] }]
5917
+ 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"] }]
5916
5918
  }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { mode: [{
5917
5919
  type: Input
5918
5920
  }], label: [{
@@ -5943,6 +5945,816 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
5943
5945
  args: ['window:mousedown', ['$event']]
5944
5946
  }] } });
5945
5947
 
5948
+ const EMOJI_CATEGORIES = [
5949
+ {
5950
+ key: 'smileys', label: 'Smileys', icon: '😀',
5951
+ emojis: ['😀', '😄', '😁', '😆', '😅', '🤣', '😂', '🙂', '😉', '😊', '🥰', '😍', '😘', '😋', '😛', '😜', '🤔', '😏', '🙄', '😬', '😴', '🤯']
5952
+ },
5953
+ {
5954
+ key: 'gestures', label: 'Gestures', icon: '👋',
5955
+ emojis: ['👋', '✋', '👌', '✌', '🤞', '🤙', '👍', '👎', '👏', '🙌', '🤝', '🙏']
5956
+ },
5957
+ {
5958
+ key: 'hearts', label: 'Hearts', icon: '❤️',
5959
+ emojis: ['❤️', '🧡', '💛', '💚', '💙', '💜', '🖤', '💔', '💕', '💖']
5960
+ },
5961
+ {
5962
+ key: 'objects', label: 'Objects', icon: '⭐',
5963
+ emojis: ['⭐', '🔥', '✨', '🎉', '🏆', '💯', '✅', '❌', '⚡', '💡', '🔔', '🔗']
5964
+ },
5965
+ ];
5966
+ class ZenduCommentTextareaComponent {
5967
+ constructor() {
5968
+ this.value = '';
5969
+ this.valueChange = new EventEmitter();
5970
+ this.label = '';
5971
+ this.placeholder = 'Enter a comment...';
5972
+ this.rows = 4;
5973
+ this.fileTypes = '*/*';
5974
+ this.loading = false;
5975
+ this.addComment = new EventEmitter();
5976
+ this.filesChanged = new EventEmitter();
5977
+ this.save = new EventEmitter();
5978
+ this.cancel = new EventEmitter();
5979
+ this.editing = false;
5980
+ this.emojiPickerOpen = false;
5981
+ this.emojiCategories = EMOJI_CATEGORIES;
5982
+ this.activeEmojiCategory = EMOJI_CATEGORIES[0].key;
5983
+ this.attachments = [];
5984
+ }
5985
+ ngOnInit() {
5986
+ if (this.value?.length > 0) {
5987
+ this.editing = true;
5988
+ }
5989
+ }
5990
+ onDocumentClick(event) {
5991
+ if (!this.emojiPickerOpen)
5992
+ return;
5993
+ const target = event.target;
5994
+ if (!target.closest('.zen-emoji-picker') && !target.closest('.zen-comment-textarea__icon-btn[title="Emoji"]')) {
5995
+ this.emojiPickerOpen = false;
5996
+ }
5997
+ }
5998
+ onInput(value) {
5999
+ this.value = value;
6000
+ this.valueChange.emit(value);
6001
+ this.editing = value.length > 0 || this.attachments.length > 0;
6002
+ }
6003
+ onKeydown(event) {
6004
+ if (event.key === 'Enter' && !event.shiftKey) {
6005
+ event.preventDefault();
6006
+ this.onAddComment();
6007
+ }
6008
+ }
6009
+ onAddComment() {
6010
+ if (this.loading)
6011
+ return;
6012
+ if (this.value.trim() || this.attachments.length) {
6013
+ this.addComment.emit({ text: this.value, files: this.attachments.map(a => a.file) });
6014
+ }
6015
+ }
6016
+ onSave() {
6017
+ if (this.loading)
6018
+ return;
6019
+ if (this.value.trim() || this.attachments.length) {
6020
+ this.save.emit({ text: this.value, files: this.attachments.map(a => a.file) });
6021
+ }
6022
+ }
6023
+ reset() {
6024
+ this.value = '';
6025
+ this.valueChange.emit(this.value);
6026
+ this.attachments = [];
6027
+ this.filesChanged.emit([]);
6028
+ this.editing = false;
6029
+ }
6030
+ onCancel() {
6031
+ this.value = '';
6032
+ this.valueChange.emit(this.value);
6033
+ this.attachments = [];
6034
+ this.filesChanged.emit([]);
6035
+ this.editing = false;
6036
+ this.cancel.emit();
6037
+ }
6038
+ toggleEmojiPicker() {
6039
+ this.emojiPickerOpen = !this.emojiPickerOpen;
6040
+ }
6041
+ selectEmoji(emoji) {
6042
+ this.value += emoji;
6043
+ this.valueChange.emit(this.value);
6044
+ this.editing = true;
6045
+ this.emojiPickerOpen = false;
6046
+ }
6047
+ setEmojiCategory(key) {
6048
+ this.activeEmojiCategory = key;
6049
+ }
6050
+ get activeEmojis() {
6051
+ const cat = this.emojiCategories.find(c => c.key === this.activeEmojiCategory);
6052
+ return cat ? cat.emojis : [];
6053
+ }
6054
+ onFileInput(event) {
6055
+ const input = event.target;
6056
+ if (!input.files?.length)
6057
+ return;
6058
+ for (let i = 0; i < input.files.length; i++) {
6059
+ const file = input.files[i];
6060
+ this.attachments.push({
6061
+ file,
6062
+ name: file.name,
6063
+ size: this.formatFileSize(file.size),
6064
+ progress: 100,
6065
+ complete: true,
6066
+ });
6067
+ }
6068
+ this.editing = true;
6069
+ this.filesChanged.emit(this.attachments.map(a => a.file));
6070
+ input.value = '';
6071
+ }
6072
+ removeAttachment(index) {
6073
+ this.attachments.splice(index, 1);
6074
+ this.filesChanged.emit(this.attachments.map(a => a.file));
6075
+ if (!this.attachments.length && !this.value) {
6076
+ this.editing = false;
6077
+ }
6078
+ }
6079
+ getFileIcon(name) {
6080
+ const ext = name.split('.').pop()?.toLowerCase() || '';
6081
+ if (['pdf', 'doc', 'docx', 'txt', 'xls', 'xlsx', 'csv', 'ppt', 'pptx'].includes(ext))
6082
+ return 'document';
6083
+ if (['mp4', 'mov', 'avi', 'mkv', 'webm', 'flv'].includes(ext))
6084
+ return 'video';
6085
+ return 'misc';
6086
+ }
6087
+ formatFileSize(bytes) {
6088
+ if (bytes < 1024)
6089
+ return bytes + ' B';
6090
+ if (bytes < 1024 * 1024)
6091
+ return (bytes / 1024).toFixed(0) + ' KB';
6092
+ return (bytes / (1024 * 1024)).toFixed(1) + ' MB';
6093
+ }
6094
+ }
6095
+ ZenduCommentTextareaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentTextareaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6096
+ 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"] }] });
6097
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentTextareaComponent, decorators: [{
6098
+ type: Component,
6099
+ 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"] }]
6100
+ }], propDecorators: { value: [{
6101
+ type: Input
6102
+ }], valueChange: [{
6103
+ type: Output
6104
+ }], label: [{
6105
+ type: Input
6106
+ }], placeholder: [{
6107
+ type: Input
6108
+ }], rows: [{
6109
+ type: Input
6110
+ }], fileTypes: [{
6111
+ type: Input
6112
+ }], loading: [{
6113
+ type: Input
6114
+ }], addComment: [{
6115
+ type: Output
6116
+ }], filesChanged: [{
6117
+ type: Output
6118
+ }], save: [{
6119
+ type: Output
6120
+ }], cancel: [{
6121
+ type: Output
6122
+ }], onDocumentClick: [{
6123
+ type: HostListener,
6124
+ args: ['document:click', ['$event']]
6125
+ }] } });
6126
+
6127
+ class ZenduCommentItemComponent {
6128
+ constructor() {
6129
+ this.showConnector = true;
6130
+ this.editable = true;
6131
+ this.deletable = true;
6132
+ this.loading = false;
6133
+ this.edit = new EventEmitter();
6134
+ this.delete = new EventEmitter();
6135
+ this.saveEdit = new EventEmitter();
6136
+ this.cancelEdit = new EventEmitter();
6137
+ this.editing = false;
6138
+ this.editValue = '';
6139
+ this.wasLoading = false;
6140
+ }
6141
+ ngOnChanges(changes) {
6142
+ if (changes['loading'] && this.wasLoading && !this.loading && this.editing) {
6143
+ this.editing = false;
6144
+ this.editValue = '';
6145
+ }
6146
+ this.wasLoading = this.loading;
6147
+ }
6148
+ get isEditable() {
6149
+ return this.editable && (this.comment?.editable !== false);
6150
+ }
6151
+ get isDeletable() {
6152
+ return this.deletable && (this.comment?.deletable !== false);
6153
+ }
6154
+ get initials() {
6155
+ if (!this.comment?.authorName)
6156
+ return '';
6157
+ return this.comment.authorName
6158
+ .split(' ')
6159
+ .map(n => n[0])
6160
+ .join('')
6161
+ .substring(0, 2)
6162
+ .toUpperCase();
6163
+ }
6164
+ onEdit() {
6165
+ if (this.loading)
6166
+ return;
6167
+ this.editing = true;
6168
+ this.editValue = this.comment.text;
6169
+ this.edit.emit(this.comment);
6170
+ }
6171
+ onDelete() {
6172
+ if (this.loading)
6173
+ return;
6174
+ this.delete.emit(this.comment);
6175
+ }
6176
+ onSaveEdit(event) {
6177
+ this.saveEdit.emit({ comment: this.comment, text: event.text });
6178
+ }
6179
+ onCancelEdit() {
6180
+ this.editing = false;
6181
+ this.editValue = '';
6182
+ this.cancelEdit.emit(this.comment);
6183
+ }
6184
+ getFileIcon(name) {
6185
+ const ext = name.split('.').pop()?.toLowerCase() || '';
6186
+ if (['pdf', 'doc', 'docx', 'txt', 'xls', 'xlsx', 'csv', 'ppt', 'pptx'].includes(ext))
6187
+ return 'document';
6188
+ if (['mp4', 'mov', 'avi', 'mkv', 'webm', 'flv'].includes(ext))
6189
+ return 'video';
6190
+ return 'misc';
6191
+ }
6192
+ }
6193
+ ZenduCommentItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6194
+ 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"] }] });
6195
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentItemComponent, decorators: [{
6196
+ type: Component,
6197
+ 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"] }]
6198
+ }], propDecorators: { comment: [{
6199
+ type: Input
6200
+ }], showConnector: [{
6201
+ type: Input
6202
+ }], editable: [{
6203
+ type: Input
6204
+ }], deletable: [{
6205
+ type: Input
6206
+ }], loading: [{
6207
+ type: Input
6208
+ }], edit: [{
6209
+ type: Output
6210
+ }], delete: [{
6211
+ type: Output
6212
+ }], saveEdit: [{
6213
+ type: Output
6214
+ }], cancelEdit: [{
6215
+ type: Output
6216
+ }] } });
6217
+
6218
+ class ZenduCommentListComponent {
6219
+ constructor() {
6220
+ this.comments = [];
6221
+ this.collapsible = true;
6222
+ this.expanded = false;
6223
+ this.editable = true;
6224
+ this.deletable = true;
6225
+ this.loadingCommentId = null;
6226
+ this.expandedChange = new EventEmitter();
6227
+ this.editComment = new EventEmitter();
6228
+ this.deleteComment = new EventEmitter();
6229
+ this.saveEditComment = new EventEmitter();
6230
+ this.cancelEditComment = new EventEmitter();
6231
+ }
6232
+ toggle() {
6233
+ this.expanded = !this.expanded;
6234
+ this.expandedChange.emit(this.expanded);
6235
+ }
6236
+ }
6237
+ ZenduCommentListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6238
+ 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"] }] });
6239
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentListComponent, decorators: [{
6240
+ type: Component,
6241
+ 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"] }]
6242
+ }], propDecorators: { comments: [{
6243
+ type: Input
6244
+ }], collapsible: [{
6245
+ type: Input
6246
+ }], expanded: [{
6247
+ type: Input
6248
+ }], editable: [{
6249
+ type: Input
6250
+ }], deletable: [{
6251
+ type: Input
6252
+ }], loadingCommentId: [{
6253
+ type: Input
6254
+ }], expandedChange: [{
6255
+ type: Output
6256
+ }], editComment: [{
6257
+ type: Output
6258
+ }], deleteComment: [{
6259
+ type: Output
6260
+ }], saveEditComment: [{
6261
+ type: Output
6262
+ }], cancelEditComment: [{
6263
+ type: Output
6264
+ }] } });
6265
+
6266
+ const MOBILE_BREAKPOINT = 768;
6267
+ class ZenduDatePickerDropdownComponent {
6268
+ constructor(_element, overlay, viewContainerRef, _translate) {
6269
+ this._element = _element;
6270
+ this.overlay = overlay;
6271
+ this.viewContainerRef = viewContainerRef;
6272
+ this._translate = _translate;
6273
+ this.type = 'single';
6274
+ this.date = null;
6275
+ this.dateChange = new EventEmitter();
6276
+ this.startDate = null;
6277
+ this.startDateChange = new EventEmitter();
6278
+ this.endDate = null;
6279
+ this.endDateChange = new EventEmitter();
6280
+ this.rangeChange = new EventEmitter();
6281
+ this.presets = null;
6282
+ this.minDate = null;
6283
+ this.maxDate = null;
6284
+ this.disabled = false;
6285
+ this.highlightDays = [];
6286
+ this.placeholder = '';
6287
+ this.mobileBreakpoint = MOBILE_BREAKPOINT;
6288
+ this.mobile = false;
6289
+ this.isOpen = false;
6290
+ // Left calendar state
6291
+ this.leftCurrentSlot = new Date();
6292
+ this.leftDayRows = [];
6293
+ this.leftDaysTitle = '';
6294
+ // Right calendar state (for range desktop)
6295
+ this.rightCurrentSlot = new Date();
6296
+ this.rightDayRows = [];
6297
+ this.rightDaysTitle = '';
6298
+ this.weekDays = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sat', 'Su'];
6299
+ // Internal selection state
6300
+ this._selectedDate = null;
6301
+ this._selectedStart = null;
6302
+ this._selectedEnd = null;
6303
+ this._activePreset = null;
6304
+ this.overlayRef = null;
6305
+ this.defaultPresets = [
6306
+ {
6307
+ label: 'Today',
6308
+ getRange: () => ({
6309
+ start: moment().startOf('day').toDate(),
6310
+ end: moment().endOf('day').toDate()
6311
+ })
6312
+ },
6313
+ {
6314
+ label: 'Yesterday',
6315
+ getRange: () => ({
6316
+ start: moment().subtract(1, 'day').startOf('day').toDate(),
6317
+ end: moment().subtract(1, 'day').endOf('day').toDate()
6318
+ })
6319
+ },
6320
+ {
6321
+ label: 'This week',
6322
+ getRange: () => ({
6323
+ start: moment().startOf('isoWeek').toDate(),
6324
+ end: moment().endOf('isoWeek').toDate()
6325
+ })
6326
+ },
6327
+ {
6328
+ label: 'Last week',
6329
+ getRange: () => ({
6330
+ start: moment().subtract(1, 'week').startOf('isoWeek').toDate(),
6331
+ end: moment().subtract(1, 'week').endOf('isoWeek').toDate()
6332
+ })
6333
+ },
6334
+ {
6335
+ label: 'This month',
6336
+ getRange: () => ({
6337
+ start: moment().startOf('month').toDate(),
6338
+ end: moment().endOf('month').toDate()
6339
+ })
6340
+ },
6341
+ {
6342
+ label: 'Last month',
6343
+ getRange: () => ({
6344
+ start: moment().subtract(1, 'month').startOf('month').toDate(),
6345
+ end: moment().subtract(1, 'month').endOf('month').toDate()
6346
+ })
6347
+ },
6348
+ {
6349
+ label: 'This year',
6350
+ getRange: () => ({
6351
+ start: moment().startOf('year').toDate(),
6352
+ end: moment().endOf('year').toDate()
6353
+ })
6354
+ },
6355
+ {
6356
+ label: 'Last year',
6357
+ getRange: () => ({
6358
+ start: moment().subtract(1, 'year').startOf('year').toDate(),
6359
+ end: moment().subtract(1, 'year').endOf('year').toDate()
6360
+ })
6361
+ },
6362
+ {
6363
+ label: 'All time',
6364
+ getRange: () => ({
6365
+ start: new Date(2000, 0, 1),
6366
+ end: moment().endOf('day').toDate()
6367
+ })
6368
+ }
6369
+ ];
6370
+ }
6371
+ ngOnInit() {
6372
+ this.checkMobile();
6373
+ }
6374
+ onResize() {
6375
+ this.checkMobile();
6376
+ }
6377
+ checkMobile() {
6378
+ this.mobile = window.innerWidth < this.mobileBreakpoint;
6379
+ }
6380
+ ngOnChanges(changes) {
6381
+ if (changes['date'] && this.date) {
6382
+ this._selectedDate = new Date(this.date);
6383
+ }
6384
+ if (changes['startDate'] && this.startDate) {
6385
+ this._selectedStart = new Date(this.startDate);
6386
+ }
6387
+ if (changes['endDate'] && this.endDate) {
6388
+ this._selectedEnd = new Date(this.endDate);
6389
+ }
6390
+ }
6391
+ ngOnDestroy() {
6392
+ this.closeOverlay();
6393
+ }
6394
+ outsideHandling(event) {
6395
+ if (!document.body.contains(event.target))
6396
+ return;
6397
+ if (this._element.nativeElement.contains(event.target))
6398
+ return;
6399
+ // Check if click is inside overlay
6400
+ if (this.overlayRef) {
6401
+ const overlayElement = this.overlayRef.overlayElement;
6402
+ if (overlayElement && overlayElement.contains(event.target))
6403
+ return;
6404
+ }
6405
+ this.close();
6406
+ }
6407
+ get activePresets() {
6408
+ return this.presets || this.defaultPresets;
6409
+ }
6410
+ get showPresetsSidebar() {
6411
+ return this.type === 'range' && !this.mobile;
6412
+ }
6413
+ get showDualCalendars() {
6414
+ return this.type === 'range' && !this.mobile;
6415
+ }
6416
+ get triggerLabel() {
6417
+ if (this.type === 'single') {
6418
+ if (this.date) {
6419
+ return this.formatDate(this.date);
6420
+ }
6421
+ return this.placeholder || this._translate.instant('Select date');
6422
+ }
6423
+ if (this.startDate && this.endDate) {
6424
+ return `${this.formatDate(this.startDate)} - ${this.formatDate(this.endDate)}`;
6425
+ }
6426
+ return this.placeholder || this._translate.instant('Select dates');
6427
+ }
6428
+ get hasValue() {
6429
+ if (this.type === 'single')
6430
+ return !!this.date;
6431
+ return !!(this.startDate && this.endDate);
6432
+ }
6433
+ get formattedSelectedDate() {
6434
+ return this._selectedDate ? this.formatDate(this._selectedDate) : '';
6435
+ }
6436
+ get formattedStartDate() {
6437
+ return this._selectedStart ? this.formatDate(this._selectedStart) : '';
6438
+ }
6439
+ get formattedEndDate() {
6440
+ return this._selectedEnd ? this.formatDate(this._selectedEnd) : '';
6441
+ }
6442
+ formatDate(date) {
6443
+ const enMonth = moment(date).format('MMM');
6444
+ const translatedMonth = this._translate.instant(enMonth);
6445
+ return moment(date).format('MMM D, YYYY').replace(enMonth, translatedMonth);
6446
+ }
6447
+ toggle() {
6448
+ if (this.disabled)
6449
+ return;
6450
+ if (this.isOpen) {
6451
+ this.close();
6452
+ }
6453
+ else {
6454
+ this.open();
6455
+ }
6456
+ }
6457
+ open() {
6458
+ this.isOpen = true;
6459
+ this._selectedDate = this.date ? new Date(this.date) : null;
6460
+ this._selectedStart = this.startDate ? new Date(this.startDate) : null;
6461
+ this._selectedEnd = this.endDate ? new Date(this.endDate) : null;
6462
+ this._activePreset = null;
6463
+ if (this.type === 'single') {
6464
+ this.leftCurrentSlot = this._selectedDate ? new Date(this._selectedDate) : new Date();
6465
+ }
6466
+ else {
6467
+ this.leftCurrentSlot = this._selectedStart ? new Date(this._selectedStart) : new Date();
6468
+ this.rightCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
6469
+ }
6470
+ this.updateCalendars();
6471
+ this.createOverlay();
6472
+ }
6473
+ close() {
6474
+ this.isOpen = false;
6475
+ this.closeOverlay();
6476
+ }
6477
+ createOverlay() {
6478
+ const position = {
6479
+ originX: 'end',
6480
+ originY: 'bottom',
6481
+ overlayX: 'end',
6482
+ overlayY: 'top'
6483
+ };
6484
+ const positionStrategy = this.overlay.position()
6485
+ .flexibleConnectedTo(this.triggerBtn)
6486
+ .withPositions([
6487
+ position,
6488
+ { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom' },
6489
+ { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },
6490
+ { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' }
6491
+ ])
6492
+ .withFlexibleDimensions(false)
6493
+ .withDefaultOffsetY(8)
6494
+ .withPush(false);
6495
+ this.overlayRef = this.overlay.create({
6496
+ positionStrategy,
6497
+ hasBackdrop: true,
6498
+ backdropClass: 'cdk-overlay-transparent-backdrop',
6499
+ panelClass: 'zen-date-picker-dropdown-overlay',
6500
+ });
6501
+ this.overlayRef.attach(new TemplatePortal(this.dropdownTemplate, this.viewContainerRef));
6502
+ this.overlayRef.backdropClick().subscribe(() => {
6503
+ this.close();
6504
+ });
6505
+ }
6506
+ closeOverlay() {
6507
+ if (this.overlayRef) {
6508
+ this.overlayRef.detach();
6509
+ this.overlayRef.dispose();
6510
+ this.overlayRef = null;
6511
+ }
6512
+ }
6513
+ // Calendar navigation
6514
+ leftPrevMonth() {
6515
+ this.leftCurrentSlot = moment(this.leftCurrentSlot).subtract(1, 'month').toDate();
6516
+ if (this.showDualCalendars) {
6517
+ this.rightCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
6518
+ }
6519
+ this.updateCalendars();
6520
+ }
6521
+ leftNextMonth() {
6522
+ this.leftCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
6523
+ if (this.showDualCalendars) {
6524
+ this.rightCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
6525
+ }
6526
+ this.updateCalendars();
6527
+ }
6528
+ rightPrevMonth() {
6529
+ this.rightCurrentSlot = moment(this.rightCurrentSlot).subtract(1, 'month').toDate();
6530
+ this.leftCurrentSlot = moment(this.rightCurrentSlot).subtract(1, 'month').toDate();
6531
+ this.updateCalendars();
6532
+ }
6533
+ rightNextMonth() {
6534
+ this.rightCurrentSlot = moment(this.rightCurrentSlot).add(1, 'month').toDate();
6535
+ this.leftCurrentSlot = moment(this.rightCurrentSlot).subtract(1, 'month').toDate();
6536
+ this.updateCalendars();
6537
+ }
6538
+ // For mobile/single mode when there's only one calendar
6539
+ prevMonth() {
6540
+ this.leftPrevMonth();
6541
+ }
6542
+ nextMonth() {
6543
+ this.leftNextMonth();
6544
+ }
6545
+ selectDay(day) {
6546
+ if (day.isDisabled || day.isOutside)
6547
+ return;
6548
+ if (this.type === 'single') {
6549
+ this._selectedDate = new Date(day.date);
6550
+ }
6551
+ else {
6552
+ // Range selection logic
6553
+ if (!this._selectedStart || (this._selectedStart && this._selectedEnd)) {
6554
+ // Start new selection
6555
+ this._selectedStart = new Date(day.date);
6556
+ this._selectedEnd = null;
6557
+ this._activePreset = null;
6558
+ }
6559
+ else {
6560
+ // Complete the range
6561
+ const newDate = new Date(day.date);
6562
+ if (moment(newDate).isBefore(this._selectedStart)) {
6563
+ this._selectedEnd = new Date(this._selectedStart);
6564
+ this._selectedStart = newDate;
6565
+ }
6566
+ else {
6567
+ this._selectedEnd = newDate;
6568
+ }
6569
+ }
6570
+ }
6571
+ this.updateCalendars();
6572
+ }
6573
+ selectPreset(preset) {
6574
+ const range = preset.getRange();
6575
+ this._selectedStart = range.start;
6576
+ this._selectedEnd = range.end;
6577
+ this._activePreset = preset.label;
6578
+ this.leftCurrentSlot = new Date(range.start);
6579
+ if (this.showDualCalendars) {
6580
+ this.rightCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
6581
+ }
6582
+ this.updateCalendars();
6583
+ }
6584
+ goToToday() {
6585
+ const today = new Date();
6586
+ this._selectedDate = moment(today).startOf('day').toDate();
6587
+ this.leftCurrentSlot = new Date(today);
6588
+ this.updateCalendars();
6589
+ }
6590
+ apply() {
6591
+ if (this.type === 'single') {
6592
+ if (this._selectedDate) {
6593
+ this.date = new Date(this._selectedDate);
6594
+ this.dateChange.emit(this.date);
6595
+ }
6596
+ }
6597
+ else {
6598
+ if (this._selectedStart) {
6599
+ this.startDate = new Date(this._selectedStart);
6600
+ this.startDateChange.emit(this.startDate);
6601
+ }
6602
+ if (this._selectedEnd) {
6603
+ this.endDate = new Date(this._selectedEnd);
6604
+ this.endDateChange.emit(this.endDate);
6605
+ }
6606
+ if (this._selectedStart && this._selectedEnd) {
6607
+ this.rangeChange.emit({ start: this.startDate, end: this.endDate });
6608
+ }
6609
+ }
6610
+ this.close();
6611
+ }
6612
+ cancel() {
6613
+ this.close();
6614
+ }
6615
+ get canApply() {
6616
+ if (this.type === 'single')
6617
+ return !!this._selectedDate;
6618
+ return !!(this._selectedStart && this._selectedEnd);
6619
+ }
6620
+ updateCalendars() {
6621
+ this.updateDays(this.leftCurrentSlot, 'left');
6622
+ if (this.showDualCalendars) {
6623
+ this.updateDays(this.rightCurrentSlot, 'right');
6624
+ }
6625
+ }
6626
+ updateDays(slot, side) {
6627
+ const enMonth = moment(slot).format('MMM');
6628
+ const translatedMonth = this._translate.instant(enMonth);
6629
+ const title = moment(slot).format('MMMM YYYY');
6630
+ const dayRows = [];
6631
+ let current = moment(slot).startOf('month').startOf('isoWeek');
6632
+ const end = moment(slot).endOf('month').endOf('isoWeek');
6633
+ const currentMonth = moment(slot).month();
6634
+ while (current.isSameOrBefore(end)) {
6635
+ const row = { days: [] };
6636
+ dayRows.push(row);
6637
+ for (let idx = 0; idx < 7; idx++) {
6638
+ const isOutside = currentMonth !== current.month();
6639
+ let isDisabled = false;
6640
+ if (this.minDate && current.toDate() < this.minDate) {
6641
+ isDisabled = true;
6642
+ }
6643
+ else if (this.maxDate && current.toDate() > this.maxDate) {
6644
+ isDisabled = true;
6645
+ }
6646
+ let isHighlighted = false;
6647
+ if (this.highlightDays && this.highlightDays.length) {
6648
+ isHighlighted = this.highlightDays.indexOf(current.valueOf()) >= 0;
6649
+ }
6650
+ const isSelected = isOutside ? false : this.isDaySelected(current);
6651
+ row.days.push({
6652
+ date: current.toDate(),
6653
+ lbl: isOutside ? '' : current.date().toString(),
6654
+ isOutside,
6655
+ selected: isSelected,
6656
+ isDisabled: isOutside ? true : isDisabled,
6657
+ isHighlighted: isOutside ? false : isHighlighted
6658
+ });
6659
+ current = current.clone().add(1, 'day');
6660
+ }
6661
+ }
6662
+ if (side === 'left') {
6663
+ this.leftDayRows = dayRows;
6664
+ this.leftDaysTitle = title;
6665
+ }
6666
+ else {
6667
+ this.rightDayRows = dayRows;
6668
+ this.rightDaysTitle = title;
6669
+ }
6670
+ }
6671
+ isDaySelected(date) {
6672
+ if (this.type === 'single') {
6673
+ return this._selectedDate ? date.isSame(moment(this._selectedDate), 'day') : false;
6674
+ }
6675
+ if (this._selectedStart && date.isSame(moment(this._selectedStart), 'day'))
6676
+ return true;
6677
+ if (this._selectedEnd && date.isSame(moment(this._selectedEnd), 'day'))
6678
+ return true;
6679
+ return false;
6680
+ }
6681
+ isToday(day) {
6682
+ if (day.isOutside)
6683
+ return false;
6684
+ return moment(day.date).isSame(moment(), 'day');
6685
+ }
6686
+ isInRange(day) {
6687
+ if (day.isOutside)
6688
+ return false;
6689
+ if (this.type !== 'range' || !this._selectedStart || !this._selectedEnd)
6690
+ return false;
6691
+ const d = moment(day.date);
6692
+ return d.isAfter(moment(this._selectedStart), 'day') && d.isBefore(moment(this._selectedEnd), 'day');
6693
+ }
6694
+ isRangeStart(day) {
6695
+ if (day.isOutside)
6696
+ return false;
6697
+ if (this.type !== 'range' || !this._selectedStart)
6698
+ return false;
6699
+ return moment(day.date).isSame(moment(this._selectedStart), 'day');
6700
+ }
6701
+ isRangeEnd(day) {
6702
+ if (day.isOutside)
6703
+ return false;
6704
+ if (this.type !== 'range' || !this._selectedEnd)
6705
+ return false;
6706
+ return moment(day.date).isSame(moment(this._selectedEnd), 'day');
6707
+ }
6708
+ }
6709
+ 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 });
6710
+ 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" }] });
6711
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduDatePickerDropdownComponent, decorators: [{
6712
+ type: Component,
6713
+ 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"] }]
6714
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$1.Overlay }, { type: i0.ViewContainerRef }, { type: i2$1.TranslateService }]; }, propDecorators: { type: [{
6715
+ type: Input
6716
+ }], date: [{
6717
+ type: Input
6718
+ }], dateChange: [{
6719
+ type: Output
6720
+ }], startDate: [{
6721
+ type: Input
6722
+ }], startDateChange: [{
6723
+ type: Output
6724
+ }], endDate: [{
6725
+ type: Input
6726
+ }], endDateChange: [{
6727
+ type: Output
6728
+ }], rangeChange: [{
6729
+ type: Output
6730
+ }], presets: [{
6731
+ type: Input
6732
+ }], minDate: [{
6733
+ type: Input
6734
+ }], maxDate: [{
6735
+ type: Input
6736
+ }], disabled: [{
6737
+ type: Input
6738
+ }], highlightDays: [{
6739
+ type: Input
6740
+ }], placeholder: [{
6741
+ type: Input
6742
+ }], mobileBreakpoint: [{
6743
+ type: Input
6744
+ }], triggerBtn: [{
6745
+ type: ViewChild,
6746
+ args: ['triggerBtn']
6747
+ }], dropdownTemplate: [{
6748
+ type: ViewChild,
6749
+ args: ['dropdownTemplate']
6750
+ }], onResize: [{
6751
+ type: HostListener,
6752
+ args: ['window:resize']
6753
+ }], outsideHandling: [{
6754
+ type: HostListener,
6755
+ args: ['window:mousedown', ['$event']]
6756
+ }] } });
6757
+
5946
6758
  // AoT requires an exported function for factories
5947
6759
  function HttpLoaderFactory(httpClient) {
5948
6760
  return new TranslateHttpLoader(httpClient);
@@ -5983,7 +6795,11 @@ NgZenduitModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version
5983
6795
  ZenSnapshotPlayerComponent,
5984
6796
  ZenWebRTCPlayerComponent,
5985
6797
  ZenduSelectButtonDirective,
5986
- ZenduTimepickerComponent], imports: [CommonModule,
6798
+ ZenduTimepickerComponent,
6799
+ ZenduCommentTextareaComponent,
6800
+ ZenduCommentItemComponent,
6801
+ ZenduCommentListComponent,
6802
+ ZenduDatePickerDropdownComponent], imports: [CommonModule,
5987
6803
  FormsModule,
5988
6804
  DragDropModule,
5989
6805
  AngularSignaturePadModule,
@@ -6017,7 +6833,11 @@ NgZenduitModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version
6017
6833
  ZenduLocationSearch,
6018
6834
  ZenLiveViewPlayerComponent,
6019
6835
  ZenduSelectButtonDirective,
6020
- ZenduTimepickerComponent] });
6836
+ ZenduTimepickerComponent,
6837
+ ZenduCommentTextareaComponent,
6838
+ ZenduCommentItemComponent,
6839
+ ZenduCommentListComponent,
6840
+ ZenduDatePickerDropdownComponent] });
6021
6841
  NgZenduitModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: NgZenduitModule, providers: [
6022
6842
  OpenCVService,
6023
6843
  ], imports: [CommonModule,
@@ -6071,7 +6891,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
6071
6891
  ZenSnapshotPlayerComponent,
6072
6892
  ZenWebRTCPlayerComponent,
6073
6893
  ZenduSelectButtonDirective,
6074
- ZenduTimepickerComponent
6894
+ ZenduTimepickerComponent,
6895
+ ZenduCommentTextareaComponent,
6896
+ ZenduCommentItemComponent,
6897
+ ZenduCommentListComponent,
6898
+ ZenduDatePickerDropdownComponent
6075
6899
  ],
6076
6900
  providers: [
6077
6901
  OpenCVService,
@@ -6121,7 +6945,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
6121
6945
  ZenduLocationSearch,
6122
6946
  ZenLiveViewPlayerComponent,
6123
6947
  ZenduSelectButtonDirective,
6124
- ZenduTimepickerComponent
6948
+ ZenduTimepickerComponent,
6949
+ ZenduCommentTextareaComponent,
6950
+ ZenduCommentItemComponent,
6951
+ ZenduCommentListComponent,
6952
+ ZenduDatePickerDropdownComponent
6125
6953
  ]
6126
6954
  }]
6127
6955
  }] });
@@ -6134,5 +6962,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
6134
6962
  * Generated bundle index. Do not edit.
6135
6963
  */
6136
6964
 
6137
- 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 };
6965
+ 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 };
6138
6966
  //# sourceMappingURL=ng-zenduit.mjs.map