ngx-kit 7.3.3 → 7.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -252,11 +252,11 @@ class NgxShadowControl {
252
252
  }
253
253
  close() { }
254
254
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxShadowControl, deps: [], target: i0.ɵɵFactoryTarget.Component });
255
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: NgxShadowControl, isStandalone: true, selector: "ngx-shadow-control", inputs: { maxRange: { classPropertyName: "maxRange", publicName: "maxRange", isSignal: true, isRequired: false, transformFunction: null }, selectedShadow: { classPropertyName: "selectedShadow", publicName: "selectedShadow", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { selectedShadow: "selectedShadowChange", shadowChange: "shadowChange" }, host: { listeners: { "document:mouseup": "onDragEnd($event)", "document:touchend": "onDragEnd($event)", "mousemove": "onMouseMove($event)", "touchmove": "onMouseMove($event)" } }, viewQueries: [{ propertyName: "pad", first: true, predicate: ["pad"], descendants: true }, { propertyName: "flashlight", first: true, predicate: ["flashlight"], descendants: true }], ngImport: i0, template: "<div class=\"ngx-shadow-control\">\n <div\n class=\"pad-container\"\n #pad\n (mousedown)=\"onPadClick($event)\"\n (touchstart)=\"onPadClick($event)\">\n <div class=\"card-sample\" [style.boxShadow]=\"selectedShadow().cssValue\"></div>\n <svg\n class=\"flashlight-svg\"\n viewBox=\"0 0 640 512\"\n xmlns=\"http://www.w3.org/2000/svg\"\n #flashlight\n [style.left.px]=\"x()\"\n [style.top.px]=\"y()\"\n (mousedown)=\"dragStart($event)\"\n (touchstart)=\"dragStart($event)\">\n <defs>\n <style>\n .fa-secondary {\n opacity: 0.4;\n }\n </style>\n </defs>\n <path\n class=\"fa-primary\"\n d=\"M607.1 96h-32v320h32c17.62 0 32-14.38 32-32V128C639.1 110.4 625.6 96 607.1 96zM287.1 224h-32c-17.62 0-32 14.38-32 32s14.38 32 32 32h32c17.62 0 32-14.38 32-32S305.6 224 287.1 224z\" />\n <path\n class=\"fa-secondary\"\n d=\"M400.1 149.2L383.1 160H31.1c-17.62 0-32 14.38-32 32v128c0 17.62 14.38 32 32 32h352l16.12 10.75C443.2 391.5 511.1 416 575.1 416V96C511.1 96 443.2 120.5 400.1 149.2zM287.1 288h-32c-17.62 0-32-14.38-32-32s14.38-32 32-32h32c17.62 0 32 14.38 32 32S305.6 288 287.1 288z\" />\n </svg>\n </div>\n <div class=\"pi-btn-group\" role=\"group\">\n <input\n type=\"radio\"\n class=\"btn-check\"\n name=\"showside\"\n id=\"SHoutside\"\n autocomplete=\"off\"\n [(ngModel)]=\"selectedShadow().inset\"\n (ngModelChange)=\"updateShadow({ inset: selectedShadow().inset })\"\n [value]=\"false\" />\n <label class=\"button\" for=\"SHoutside\" title=\"Outside\">Outside</label>\n <input\n type=\"radio\"\n class=\"btn-check\"\n name=\"showside\"\n id=\"SHinside\"\n autocomplete=\"off\"\n [(ngModel)]=\"selectedShadow().inset\"\n (ngModelChange)=\"updateShadow({ inset: selectedShadow().inset })\"\n [value]=\"true\" />\n <label class=\"button\" for=\"SHinside\" title=\"Inside\">Inside</label>\n </div>\n <div class=\"shadow-item\">\n <table>\n <tr>\n <th>\n <span>X</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().xOffset\"\n (ngModelChange)=\"updateShadow({ xOffset: selectedShadow().xOffset })\" />\n <input\n type=\"number\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().xOffset\"\n (ngModelChange)=\"updateShadow({ xOffset: selectedShadow().xOffset })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Y</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().yOffset\"\n (ngModelChange)=\"updateShadow({ yOffset: selectedShadow().yOffset })\" />\n <input\n type=\"number\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().yOffset\"\n (ngModelChange)=\"updateShadow({ yOffset: selectedShadow().yOffset })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Blur</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().blurRadius\"\n min=\"0\"\n (ngModelChange)=\"updateShadow({ blurRadius: selectedShadow().blurRadius })\" />\n <input\n type=\"number\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().blurRadius\"\n min=\"0\"\n (ngModelChange)=\"updateShadow({ blurRadius: selectedShadow().blurRadius })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Spread</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().spreadRadius\"\n (ngModelChange)=\"updateShadow({ spreadRadius: selectedShadow().spreadRadius })\" />\n <input\n type=\"number\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().spreadRadius\"\n (ngModelChange)=\"updateShadow({ spreadRadius: selectedShadow().spreadRadius })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Color</span>\n </th>\n <td>\n <input\n type=\"text\"\n [(ngModel)]=\"selectedShadow().color\"\n (ngModelChange)=\"updateShadow({ color: selectedShadow().color })\"\n ngxInputColor\n [simpleMode]=\"true\" />\n </td>\n </tr>\n </table>\n </div>\n</div>\n", styles: [":host{--ngx-color-bg: light-dark(#fff, #222);--ngx-color-text: light-dark(#000, #fff)}.ngx-shadow-control{width:270px;max-width:100%;overflow:hidden;direction:ltr;font-family:arial,tahoma;border:1px rgba(134,134,134,.3490196078) solid;background:var(--ngx-color-bg);color:var(--ngx-color-text)}.card-sample{border-radius:5px;width:50px;height:50px;background-color:#fff;z-index:1;border:1px #bbbbbb solid}.pad-container{background:#fff;position:relative;width:100%;height:200px;border:1px #545454 solid;box-sizing:border-box;direction:ltr;border-radius:3px;display:flex;align-items:center;justify-content:center}.pad-container:after,.pad-container:before{content:\"\";position:absolute;border:1px rgba(100,100,100,.1490196078) dotted}.pad-container:after{width:100%;top:calc(50% - 1px);left:0}.pad-container:before{height:100%;top:0;left:calc(50% - 1px)}.pad-container .thumb{box-shadow:inset 0 0 0 2px #fff;width:15px;height:15px;display:block;border-radius:10px;position:absolute;cursor:pointer;background:#00f}.flashlight-svg{width:24px;position:absolute;transform-origin:center center;z-index:10;fill:#ff6a00}.container{position:relative;width:300px;height:300px;background:#fff;border:2px solid #333;border-radius:8px;margin:50px auto;transition:box-shadow .2s ease}.flashlight{position:absolute;width:24px;height:24px;color:gold;transform:translate(-50%,-50%);pointer-events:none}table{width:100%;table-layout:fixed}table th{width:60px;font-size:12px}i,button{color:inherit}input:not([type=range]){width:68px;background:#4d4d4d;border:none;border-radius:3px;color:inherit;padding:4px}input[type=range]{flex:auto;appearance:none;-webkit-appearance:none;width:auto;height:4px;border-radius:5px;background-color:#696969;outline:none;margin:20px 2px 0}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:5px;height:20px;border-radius:2px;background-color:#1741ff;position:relative}.pi-btn-group{background-color:var(--color-bg-secondary, #383838);border:1px solid var(--color-bg-secondary, #383838);border-radius:var(--radius-medium, .3125rem);color:var(--fgColor)}.pi-btn-group button,.pi-btn-group .button{display:inline-block;padding:6px 10px;line-height:1;min-width:40px;border-radius:5px}.pi-btn-group button:last-child,.pi-btn-group .button:last-child{border-right:none}.pi-btn-group button.active,.pi-btn-group .button.active{background:#151515;border:none}.pi-btn-group input{display:none}.pi-btn-group label{color:inherit}.pi-btn-group i{font-weight:400;color:inherit}.pi-btn-group .btn-check:checked+.button{background:#151515;border:none}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number]:not([ngNoCva])[formControlName],input[type=number]:not([ngNoCva])[formControl],input[type=number]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.RangeValueAccessor, selector: "input[type=range]:not([ngNoCva])[formControlName],input[type=range]:not([ngNoCva])[formControl],input[type=range]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio]:not([ngNoCva])[formControlName],input[type=radio]:not([ngNoCva])[formControl],input[type=radio]:not([ngNoCva])[ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgxInputColor, selector: "[ngxInputColor]", inputs: ["setInputBackgroundColor", "simpleMode", "outputType", "defaultInspector", "useAlphaChannel", "showPresets", "presetColors", "ngxInputColor"], outputs: ["defaultInspectorChange", "colorChange", "change"], exportAs: ["ngxInputColor"] }] });
255
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.4", type: NgxShadowControl, isStandalone: true, selector: "ngx-shadow-control", inputs: { maxRange: { classPropertyName: "maxRange", publicName: "maxRange", isSignal: true, isRequired: false, transformFunction: null }, selectedShadow: { classPropertyName: "selectedShadow", publicName: "selectedShadow", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { selectedShadow: "selectedShadowChange", shadowChange: "shadowChange" }, host: { listeners: { "document:mouseup": "onDragEnd($event)", "document:touchend": "onDragEnd($event)", "mousemove": "onMouseMove($event)", "touchmove": "onMouseMove($event)" } }, viewQueries: [{ propertyName: "pad", first: true, predicate: ["pad"], descendants: true }, { propertyName: "flashlight", first: true, predicate: ["flashlight"], descendants: true }], ngImport: i0, template: "<div class=\"ngx-shadow-control\">\n <div\n class=\"pad-container\"\n #pad\n (mousedown)=\"onPadClick($event)\"\n (touchstart)=\"onPadClick($event)\">\n <div class=\"card-sample\" [style.boxShadow]=\"selectedShadow().cssValue\"></div>\n <svg\n class=\"flashlight-svg\"\n viewBox=\"0 0 640 512\"\n xmlns=\"http://www.w3.org/2000/svg\"\n #flashlight\n [style.left.px]=\"x()\"\n [style.top.px]=\"y()\"\n (mousedown)=\"dragStart($event)\"\n (touchstart)=\"dragStart($event)\">\n <defs>\n <style>\n .fa-secondary {\n opacity: 0.4;\n }\n </style>\n </defs>\n <path\n class=\"fa-primary\"\n d=\"M607.1 96h-32v320h32c17.62 0 32-14.38 32-32V128C639.1 110.4 625.6 96 607.1 96zM287.1 224h-32c-17.62 0-32 14.38-32 32s14.38 32 32 32h32c17.62 0 32-14.38 32-32S305.6 224 287.1 224z\" />\n <path\n class=\"fa-secondary\"\n d=\"M400.1 149.2L383.1 160H31.1c-17.62 0-32 14.38-32 32v128c0 17.62 14.38 32 32 32h352l16.12 10.75C443.2 391.5 511.1 416 575.1 416V96C511.1 96 443.2 120.5 400.1 149.2zM287.1 288h-32c-17.62 0-32-14.38-32-32s14.38-32 32-32h32c17.62 0 32 14.38 32 32S305.6 288 287.1 288z\" />\n </svg>\n </div>\n <div class=\"pi-btn-group\" role=\"group\">\n <input\n type=\"radio\"\n class=\"btn-check\"\n name=\"showside\"\n id=\"SHoutside\"\n autocomplete=\"off\"\n [(ngModel)]=\"selectedShadow().inset\"\n (ngModelChange)=\"updateShadow({ inset: selectedShadow().inset })\"\n [value]=\"false\" />\n <label class=\"button\" for=\"SHoutside\" title=\"Outside\">Outside</label>\n <input\n type=\"radio\"\n class=\"btn-check\"\n name=\"showside\"\n id=\"SHinside\"\n autocomplete=\"off\"\n [(ngModel)]=\"selectedShadow().inset\"\n (ngModelChange)=\"updateShadow({ inset: selectedShadow().inset })\"\n [value]=\"true\" />\n <label class=\"button\" for=\"SHinside\" title=\"Inside\">Inside</label>\n </div>\n <div class=\"shadow-item\">\n <table>\n <tr>\n <th>\n <span>X</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().xOffset\"\n (ngModelChange)=\"updateShadow({ xOffset: selectedShadow().xOffset })\" />\n <input\n type=\"number\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().xOffset\"\n (ngModelChange)=\"updateShadow({ xOffset: selectedShadow().xOffset })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Y</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().yOffset\"\n (ngModelChange)=\"updateShadow({ yOffset: selectedShadow().yOffset })\" />\n <input\n type=\"number\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().yOffset\"\n (ngModelChange)=\"updateShadow({ yOffset: selectedShadow().yOffset })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Blur</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().blurRadius\"\n min=\"0\"\n (ngModelChange)=\"updateShadow({ blurRadius: selectedShadow().blurRadius })\" />\n <input\n type=\"number\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().blurRadius\"\n min=\"0\"\n (ngModelChange)=\"updateShadow({ blurRadius: selectedShadow().blurRadius })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Spread</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().spreadRadius\"\n (ngModelChange)=\"updateShadow({ spreadRadius: selectedShadow().spreadRadius })\" />\n <input\n type=\"number\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().spreadRadius\"\n (ngModelChange)=\"updateShadow({ spreadRadius: selectedShadow().spreadRadius })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Color</span>\n </th>\n <td>\n <input\n type=\"text\"\n [(ngModel)]=\"selectedShadow().color\"\n (ngModelChange)=\"updateShadow({ color: selectedShadow().color })\"\n ngxInputColor\n [simpleMode]=\"true\" />\n </td>\n </tr>\n </table>\n </div>\n</div>\n", styles: [":host{--ngx-shadowbox-bg: light-dark(#fff, #222);--ngx-shadowbox-text: light-dark(#000, #fff)}.ngx-shadow-control{width:270px;max-width:100%;overflow:hidden;direction:ltr;font-family:arial,tahoma;border:1px rgba(134,134,134,.3490196078) solid;background:var(--ngx-shadowbox-bg);color:var(--ngx-shadowbox-text)}.card-sample{border-radius:5px;width:50px;height:50px;background-color:#fff;z-index:1;border:1px #bbbbbb solid}.pad-container{background:#fff;position:relative;width:100%;height:200px;border:1px #545454 solid;box-sizing:border-box;direction:ltr;border-radius:3px;display:flex;align-items:center;justify-content:center}.pad-container:after,.pad-container:before{content:\"\";position:absolute;border:1px rgba(100,100,100,.1490196078) dotted}.pad-container:after{width:100%;top:calc(50% - 1px);left:0}.pad-container:before{height:100%;top:0;left:calc(50% - 1px)}.pad-container .thumb{box-shadow:inset 0 0 0 2px #fff;width:15px;height:15px;display:block;border-radius:10px;position:absolute;cursor:pointer;background:#00f}.flashlight-svg{width:24px;position:absolute;transform-origin:center center;z-index:10;fill:#ff6a00}.container{position:relative;width:300px;height:300px;background:#fff;border:2px solid #333;border-radius:8px;margin:50px auto;transition:box-shadow .2s ease}.flashlight{position:absolute;width:24px;height:24px;color:gold;transform:translate(-50%,-50%);pointer-events:none}table{width:100%;table-layout:fixed}table th{width:60px;font-size:12px}i,button{color:inherit}input:not([type=range]){width:68px;background:#4d4d4d;border:none;border-radius:3px;color:inherit;padding:4px}input[type=range]{flex:auto;appearance:none;-webkit-appearance:none;width:auto;height:4px;border-radius:5px;background-color:#696969;outline:none;margin:20px 2px 0}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:5px;height:20px;border-radius:2px;background-color:#1741ff;position:relative}.pi-btn-group{background-color:var(--color-bg-secondary, #383838);border:1px solid var(--color-bg-secondary, #383838);border-radius:var(--radius-medium, .3125rem);color:var(--fgColor)}.pi-btn-group button,.pi-btn-group .button{display:inline-block;padding:6px 10px;line-height:1;min-width:40px;border-radius:5px}.pi-btn-group button:last-child,.pi-btn-group .button:last-child{border-right:none}.pi-btn-group button.active,.pi-btn-group .button.active{background:#151515;border:none}.pi-btn-group input{display:none}.pi-btn-group label{color:inherit}.pi-btn-group i{font-weight:400;color:inherit}.pi-btn-group .btn-check:checked+.button{background:#151515;border:none}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number]:not([ngNoCva])[formControlName],input[type=number]:not([ngNoCva])[formControl],input[type=number]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.RangeValueAccessor, selector: "input[type=range]:not([ngNoCva])[formControlName],input[type=range]:not([ngNoCva])[formControl],input[type=range]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio]:not([ngNoCva])[formControlName],input[type=radio]:not([ngNoCva])[formControl],input[type=radio]:not([ngNoCva])[ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgxInputColor, selector: "[ngxInputColor]", inputs: ["setInputBackgroundColor", "simpleMode", "outputType", "defaultInspector", "useAlphaChannel", "showPresets", "presetColors", "ngxInputColor"], outputs: ["defaultInspectorChange", "colorChange", "change"], exportAs: ["ngxInputColor"] }] });
256
256
  }
257
257
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxShadowControl, decorators: [{
258
258
  type: Component,
259
- args: [{ selector: 'ngx-shadow-control', imports: [FormsModule, NgxInputColor], template: "<div class=\"ngx-shadow-control\">\n <div\n class=\"pad-container\"\n #pad\n (mousedown)=\"onPadClick($event)\"\n (touchstart)=\"onPadClick($event)\">\n <div class=\"card-sample\" [style.boxShadow]=\"selectedShadow().cssValue\"></div>\n <svg\n class=\"flashlight-svg\"\n viewBox=\"0 0 640 512\"\n xmlns=\"http://www.w3.org/2000/svg\"\n #flashlight\n [style.left.px]=\"x()\"\n [style.top.px]=\"y()\"\n (mousedown)=\"dragStart($event)\"\n (touchstart)=\"dragStart($event)\">\n <defs>\n <style>\n .fa-secondary {\n opacity: 0.4;\n }\n </style>\n </defs>\n <path\n class=\"fa-primary\"\n d=\"M607.1 96h-32v320h32c17.62 0 32-14.38 32-32V128C639.1 110.4 625.6 96 607.1 96zM287.1 224h-32c-17.62 0-32 14.38-32 32s14.38 32 32 32h32c17.62 0 32-14.38 32-32S305.6 224 287.1 224z\" />\n <path\n class=\"fa-secondary\"\n d=\"M400.1 149.2L383.1 160H31.1c-17.62 0-32 14.38-32 32v128c0 17.62 14.38 32 32 32h352l16.12 10.75C443.2 391.5 511.1 416 575.1 416V96C511.1 96 443.2 120.5 400.1 149.2zM287.1 288h-32c-17.62 0-32-14.38-32-32s14.38-32 32-32h32c17.62 0 32 14.38 32 32S305.6 288 287.1 288z\" />\n </svg>\n </div>\n <div class=\"pi-btn-group\" role=\"group\">\n <input\n type=\"radio\"\n class=\"btn-check\"\n name=\"showside\"\n id=\"SHoutside\"\n autocomplete=\"off\"\n [(ngModel)]=\"selectedShadow().inset\"\n (ngModelChange)=\"updateShadow({ inset: selectedShadow().inset })\"\n [value]=\"false\" />\n <label class=\"button\" for=\"SHoutside\" title=\"Outside\">Outside</label>\n <input\n type=\"radio\"\n class=\"btn-check\"\n name=\"showside\"\n id=\"SHinside\"\n autocomplete=\"off\"\n [(ngModel)]=\"selectedShadow().inset\"\n (ngModelChange)=\"updateShadow({ inset: selectedShadow().inset })\"\n [value]=\"true\" />\n <label class=\"button\" for=\"SHinside\" title=\"Inside\">Inside</label>\n </div>\n <div class=\"shadow-item\">\n <table>\n <tr>\n <th>\n <span>X</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().xOffset\"\n (ngModelChange)=\"updateShadow({ xOffset: selectedShadow().xOffset })\" />\n <input\n type=\"number\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().xOffset\"\n (ngModelChange)=\"updateShadow({ xOffset: selectedShadow().xOffset })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Y</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().yOffset\"\n (ngModelChange)=\"updateShadow({ yOffset: selectedShadow().yOffset })\" />\n <input\n type=\"number\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().yOffset\"\n (ngModelChange)=\"updateShadow({ yOffset: selectedShadow().yOffset })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Blur</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().blurRadius\"\n min=\"0\"\n (ngModelChange)=\"updateShadow({ blurRadius: selectedShadow().blurRadius })\" />\n <input\n type=\"number\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().blurRadius\"\n min=\"0\"\n (ngModelChange)=\"updateShadow({ blurRadius: selectedShadow().blurRadius })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Spread</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().spreadRadius\"\n (ngModelChange)=\"updateShadow({ spreadRadius: selectedShadow().spreadRadius })\" />\n <input\n type=\"number\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().spreadRadius\"\n (ngModelChange)=\"updateShadow({ spreadRadius: selectedShadow().spreadRadius })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Color</span>\n </th>\n <td>\n <input\n type=\"text\"\n [(ngModel)]=\"selectedShadow().color\"\n (ngModelChange)=\"updateShadow({ color: selectedShadow().color })\"\n ngxInputColor\n [simpleMode]=\"true\" />\n </td>\n </tr>\n </table>\n </div>\n</div>\n", styles: [":host{--ngx-color-bg: light-dark(#fff, #222);--ngx-color-text: light-dark(#000, #fff)}.ngx-shadow-control{width:270px;max-width:100%;overflow:hidden;direction:ltr;font-family:arial,tahoma;border:1px rgba(134,134,134,.3490196078) solid;background:var(--ngx-color-bg);color:var(--ngx-color-text)}.card-sample{border-radius:5px;width:50px;height:50px;background-color:#fff;z-index:1;border:1px #bbbbbb solid}.pad-container{background:#fff;position:relative;width:100%;height:200px;border:1px #545454 solid;box-sizing:border-box;direction:ltr;border-radius:3px;display:flex;align-items:center;justify-content:center}.pad-container:after,.pad-container:before{content:\"\";position:absolute;border:1px rgba(100,100,100,.1490196078) dotted}.pad-container:after{width:100%;top:calc(50% - 1px);left:0}.pad-container:before{height:100%;top:0;left:calc(50% - 1px)}.pad-container .thumb{box-shadow:inset 0 0 0 2px #fff;width:15px;height:15px;display:block;border-radius:10px;position:absolute;cursor:pointer;background:#00f}.flashlight-svg{width:24px;position:absolute;transform-origin:center center;z-index:10;fill:#ff6a00}.container{position:relative;width:300px;height:300px;background:#fff;border:2px solid #333;border-radius:8px;margin:50px auto;transition:box-shadow .2s ease}.flashlight{position:absolute;width:24px;height:24px;color:gold;transform:translate(-50%,-50%);pointer-events:none}table{width:100%;table-layout:fixed}table th{width:60px;font-size:12px}i,button{color:inherit}input:not([type=range]){width:68px;background:#4d4d4d;border:none;border-radius:3px;color:inherit;padding:4px}input[type=range]{flex:auto;appearance:none;-webkit-appearance:none;width:auto;height:4px;border-radius:5px;background-color:#696969;outline:none;margin:20px 2px 0}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:5px;height:20px;border-radius:2px;background-color:#1741ff;position:relative}.pi-btn-group{background-color:var(--color-bg-secondary, #383838);border:1px solid var(--color-bg-secondary, #383838);border-radius:var(--radius-medium, .3125rem);color:var(--fgColor)}.pi-btn-group button,.pi-btn-group .button{display:inline-block;padding:6px 10px;line-height:1;min-width:40px;border-radius:5px}.pi-btn-group button:last-child,.pi-btn-group .button:last-child{border-right:none}.pi-btn-group button.active,.pi-btn-group .button.active{background:#151515;border:none}.pi-btn-group input{display:none}.pi-btn-group label{color:inherit}.pi-btn-group i{font-weight:400;color:inherit}.pi-btn-group .btn-check:checked+.button{background:#151515;border:none}\n"] }]
259
+ args: [{ selector: 'ngx-shadow-control', imports: [FormsModule, NgxInputColor], template: "<div class=\"ngx-shadow-control\">\n <div\n class=\"pad-container\"\n #pad\n (mousedown)=\"onPadClick($event)\"\n (touchstart)=\"onPadClick($event)\">\n <div class=\"card-sample\" [style.boxShadow]=\"selectedShadow().cssValue\"></div>\n <svg\n class=\"flashlight-svg\"\n viewBox=\"0 0 640 512\"\n xmlns=\"http://www.w3.org/2000/svg\"\n #flashlight\n [style.left.px]=\"x()\"\n [style.top.px]=\"y()\"\n (mousedown)=\"dragStart($event)\"\n (touchstart)=\"dragStart($event)\">\n <defs>\n <style>\n .fa-secondary {\n opacity: 0.4;\n }\n </style>\n </defs>\n <path\n class=\"fa-primary\"\n d=\"M607.1 96h-32v320h32c17.62 0 32-14.38 32-32V128C639.1 110.4 625.6 96 607.1 96zM287.1 224h-32c-17.62 0-32 14.38-32 32s14.38 32 32 32h32c17.62 0 32-14.38 32-32S305.6 224 287.1 224z\" />\n <path\n class=\"fa-secondary\"\n d=\"M400.1 149.2L383.1 160H31.1c-17.62 0-32 14.38-32 32v128c0 17.62 14.38 32 32 32h352l16.12 10.75C443.2 391.5 511.1 416 575.1 416V96C511.1 96 443.2 120.5 400.1 149.2zM287.1 288h-32c-17.62 0-32-14.38-32-32s14.38-32 32-32h32c17.62 0 32 14.38 32 32S305.6 288 287.1 288z\" />\n </svg>\n </div>\n <div class=\"pi-btn-group\" role=\"group\">\n <input\n type=\"radio\"\n class=\"btn-check\"\n name=\"showside\"\n id=\"SHoutside\"\n autocomplete=\"off\"\n [(ngModel)]=\"selectedShadow().inset\"\n (ngModelChange)=\"updateShadow({ inset: selectedShadow().inset })\"\n [value]=\"false\" />\n <label class=\"button\" for=\"SHoutside\" title=\"Outside\">Outside</label>\n <input\n type=\"radio\"\n class=\"btn-check\"\n name=\"showside\"\n id=\"SHinside\"\n autocomplete=\"off\"\n [(ngModel)]=\"selectedShadow().inset\"\n (ngModelChange)=\"updateShadow({ inset: selectedShadow().inset })\"\n [value]=\"true\" />\n <label class=\"button\" for=\"SHinside\" title=\"Inside\">Inside</label>\n </div>\n <div class=\"shadow-item\">\n <table>\n <tr>\n <th>\n <span>X</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().xOffset\"\n (ngModelChange)=\"updateShadow({ xOffset: selectedShadow().xOffset })\" />\n <input\n type=\"number\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().xOffset\"\n (ngModelChange)=\"updateShadow({ xOffset: selectedShadow().xOffset })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Y</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().yOffset\"\n (ngModelChange)=\"updateShadow({ yOffset: selectedShadow().yOffset })\" />\n <input\n type=\"number\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().yOffset\"\n (ngModelChange)=\"updateShadow({ yOffset: selectedShadow().yOffset })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Blur</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().blurRadius\"\n min=\"0\"\n (ngModelChange)=\"updateShadow({ blurRadius: selectedShadow().blurRadius })\" />\n <input\n type=\"number\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().blurRadius\"\n min=\"0\"\n (ngModelChange)=\"updateShadow({ blurRadius: selectedShadow().blurRadius })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Spread</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().spreadRadius\"\n (ngModelChange)=\"updateShadow({ spreadRadius: selectedShadow().spreadRadius })\" />\n <input\n type=\"number\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().spreadRadius\"\n (ngModelChange)=\"updateShadow({ spreadRadius: selectedShadow().spreadRadius })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Color</span>\n </th>\n <td>\n <input\n type=\"text\"\n [(ngModel)]=\"selectedShadow().color\"\n (ngModelChange)=\"updateShadow({ color: selectedShadow().color })\"\n ngxInputColor\n [simpleMode]=\"true\" />\n </td>\n </tr>\n </table>\n </div>\n</div>\n", styles: [":host{--ngx-shadowbox-bg: light-dark(#fff, #222);--ngx-shadowbox-text: light-dark(#000, #fff)}.ngx-shadow-control{width:270px;max-width:100%;overflow:hidden;direction:ltr;font-family:arial,tahoma;border:1px rgba(134,134,134,.3490196078) solid;background:var(--ngx-shadowbox-bg);color:var(--ngx-shadowbox-text)}.card-sample{border-radius:5px;width:50px;height:50px;background-color:#fff;z-index:1;border:1px #bbbbbb solid}.pad-container{background:#fff;position:relative;width:100%;height:200px;border:1px #545454 solid;box-sizing:border-box;direction:ltr;border-radius:3px;display:flex;align-items:center;justify-content:center}.pad-container:after,.pad-container:before{content:\"\";position:absolute;border:1px rgba(100,100,100,.1490196078) dotted}.pad-container:after{width:100%;top:calc(50% - 1px);left:0}.pad-container:before{height:100%;top:0;left:calc(50% - 1px)}.pad-container .thumb{box-shadow:inset 0 0 0 2px #fff;width:15px;height:15px;display:block;border-radius:10px;position:absolute;cursor:pointer;background:#00f}.flashlight-svg{width:24px;position:absolute;transform-origin:center center;z-index:10;fill:#ff6a00}.container{position:relative;width:300px;height:300px;background:#fff;border:2px solid #333;border-radius:8px;margin:50px auto;transition:box-shadow .2s ease}.flashlight{position:absolute;width:24px;height:24px;color:gold;transform:translate(-50%,-50%);pointer-events:none}table{width:100%;table-layout:fixed}table th{width:60px;font-size:12px}i,button{color:inherit}input:not([type=range]){width:68px;background:#4d4d4d;border:none;border-radius:3px;color:inherit;padding:4px}input[type=range]{flex:auto;appearance:none;-webkit-appearance:none;width:auto;height:4px;border-radius:5px;background-color:#696969;outline:none;margin:20px 2px 0}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:5px;height:20px;border-radius:2px;background-color:#1741ff;position:relative}.pi-btn-group{background-color:var(--color-bg-secondary, #383838);border:1px solid var(--color-bg-secondary, #383838);border-radius:var(--radius-medium, .3125rem);color:var(--fgColor)}.pi-btn-group button,.pi-btn-group .button{display:inline-block;padding:6px 10px;line-height:1;min-width:40px;border-radius:5px}.pi-btn-group button:last-child,.pi-btn-group .button:last-child{border-right:none}.pi-btn-group button.active,.pi-btn-group .button.active{background:#151515;border:none}.pi-btn-group input{display:none}.pi-btn-group label{color:inherit}.pi-btn-group i{font-weight:400;color:inherit}.pi-btn-group .btn-check:checked+.button{background:#151515;border:none}\n"] }]
260
260
  }], propDecorators: { maxRange: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxRange", required: false }] }], selectedShadow: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedShadow", required: true }] }, { type: i0.Output, args: ["selectedShadowChange"] }], shadowChange: [{ type: i0.Output, args: ["shadowChange"] }], pad: [{
261
261
  type: ViewChild,
262
262
  args: ['pad', { static: false }]
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-box-shadow.mjs","sources":["../../../projects/libs/box-shadow/utils/box-shadow-parser.ts","../../../projects/libs/box-shadow/components/shadow-control/shadow-control.ts","../../../projects/libs/box-shadow/components/shadow-control/shadow-control.html","../../../projects/libs/box-shadow/components/shadow-list/box-shadow.ts","../../../projects/libs/box-shadow/components/shadow-list/box-shadow.html","../../../projects/libs/box-shadow/ngx-kit-box-shadow.ts"],"sourcesContent":["import { extractCssColors } from 'ngx-kit/core';\nimport { BoxShadow } from '../contracts/BoxShadowValue';\n\nexport function parseBoxShadow(cssValue: string): BoxShadow[] {\n if (!cssValue || typeof cssValue !== 'string') {\n return [];\n }\n // Split multiple shadows by comma\n const shadows = cssValue\n .split(/,(?![^\\(]*\\))/)\n .map((shadow) => shadow.trim())\n .filter((shadow) => shadow);\n\n const boxShadows: BoxShadow[] = [];\n const unitRegex = /(px|rem|em)/;\n const numberRegex = /-?\\d*\\.?\\d*(?:px|rem|em)?/g;\n\n for (const shadow of shadows) {\n const boxShadow: BoxShadow = {\n xOffset: 0,\n yOffset: 0,\n color: 'rgba(0, 0, 0, 0)', // Default color\n unit: 'px', // Default unit\n cssValue: '',\n };\n\n // Check for inset\n boxShadow.inset = shadow.includes('inset');\n\n // Extract color\n const colorMatch = extractCssColors(shadow);\n if (colorMatch) {\n boxShadow.color = colorMatch[0];\n }\n\n // Remove inset and color to parse numbers\n let numberString = shadow.replace('inset', '').replace(boxShadow.color, '').trim();\n\n // Extract numbers\n const numbers = (numberString.match(numberRegex) ?? [])\n .map((shadow) => shadow.trim())\n .filter((shadow) => shadow);\n if (!numbers) continue;\n\n // Parse numbers\n for (let i = 0; i < numbers.length; i++) {\n const num = parseFloat(numbers[i]);\n const unit = numbers[i].match(unitRegex)?.[0] || 'px';\n boxShadow.unit = unit; // Update unit based on first detected unit\n\n if (i === 0) {\n boxShadow.xOffset = isNaN(num) ? 0 : num;\n } else if (i === 1) {\n boxShadow.yOffset = isNaN(num) ? 0 : num;\n } else if (i === 2) {\n boxShadow.blurRadius = isNaN(num) ? 0 : Math.max(0, num); // Blur can't be negative\n } else if (i === 3) {\n boxShadow.spreadRadius = isNaN(num) ? 0 : num;\n }\n }\n boxShadow.cssValue = shadow;\n boxShadows.push(boxShadow);\n }\n\n return boxShadows;\n}\n\n// Utility to validate and format color\nexport function validateColor(color: string): string {\n const hexRegex = /^#[0-9a-fA-F]{3,8}$/;\n const rgbRegex = /^rgba?\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*(,\\s*[\\d.]+)?\\)$/;\n const hslRegex = /^hsl\\(\\s*\\d+\\s*,\\s*\\d+%\\s*,\\s*\\d+%\\s*\\)$/;\n const namedColors = [\n 'black',\n 'white',\n 'red',\n 'blue',\n 'green',\n 'yellow',\n 'purple',\n 'orange',\n // Add more named colors as needed\n ];\n\n color = color.trim();\n if (hexRegex.test(color) || rgbRegex.test(color) || hslRegex.test(color)) {\n return color;\n }\n if (namedColors.includes(color.toLowerCase())) {\n return color.toLowerCase();\n }\n return 'rgba(0, 0, 0, 0)'; // Fallback to transparent\n}\n\n// Utility to format BoxShadow back to CSS string\nexport function formatBoxShadowToCSS(shadows: BoxShadow[]): string {\n return shadows\n .map((shadow) => {\n const parts: string[] = [];\n if (shadow.inset) {\n parts.push('inset');\n }\n parts.push(`${shadow.xOffset}${shadow.unit}`, `${shadow.yOffset}${shadow.unit}`);\n if (shadow.blurRadius !== undefined) {\n parts.push(`${shadow.blurRadius}${shadow.unit}`);\n }\n if (shadow.spreadRadius !== undefined) {\n parts.push(`${shadow.spreadRadius}${shadow.unit}`);\n }\n parts.push(shadow.color);\n return parts.join(' ');\n })\n .join(', ');\n}\n\n// Example usage:\n/*\nconst css = \"10px 20px 5px 0px rgba(0, 0, 0, 0.5), inset -10px -20px 10px #ff0000\";\nconst parsed = parseBoxShadow(css);\nconsole.log(parsed);\n// Output: [\n// { xOffset: 10, yOffset: 20, blurRadius: 5, spreadRadius: 0, color: \"rgba(0, 0, 0, 0.5)\", unit: \"px\" },\n// { inset: true, xOffset: -10, yOffset: -20, blurRadius: 10, color: \"#ff0000\", unit: \"px\" }\n// ]\nconst cssString = formatBoxShadowToCSS(parsed);\nconsole.log(cssString);\n// Output: \"10px 20px 5px 0px rgba(0, 0, 0, 0.5), inset -10px -20px 10px #ff0000\"\n*/\n","import {\n Component,\n HostListener,\n input,\n model,\n output,\n signal,\n ViewChild,\n ElementRef,\n OnInit,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { BoxShadow } from '../../contracts/BoxShadowValue';\nimport { NgxInputColor } from 'ngx-kit/color-picker';\nimport { formatBoxShadowToCSS } from '../../utils/box-shadow-parser';\nimport { getOffsetPosition } from 'ngx-kit/core';\n\n@Component({\n selector: 'ngx-shadow-control',\n templateUrl: './shadow-control.html',\n styleUrl: './shadow-control.scss',\n imports: [FormsModule, NgxInputColor],\n})\nexport class NgxShadowControl implements OnInit {\n protected readonly maxRange = input(25);\n readonly selectedShadow = model.required<BoxShadow>();\n\n private _previousCssValue?: string = '';\n readonly shadowChange = output<BoxShadow>();\n\n padRect?: DOMRect;\n flashlightRect?: DOMRect;\n center: { x: number; y: number } = { x: 0, y: 0 };\n x = signal(0);\n y = signal(0);\n isDragging = false;\n @ViewChild('pad', { static: false }) pad!: ElementRef<HTMLDivElement>;\n @ViewChild('flashlight', { static: false }) flashlight!: ElementRef<SVGSVGElement>;\n\n private radius: number = 0;\n\n ngOnInit(): void {\n this.setXyFromShadow(this.selectedShadow());\n this._previousCssValue = this.selectedShadow().cssValue;\n }\n\n onPadClick(ev: MouseEvent | TouchEvent) {\n const position = getOffsetPosition(ev, this.pad.nativeElement);\n this.isDragging = true;\n this.updatePosition(position);\n }\n\n dragStart(ev: MouseEvent | TouchEvent) {\n ev.stopPropagation();\n ev.preventDefault();\n this.updateContainerDimensions();\n this.isDragging = true;\n const position = getOffsetPosition(ev, this.pad.nativeElement);\n this.updatePosition(position);\n }\n\n @HostListener('document:mouseup', ['$event'])\n @HostListener('document:touchend', ['$event'])\n onDragEnd(ev: MouseEvent | TouchEvent) {\n this.isDragging = false;\n }\n\n @HostListener('mousemove', ['$event'])\n @HostListener('touchmove', ['$event'])\n onMouseMove(ev: MouseEvent | TouchEvent) {\n if (!this.isDragging) return;\n const position = getOffsetPosition(ev, this.pad.nativeElement);\n this.updatePosition(position);\n }\n\n private updatePosition(position: { x: number; y: number }) {\n const padRec = this.padRect!;\n const flashlightRec = this.flashlightRect!;\n\n const centerX = this.center.x;\n const centerY = this.center.y;\n\n const dx = position.x - centerX;\n const dy = position.y - centerY;\n\n // زاویه\n const angleRad = Math.atan2(dy, dx);\n const minX = flashlightRec.width / 2;\n const maxX = padRec.width - flashlightRec.width / 2;\n const minY = flashlightRec.height / 2;\n const maxY = padRec.height - flashlightRec.height / 2;\n const clampedX = Math.max(minX, Math.min(position.x, maxX));\n const clampedY = Math.max(minY, Math.min(position.y, maxY));\n\n // فقط یکبار از وسط اصلاح کن\n this.x.set(clampedX - flashlightRec.width / 2);\n this.y.set(clampedY - flashlightRec.height / 2);\n\n // ✅ ولی مقدار واقعی shadow رو از موقعیت موس (dx, dy) بگیر\n const halfRangeX = (padRec.width - flashlightRec.width) / 2;\n const halfRangeY = (padRec.height - flashlightRec.height) / 2;\n\n let valueX = (-dx / halfRangeX) * this.maxRange();\n let valueY = (-dy / halfRangeY) * this.maxRange();\n\n valueX = Math.round(Math.min(Math.max(valueX, -this.maxRange()), this.maxRange()));\n valueY = Math.round(Math.min(Math.max(valueY, -this.maxRange()), this.maxRange()));\n\n // چرخش چراغ قوه\n const angleDeg = angleRad * (180 / Math.PI);\n if (this.flashlight.nativeElement) {\n this.flashlight.nativeElement.style.transform = `rotate(${angleDeg + 180}deg)`;\n }\n\n // آپدیت shadow\n this.selectedShadow.set({\n ...this.selectedShadow(),\n xOffset: valueX,\n yOffset: valueY,\n });\n this.updateShadow(this.selectedShadow());\n }\n\n private updateContainerDimensions() {\n setTimeout(() => {\n if (!this.pad) return;\n this.padRect = this.pad.nativeElement.getBoundingClientRect();\n this.flashlightRect = this.flashlight.nativeElement.getBoundingClientRect();\n this.center = { x: this.padRect.width / 2, y: this.padRect.height / 2 };\n this.radius =\n Math.min(this.padRect.width, this.padRect.height) / 2 - this.flashlightRect.width / 2;\n this.x.set(0); // Reset to center\n this.y.set(0);\n });\n }\n\n updateShadow(updatedShadow: Partial<BoxShadow>) {\n this.selectedShadow().cssValue = formatBoxShadowToCSS([this.selectedShadow()]);\n this.setXyFromShadow(this.selectedShadow());\n if (this._previousCssValue != this.selectedShadow().cssValue) {\n this.shadowChange.emit(this.selectedShadow());\n }\n }\n\n setXyFromShadow(item: BoxShadow) {\n this.updateContainerDimensions();\n setTimeout(() => {\n const padRec = this.padRect!;\n const flashlightRec = this.flashlightRect!;\n const centerX = this.center.x;\n const centerY = this.center.y;\n\n const halfRangeX = (padRec.width - flashlightRec.width) / 2;\n const halfRangeY = (padRec.height - flashlightRec.height) / 2;\n\n // معکوس فرمول برای به‌دست آوردن dx , dy\n const dx = -(item.xOffset / this.maxRange()) * halfRangeX;\n const dy = -(item.yOffset / this.maxRange()) * halfRangeY;\n\n // موقعیت واقعی چراغ‌قوه\n const posX = centerX + dx;\n const posY = centerY + dy;\n\n this.x.set(posX - flashlightRec.width / 2);\n this.y.set(posY - flashlightRec.height / 2);\n\n // زاویه چراغ‌قوه\n const angleRad = Math.atan2(dy, dx);\n const angleDeg = angleRad * (180 / Math.PI);\n if (this.flashlight.nativeElement) {\n this.flashlight.nativeElement.style.transform = `rotate(${angleDeg + 180}deg)`;\n }\n });\n }\n\n close() {}\n}\n","<div class=\"ngx-shadow-control\">\n <div\n class=\"pad-container\"\n #pad\n (mousedown)=\"onPadClick($event)\"\n (touchstart)=\"onPadClick($event)\">\n <div class=\"card-sample\" [style.boxShadow]=\"selectedShadow().cssValue\"></div>\n <svg\n class=\"flashlight-svg\"\n viewBox=\"0 0 640 512\"\n xmlns=\"http://www.w3.org/2000/svg\"\n #flashlight\n [style.left.px]=\"x()\"\n [style.top.px]=\"y()\"\n (mousedown)=\"dragStart($event)\"\n (touchstart)=\"dragStart($event)\">\n <defs>\n <style>\n .fa-secondary {\n opacity: 0.4;\n }\n </style>\n </defs>\n <path\n class=\"fa-primary\"\n d=\"M607.1 96h-32v320h32c17.62 0 32-14.38 32-32V128C639.1 110.4 625.6 96 607.1 96zM287.1 224h-32c-17.62 0-32 14.38-32 32s14.38 32 32 32h32c17.62 0 32-14.38 32-32S305.6 224 287.1 224z\" />\n <path\n class=\"fa-secondary\"\n d=\"M400.1 149.2L383.1 160H31.1c-17.62 0-32 14.38-32 32v128c0 17.62 14.38 32 32 32h352l16.12 10.75C443.2 391.5 511.1 416 575.1 416V96C511.1 96 443.2 120.5 400.1 149.2zM287.1 288h-32c-17.62 0-32-14.38-32-32s14.38-32 32-32h32c17.62 0 32 14.38 32 32S305.6 288 287.1 288z\" />\n </svg>\n </div>\n <div class=\"pi-btn-group\" role=\"group\">\n <input\n type=\"radio\"\n class=\"btn-check\"\n name=\"showside\"\n id=\"SHoutside\"\n autocomplete=\"off\"\n [(ngModel)]=\"selectedShadow().inset\"\n (ngModelChange)=\"updateShadow({ inset: selectedShadow().inset })\"\n [value]=\"false\" />\n <label class=\"button\" for=\"SHoutside\" title=\"Outside\">Outside</label>\n <input\n type=\"radio\"\n class=\"btn-check\"\n name=\"showside\"\n id=\"SHinside\"\n autocomplete=\"off\"\n [(ngModel)]=\"selectedShadow().inset\"\n (ngModelChange)=\"updateShadow({ inset: selectedShadow().inset })\"\n [value]=\"true\" />\n <label class=\"button\" for=\"SHinside\" title=\"Inside\">Inside</label>\n </div>\n <div class=\"shadow-item\">\n <table>\n <tr>\n <th>\n <span>X</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().xOffset\"\n (ngModelChange)=\"updateShadow({ xOffset: selectedShadow().xOffset })\" />\n <input\n type=\"number\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().xOffset\"\n (ngModelChange)=\"updateShadow({ xOffset: selectedShadow().xOffset })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Y</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().yOffset\"\n (ngModelChange)=\"updateShadow({ yOffset: selectedShadow().yOffset })\" />\n <input\n type=\"number\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().yOffset\"\n (ngModelChange)=\"updateShadow({ yOffset: selectedShadow().yOffset })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Blur</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().blurRadius\"\n min=\"0\"\n (ngModelChange)=\"updateShadow({ blurRadius: selectedShadow().blurRadius })\" />\n <input\n type=\"number\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().blurRadius\"\n min=\"0\"\n (ngModelChange)=\"updateShadow({ blurRadius: selectedShadow().blurRadius })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Spread</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().spreadRadius\"\n (ngModelChange)=\"updateShadow({ spreadRadius: selectedShadow().spreadRadius })\" />\n <input\n type=\"number\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().spreadRadius\"\n (ngModelChange)=\"updateShadow({ spreadRadius: selectedShadow().spreadRadius })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Color</span>\n </th>\n <td>\n <input\n type=\"text\"\n [(ngModel)]=\"selectedShadow().color\"\n (ngModelChange)=\"updateShadow({ color: selectedShadow().color })\"\n ngxInputColor\n [simpleMode]=\"true\" />\n </td>\n </tr>\n </table>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DOCUMENT,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostListener,\n inject,\n input,\n Input,\n OnInit,\n output,\n Output,\n signal,\n ViewChild,\n} from '@angular/core';\nimport { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { formatBoxShadowToCSS, parseBoxShadow, validateColor } from '../../utils/box-shadow-parser';\nimport { getOffsetPosition, OverlayService, WINDOW } from 'ngx-kit/core';\nimport { BoxShadow } from '../../contracts/BoxShadowValue';\nimport { NgxShadowControl } from '../shadow-control/shadow-control';\n\n@Component({\n selector: 'ngx-box-shadow',\n templateUrl: './box-shadow.html',\n styleUrls: ['./box-shadow.scss'],\n standalone: true,\n imports: [CommonModule, FormsModule],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NgxShadowBox),\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxShadowBox implements OnInit, AfterViewInit {\n protected readonly maxRange = input(25);\n protected readonly shadowChange = output<string>();\n\n selectedIndex = signal(-1);\n\n shadows = signal<BoxShadow[]>([]);\n\n result = '';\n protected readonly doc = inject(DOCUMENT);\n protected readonly win = inject(WINDOW);\n protected readonly overlay = inject(OverlayService);\n protected readonly chdr = inject(ChangeDetectorRef);\n\n isDisabled: boolean = false;\n onChange = (_: string) => {};\n onTouched = () => {};\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled = isDisabled;\n }\n constructor() {}\n ngOnInit() {}\n ngAfterViewInit() {}\n writeValue(val: string): void {\n if (!val) {\n this.shadows.set([]);\n this.result = '';\n return;\n }\n this.shadows.set(parseBoxShadow(val));\n this.result = formatBoxShadowToCSS(this.shadows());\n // if (val !== this.result) {\n // this.update();\n // }\n }\n\n addShadow(container: HTMLElement) {\n this.shadows.update((u) => [\n ...u,\n {\n xOffset: 0,\n yOffset: 0,\n blurRadius: 10,\n spreadRadius: 0,\n color: 'rgba(0, 0, 0, 0.5)',\n unit: 'px',\n inset: false,\n },\n ]);\n this.update();\n setTimeout(() => {\n container.scrollTop = container.scrollHeight;\n }, 100);\n }\n\n setShadow(el: HTMLElement, item: BoxShadow, index: number) {\n this.selectedIndex.set(index);\n this.overlay.open({\n component: NgxShadowControl,\n anchor: el,\n configure: (instance, ref) => {\n ref.componentRef?.setInput('maxRange', this.maxRange());\n ref.componentRef?.setInput('selectedShadow', item);\n instance.shadowChange.subscribe((v) => {\n item = v;\n this.shadows.update((shadows) => {\n shadows[this.selectedIndex()] = item;\n return shadows;\n });\n this.chdr.markForCheck();\n this.update();\n });\n },\n onClosed: () => {\n this.selectedIndex.set(-1);\n },\n });\n }\n\n removeShadow(ev: Event, index: number) {\n ev.stopPropagation();\n\n this.shadows().splice(index, 1);\n this.update();\n }\n\n private update() {\n this.result = formatBoxShadowToCSS(this.shadows());\n this.shadows().forEach((m) => (m.cssValue = formatBoxShadowToCSS([m])));\n this.onChange(this.result);\n this.shadowChange.emit(this.result);\n }\n}\n","<div class=\"\">\n <button (click)=\"addShadow(list)\" type=\"button\" class=\"action-btn add-btn\">Add</button>\n</div>\n<div class=\"list-box\" #list>\n @for (item of shadows(); let i = $index; track i) {\n <button\n type=\"button\"\n class=\"list-item\"\n [class.active]=\"i == selectedIndex()\"\n #el\n (click)=\"setShadow(el, item, i)\">\n <span>{{ item.cssValue }}</span>\n <button (click)=\"removeShadow($event, i)\" type=\"button\" class=\"action-btn\">\n <svg fill=\"currentColor\" viewBox=\"0 0 320 512\">\n <path\n d=\"M315.3 411.3c-6.253 6.253-16.37 6.253-22.63 0L160 278.6l-132.7 132.7c-6.253 6.253-16.37 6.253-22.63 0c-6.253-6.253-6.253-16.37 0-22.63L137.4 256L4.69 123.3c-6.253-6.253-6.253-16.37 0-22.63c6.253-6.253 16.37-6.253 22.63 0L160 233.4l132.7-132.7c6.253-6.253 16.37-6.253 22.63 0c6.253 6.253 6.253 16.37 0 22.63L182.6 256l132.7 132.7C321.6 394.9 321.6 405.1 315.3 411.3z\" />\n </svg>\n </button>\n </button>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;AAGM,SAAU,cAAc,CAAC,QAAgB,EAAA;IAC7C,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;AAC7C,QAAA,OAAO,EAAE;IACX;;IAEA,MAAM,OAAO,GAAG;SACb,KAAK,CAAC,eAAe;SACrB,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,EAAE;SAC7B,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;IAE7B,MAAM,UAAU,GAAgB,EAAE;IAClC,MAAM,SAAS,GAAG,aAAa;IAC/B,MAAM,WAAW,GAAG,4BAA4B;AAEhD,IAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,QAAA,MAAM,SAAS,GAAc;AAC3B,YAAA,OAAO,EAAE,CAAC;AACV,YAAA,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,kBAAkB;YACzB,IAAI,EAAE,IAAI;AACV,YAAA,QAAQ,EAAE,EAAE;SACb;;QAGD,SAAS,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;;AAG1C,QAAA,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC;QAC3C,IAAI,UAAU,EAAE;AACd,YAAA,SAAS,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC;QACjC;;QAGA,IAAI,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;;QAGlF,MAAM,OAAO,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE;aACnD,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,EAAE;aAC7B,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;AAC7B,QAAA,IAAI,CAAC,OAAO;YAAE;;AAGd,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACvC,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAClC,YAAA,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI;AACrD,YAAA,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC;AAEtB,YAAA,IAAI,CAAC,KAAK,CAAC,EAAE;AACX,gBAAA,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG;YAC1C;AAAO,iBAAA,IAAI,CAAC,KAAK,CAAC,EAAE;AAClB,gBAAA,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG;YAC1C;AAAO,iBAAA,IAAI,CAAC,KAAK,CAAC,EAAE;gBAClB,SAAS,CAAC,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC3D;AAAO,iBAAA,IAAI,CAAC,KAAK,CAAC,EAAE;AAClB,gBAAA,SAAS,CAAC,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG;YAC/C;QACF;AACA,QAAA,SAAS,CAAC,QAAQ,GAAG,MAAM;AAC3B,QAAA,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;IAC5B;AAEA,IAAA,OAAO,UAAU;AACnB;AAEA;AACM,SAAU,aAAa,CAAC,KAAa,EAAA;IACzC,MAAM,QAAQ,GAAG,qBAAqB;IACtC,MAAM,QAAQ,GAAG,uDAAuD;IACxE,MAAM,QAAQ,GAAG,0CAA0C;AAC3D,IAAA,MAAM,WAAW,GAAG;QAClB,OAAO;QACP,OAAO;QACP,KAAK;QACL,MAAM;QACN,OAAO;QACP,QAAQ;QACR,QAAQ;QACR,QAAQ;;KAET;AAED,IAAA,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE;IACpB,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AACxE,QAAA,OAAO,KAAK;IACd;IACA,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE;AAC7C,QAAA,OAAO,KAAK,CAAC,WAAW,EAAE;IAC5B;IACA,OAAO,kBAAkB,CAAC;AAC5B;AAEA;AACM,SAAU,oBAAoB,CAAC,OAAoB,EAAA;AACvD,IAAA,OAAO;AACJ,SAAA,GAAG,CAAC,CAAC,MAAM,KAAI;QACd,MAAM,KAAK,GAAa,EAAE;AAC1B,QAAA,IAAI,MAAM,CAAC,KAAK,EAAE;AAChB,YAAA,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;QACrB;QACA,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,MAAM,CAAC,OAAO,CAAA,EAAG,MAAM,CAAC,IAAI,EAAE,EAAE,CAAA,EAAG,MAAM,CAAC,OAAO,CAAA,EAAG,MAAM,CAAC,IAAI,CAAA,CAAE,CAAC;AAChF,QAAA,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE;AACnC,YAAA,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,MAAM,CAAC,UAAU,CAAA,EAAG,MAAM,CAAC,IAAI,CAAA,CAAE,CAAC;QAClD;AACA,QAAA,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE;AACrC,YAAA,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,MAAM,CAAC,YAAY,CAAA,EAAG,MAAM,CAAC,IAAI,CAAA,CAAE,CAAC;QACpD;AACA,QAAA,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;AACxB,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;AACxB,IAAA,CAAC;SACA,IAAI,CAAC,IAAI,CAAC;AACf;AAEA;AACA;;;;;;;;;;;AAWE;;MCxGW,gBAAgB,CAAA;IACR,QAAQ,GAAG,KAAK,CAAC,EAAE;iFAAC;IAC9B,cAAc,GAAG,KAAK,CAAC,QAAQ;uFAAa;IAE7C,iBAAiB,GAAY,EAAE;IAC9B,YAAY,GAAG,MAAM,EAAa;AAE3C,IAAA,OAAO;AACP,IAAA,cAAc;IACd,MAAM,GAA6B,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACjD,CAAC,GAAG,MAAM,CAAC,CAAC;0EAAC;IACb,CAAC,GAAG,MAAM,CAAC,CAAC;0EAAC;IACb,UAAU,GAAG,KAAK;AACmB,IAAA,GAAG;AACI,IAAA,UAAU;IAE9C,MAAM,GAAW,CAAC;IAE1B,QAAQ,GAAA;QACN,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QAC3C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ;IACzD;AAEA,IAAA,UAAU,CAAC,EAA2B,EAAA;AACpC,QAAA,MAAM,QAAQ,GAAG,iBAAiB,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;AAC9D,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;IAC/B;AAEA,IAAA,SAAS,CAAC,EAA2B,EAAA;QACnC,EAAE,CAAC,eAAe,EAAE;QACpB,EAAE,CAAC,cAAc,EAAE;QACnB,IAAI,CAAC,yBAAyB,EAAE;AAChC,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,QAAA,MAAM,QAAQ,GAAG,iBAAiB,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;AAC9D,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;IAC/B;AAIA,IAAA,SAAS,CAAC,EAA2B,EAAA;AACnC,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;IACzB;AAIA,IAAA,WAAW,CAAC,EAA2B,EAAA;QACrC,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;AACtB,QAAA,MAAM,QAAQ,GAAG,iBAAiB,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;AAC9D,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;IAC/B;AAEQ,IAAA,cAAc,CAAC,QAAkC,EAAA;AACvD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAQ;AAC5B,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,cAAe;AAE1C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;AAC7B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;AAE7B,QAAA,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,OAAO;AAC/B,QAAA,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,OAAO;;QAG/B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC;AACnC,QAAA,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,GAAG,CAAC;QACpC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,GAAG,CAAC;AACnD,QAAA,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC;AACrD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC3D,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;;AAG3D,QAAA,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC;AAC9C,QAAA,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;;AAG/C,QAAA,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,IAAI,CAAC;AAC3D,QAAA,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,IAAI,CAAC;AAE7D,QAAA,IAAI,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,UAAU,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjD,QAAA,IAAI,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,UAAU,IAAI,IAAI,CAAC,QAAQ,EAAE;AAEjD,QAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;AAClF,QAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;;QAGlF,MAAM,QAAQ,GAAG,QAAQ,IAAI,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;AAC3C,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE;AACjC,YAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,CAAA,OAAA,EAAU,QAAQ,GAAG,GAAG,MAAM;QAChF;;AAGA,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;YACtB,GAAG,IAAI,CAAC,cAAc,EAAE;AACxB,YAAA,OAAO,EAAE,MAAM;AACf,YAAA,OAAO,EAAE,MAAM;AAChB,SAAA,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1C;IAEQ,yBAAyB,GAAA;QAC/B,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,IAAI,CAAC,GAAG;gBAAE;YACf,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,qBAAqB,EAAE;YAC7D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,qBAAqB,EAAE;YAC3E,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AACvE,YAAA,IAAI,CAAC,MAAM;gBACT,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,GAAG,CAAC;YACvF,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACd,YAAA,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACf,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,YAAY,CAAC,aAAiC,EAAA;AAC5C,QAAA,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ,GAAG,oBAAoB,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE;YAC5D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QAC/C;IACF;AAEA,IAAA,eAAe,CAAC,IAAe,EAAA;QAC7B,IAAI,CAAC,yBAAyB,EAAE;QAChC,UAAU,CAAC,MAAK;AACd,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAQ;AAC5B,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,cAAe;AAC1C,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;AAC7B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;AAE7B,YAAA,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,IAAI,CAAC;AAC3D,YAAA,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,IAAI,CAAC;;AAG7D,YAAA,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,UAAU;AACzD,YAAA,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,UAAU;;AAGzD,YAAA,MAAM,IAAI,GAAG,OAAO,GAAG,EAAE;AACzB,YAAA,MAAM,IAAI,GAAG,OAAO,GAAG,EAAE;AAEzB,YAAA,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC;AAC1C,YAAA,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;;YAG3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,QAAQ,IAAI,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;AAC3C,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE;AACjC,gBAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,GAAG,CAAA,OAAA,EAAU,QAAQ,GAAG,GAAG,MAAM;YAChF;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,KAAK,KAAI;uGAxJE,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,KAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,KAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvB7B,6tKA6JA,EAAA,MAAA,EAAA,CAAA,6gFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDxIY,WAAW,ytDAAE,aAAa,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,YAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,wBAAA,EAAA,aAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAEzB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAN5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,OAAA,EAGrB,CAAC,WAAW,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,6tKAAA,EAAA,MAAA,EAAA,CAAA,6gFAAA,CAAA,EAAA;;sBAepC,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;;sBAClC,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;;sBAwBzC,YAAY;uBAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC;;sBAC3C,YAAY;uBAAC,mBAAmB,EAAE,CAAC,QAAQ,CAAC;;sBAK5C,YAAY;uBAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;;sBACpC,YAAY;uBAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;;;ME3B1B,YAAY,CAAA;IACJ,QAAQ,GAAG,KAAK,CAAC,EAAE;iFAAC;IACpB,YAAY,GAAG,MAAM,EAAU;AAElD,IAAA,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC;sFAAC;IAE1B,OAAO,GAAG,MAAM,CAAc,EAAE;gFAAC;IAEjC,MAAM,GAAG,EAAE;AACQ,IAAA,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;AACtB,IAAA,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;AACpB,IAAA,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;AAChC,IAAA,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAEnD,UAAU,GAAY,KAAK;AAC3B,IAAA,QAAQ,GAAG,CAAC,CAAS,KAAI,EAAE,CAAC;AAC5B,IAAA,SAAS,GAAG,MAAK,EAAE,CAAC;AAEpB,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;IAC9B;AACA,IAAA,WAAA,GAAA,EAAe;AACf,IAAA,QAAQ,KAAI;AACZ,IAAA,eAAe,KAAI;AACnB,IAAA,UAAU,CAAC,GAAW,EAAA;QACpB,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACpB,YAAA,IAAI,CAAC,MAAM,GAAG,EAAE;YAChB;QACF;QACA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;;;;IAIpD;AAEA,IAAA,SAAS,CAAC,SAAsB,EAAA;QAC9B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;AACzB,YAAA,GAAG,CAAC;AACJ,YAAA;AACE,gBAAA,OAAO,EAAE,CAAC;AACV,gBAAA,OAAO,EAAE,CAAC;AACV,gBAAA,UAAU,EAAE,EAAE;AACd,gBAAA,YAAY,EAAE,CAAC;AACf,gBAAA,KAAK,EAAE,oBAAoB;AAC3B,gBAAA,IAAI,EAAE,IAAI;AACV,gBAAA,KAAK,EAAE,KAAK;AACb,aAAA;AACF,SAAA,CAAC;QACF,IAAI,CAAC,MAAM,EAAE;QACb,UAAU,CAAC,MAAK;AACd,YAAA,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,YAAY;QAC9C,CAAC,EAAE,GAAG,CAAC;IACT;AAEA,IAAA,SAAS,CAAC,EAAe,EAAE,IAAe,EAAE,KAAa,EAAA;AACvD,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;AAChB,YAAA,SAAS,EAAE,gBAAgB;AAC3B,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,SAAS,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAI;AAC3B,gBAAA,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACvD,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC;gBAClD,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;oBACpC,IAAI,GAAG,CAAC;oBACR,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,KAAI;wBAC9B,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,IAAI;AACpC,wBAAA,OAAO,OAAO;AAChB,oBAAA,CAAC,CAAC;AACF,oBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;oBACxB,IAAI,CAAC,MAAM,EAAE;AACf,gBAAA,CAAC,CAAC;YACJ,CAAC;YACD,QAAQ,EAAE,MAAK;gBACb,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC5B,CAAC;AACF,SAAA,CAAC;IACJ;IAEA,YAAY,CAAC,EAAS,EAAE,KAAa,EAAA;QACnC,EAAE,CAAC,eAAe,EAAE;QAEpB,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,EAAE;IACf;IAEQ,MAAM,GAAA;QACZ,IAAI,CAAC,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvE,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IACrC;uGApGW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,SAAA,EATZ;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,YAAY,CAAC;AAC3C,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtCH,wgCAqBA,EAAA,MAAA,EAAA,CAAA,y6BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDUY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAUxB,YAAY,EAAA,UAAA,EAAA,CAAA;kBAfxB,SAAS;+BACE,gBAAgB,EAAA,UAAA,EAGd,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,WAAW,CAAC,EAAA,SAAA,EACzB;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,kBAAkB,CAAC;AAC3C,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;qBACF,EAAA,eAAA,EACgB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,wgCAAA,EAAA,MAAA,EAAA,CAAA,y6BAAA,CAAA,EAAA;;;AEvCjD;;AAEG;;;;"}
1
+ {"version":3,"file":"ngx-kit-box-shadow.mjs","sources":["../../../projects/libs/box-shadow/utils/box-shadow-parser.ts","../../../projects/libs/box-shadow/components/shadow-control/shadow-control.ts","../../../projects/libs/box-shadow/components/shadow-control/shadow-control.html","../../../projects/libs/box-shadow/components/shadow-list/box-shadow.ts","../../../projects/libs/box-shadow/components/shadow-list/box-shadow.html","../../../projects/libs/box-shadow/ngx-kit-box-shadow.ts"],"sourcesContent":["import { extractCssColors } from 'ngx-kit/core';\nimport { BoxShadow } from '../contracts/BoxShadowValue';\n\nexport function parseBoxShadow(cssValue: string): BoxShadow[] {\n if (!cssValue || typeof cssValue !== 'string') {\n return [];\n }\n // Split multiple shadows by comma\n const shadows = cssValue\n .split(/,(?![^\\(]*\\))/)\n .map((shadow) => shadow.trim())\n .filter((shadow) => shadow);\n\n const boxShadows: BoxShadow[] = [];\n const unitRegex = /(px|rem|em)/;\n const numberRegex = /-?\\d*\\.?\\d*(?:px|rem|em)?/g;\n\n for (const shadow of shadows) {\n const boxShadow: BoxShadow = {\n xOffset: 0,\n yOffset: 0,\n color: 'rgba(0, 0, 0, 0)', // Default color\n unit: 'px', // Default unit\n cssValue: '',\n };\n\n // Check for inset\n boxShadow.inset = shadow.includes('inset');\n\n // Extract color\n const colorMatch = extractCssColors(shadow);\n if (colorMatch) {\n boxShadow.color = colorMatch[0];\n }\n\n // Remove inset and color to parse numbers\n let numberString = shadow.replace('inset', '').replace(boxShadow.color, '').trim();\n\n // Extract numbers\n const numbers = (numberString.match(numberRegex) ?? [])\n .map((shadow) => shadow.trim())\n .filter((shadow) => shadow);\n if (!numbers) continue;\n\n // Parse numbers\n for (let i = 0; i < numbers.length; i++) {\n const num = parseFloat(numbers[i]);\n const unit = numbers[i].match(unitRegex)?.[0] || 'px';\n boxShadow.unit = unit; // Update unit based on first detected unit\n\n if (i === 0) {\n boxShadow.xOffset = isNaN(num) ? 0 : num;\n } else if (i === 1) {\n boxShadow.yOffset = isNaN(num) ? 0 : num;\n } else if (i === 2) {\n boxShadow.blurRadius = isNaN(num) ? 0 : Math.max(0, num); // Blur can't be negative\n } else if (i === 3) {\n boxShadow.spreadRadius = isNaN(num) ? 0 : num;\n }\n }\n boxShadow.cssValue = shadow;\n boxShadows.push(boxShadow);\n }\n\n return boxShadows;\n}\n\n// Utility to validate and format color\nexport function validateColor(color: string): string {\n const hexRegex = /^#[0-9a-fA-F]{3,8}$/;\n const rgbRegex = /^rgba?\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*(,\\s*[\\d.]+)?\\)$/;\n const hslRegex = /^hsl\\(\\s*\\d+\\s*,\\s*\\d+%\\s*,\\s*\\d+%\\s*\\)$/;\n const namedColors = [\n 'black',\n 'white',\n 'red',\n 'blue',\n 'green',\n 'yellow',\n 'purple',\n 'orange',\n // Add more named colors as needed\n ];\n\n color = color.trim();\n if (hexRegex.test(color) || rgbRegex.test(color) || hslRegex.test(color)) {\n return color;\n }\n if (namedColors.includes(color.toLowerCase())) {\n return color.toLowerCase();\n }\n return 'rgba(0, 0, 0, 0)'; // Fallback to transparent\n}\n\n// Utility to format BoxShadow back to CSS string\nexport function formatBoxShadowToCSS(shadows: BoxShadow[]): string {\n return shadows\n .map((shadow) => {\n const parts: string[] = [];\n if (shadow.inset) {\n parts.push('inset');\n }\n parts.push(`${shadow.xOffset}${shadow.unit}`, `${shadow.yOffset}${shadow.unit}`);\n if (shadow.blurRadius !== undefined) {\n parts.push(`${shadow.blurRadius}${shadow.unit}`);\n }\n if (shadow.spreadRadius !== undefined) {\n parts.push(`${shadow.spreadRadius}${shadow.unit}`);\n }\n parts.push(shadow.color);\n return parts.join(' ');\n })\n .join(', ');\n}\n\n// Example usage:\n/*\nconst css = \"10px 20px 5px 0px rgba(0, 0, 0, 0.5), inset -10px -20px 10px #ff0000\";\nconst parsed = parseBoxShadow(css);\nconsole.log(parsed);\n// Output: [\n// { xOffset: 10, yOffset: 20, blurRadius: 5, spreadRadius: 0, color: \"rgba(0, 0, 0, 0.5)\", unit: \"px\" },\n// { inset: true, xOffset: -10, yOffset: -20, blurRadius: 10, color: \"#ff0000\", unit: \"px\" }\n// ]\nconst cssString = formatBoxShadowToCSS(parsed);\nconsole.log(cssString);\n// Output: \"10px 20px 5px 0px rgba(0, 0, 0, 0.5), inset -10px -20px 10px #ff0000\"\n*/\n","import {\n Component,\n HostListener,\n input,\n model,\n output,\n signal,\n ViewChild,\n ElementRef,\n OnInit,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { BoxShadow } from '../../contracts/BoxShadowValue';\nimport { NgxInputColor } from 'ngx-kit/color-picker';\nimport { formatBoxShadowToCSS } from '../../utils/box-shadow-parser';\nimport { getOffsetPosition } from 'ngx-kit/core';\n\n@Component({\n selector: 'ngx-shadow-control',\n templateUrl: './shadow-control.html',\n styleUrl: './shadow-control.scss',\n imports: [FormsModule, NgxInputColor],\n})\nexport class NgxShadowControl implements OnInit {\n protected readonly maxRange = input(25);\n readonly selectedShadow = model.required<BoxShadow>();\n\n private _previousCssValue?: string = '';\n readonly shadowChange = output<BoxShadow>();\n\n padRect?: DOMRect;\n flashlightRect?: DOMRect;\n center: { x: number; y: number } = { x: 0, y: 0 };\n x = signal(0);\n y = signal(0);\n isDragging = false;\n @ViewChild('pad', { static: false }) pad!: ElementRef<HTMLDivElement>;\n @ViewChild('flashlight', { static: false }) flashlight!: ElementRef<SVGSVGElement>;\n\n private radius: number = 0;\n\n ngOnInit(): void {\n this.setXyFromShadow(this.selectedShadow());\n this._previousCssValue = this.selectedShadow().cssValue;\n }\n\n onPadClick(ev: MouseEvent | TouchEvent) {\n const position = getOffsetPosition(ev, this.pad.nativeElement);\n this.isDragging = true;\n this.updatePosition(position);\n }\n\n dragStart(ev: MouseEvent | TouchEvent) {\n ev.stopPropagation();\n ev.preventDefault();\n this.updateContainerDimensions();\n this.isDragging = true;\n const position = getOffsetPosition(ev, this.pad.nativeElement);\n this.updatePosition(position);\n }\n\n @HostListener('document:mouseup', ['$event'])\n @HostListener('document:touchend', ['$event'])\n onDragEnd(ev: MouseEvent | TouchEvent) {\n this.isDragging = false;\n }\n\n @HostListener('mousemove', ['$event'])\n @HostListener('touchmove', ['$event'])\n onMouseMove(ev: MouseEvent | TouchEvent) {\n if (!this.isDragging) return;\n const position = getOffsetPosition(ev, this.pad.nativeElement);\n this.updatePosition(position);\n }\n\n private updatePosition(position: { x: number; y: number }) {\n const padRec = this.padRect!;\n const flashlightRec = this.flashlightRect!;\n\n const centerX = this.center.x;\n const centerY = this.center.y;\n\n const dx = position.x - centerX;\n const dy = position.y - centerY;\n\n // زاویه\n const angleRad = Math.atan2(dy, dx);\n const minX = flashlightRec.width / 2;\n const maxX = padRec.width - flashlightRec.width / 2;\n const minY = flashlightRec.height / 2;\n const maxY = padRec.height - flashlightRec.height / 2;\n const clampedX = Math.max(minX, Math.min(position.x, maxX));\n const clampedY = Math.max(minY, Math.min(position.y, maxY));\n\n // فقط یکبار از وسط اصلاح کن\n this.x.set(clampedX - flashlightRec.width / 2);\n this.y.set(clampedY - flashlightRec.height / 2);\n\n // ✅ ولی مقدار واقعی shadow رو از موقعیت موس (dx, dy) بگیر\n const halfRangeX = (padRec.width - flashlightRec.width) / 2;\n const halfRangeY = (padRec.height - flashlightRec.height) / 2;\n\n let valueX = (-dx / halfRangeX) * this.maxRange();\n let valueY = (-dy / halfRangeY) * this.maxRange();\n\n valueX = Math.round(Math.min(Math.max(valueX, -this.maxRange()), this.maxRange()));\n valueY = Math.round(Math.min(Math.max(valueY, -this.maxRange()), this.maxRange()));\n\n // چرخش چراغ قوه\n const angleDeg = angleRad * (180 / Math.PI);\n if (this.flashlight.nativeElement) {\n this.flashlight.nativeElement.style.transform = `rotate(${angleDeg + 180}deg)`;\n }\n\n // آپدیت shadow\n this.selectedShadow.set({\n ...this.selectedShadow(),\n xOffset: valueX,\n yOffset: valueY,\n });\n this.updateShadow(this.selectedShadow());\n }\n\n private updateContainerDimensions() {\n setTimeout(() => {\n if (!this.pad) return;\n this.padRect = this.pad.nativeElement.getBoundingClientRect();\n this.flashlightRect = this.flashlight.nativeElement.getBoundingClientRect();\n this.center = { x: this.padRect.width / 2, y: this.padRect.height / 2 };\n this.radius =\n Math.min(this.padRect.width, this.padRect.height) / 2 - this.flashlightRect.width / 2;\n this.x.set(0); // Reset to center\n this.y.set(0);\n });\n }\n\n updateShadow(updatedShadow: Partial<BoxShadow>) {\n this.selectedShadow().cssValue = formatBoxShadowToCSS([this.selectedShadow()]);\n this.setXyFromShadow(this.selectedShadow());\n if (this._previousCssValue != this.selectedShadow().cssValue) {\n this.shadowChange.emit(this.selectedShadow());\n }\n }\n\n setXyFromShadow(item: BoxShadow) {\n this.updateContainerDimensions();\n setTimeout(() => {\n const padRec = this.padRect!;\n const flashlightRec = this.flashlightRect!;\n const centerX = this.center.x;\n const centerY = this.center.y;\n\n const halfRangeX = (padRec.width - flashlightRec.width) / 2;\n const halfRangeY = (padRec.height - flashlightRec.height) / 2;\n\n // معکوس فرمول برای به‌دست آوردن dx , dy\n const dx = -(item.xOffset / this.maxRange()) * halfRangeX;\n const dy = -(item.yOffset / this.maxRange()) * halfRangeY;\n\n // موقعیت واقعی چراغ‌قوه\n const posX = centerX + dx;\n const posY = centerY + dy;\n\n this.x.set(posX - flashlightRec.width / 2);\n this.y.set(posY - flashlightRec.height / 2);\n\n // زاویه چراغ‌قوه\n const angleRad = Math.atan2(dy, dx);\n const angleDeg = angleRad * (180 / Math.PI);\n if (this.flashlight.nativeElement) {\n this.flashlight.nativeElement.style.transform = `rotate(${angleDeg + 180}deg)`;\n }\n });\n }\n\n close() {}\n}\n","<div class=\"ngx-shadow-control\">\n <div\n class=\"pad-container\"\n #pad\n (mousedown)=\"onPadClick($event)\"\n (touchstart)=\"onPadClick($event)\">\n <div class=\"card-sample\" [style.boxShadow]=\"selectedShadow().cssValue\"></div>\n <svg\n class=\"flashlight-svg\"\n viewBox=\"0 0 640 512\"\n xmlns=\"http://www.w3.org/2000/svg\"\n #flashlight\n [style.left.px]=\"x()\"\n [style.top.px]=\"y()\"\n (mousedown)=\"dragStart($event)\"\n (touchstart)=\"dragStart($event)\">\n <defs>\n <style>\n .fa-secondary {\n opacity: 0.4;\n }\n </style>\n </defs>\n <path\n class=\"fa-primary\"\n d=\"M607.1 96h-32v320h32c17.62 0 32-14.38 32-32V128C639.1 110.4 625.6 96 607.1 96zM287.1 224h-32c-17.62 0-32 14.38-32 32s14.38 32 32 32h32c17.62 0 32-14.38 32-32S305.6 224 287.1 224z\" />\n <path\n class=\"fa-secondary\"\n d=\"M400.1 149.2L383.1 160H31.1c-17.62 0-32 14.38-32 32v128c0 17.62 14.38 32 32 32h352l16.12 10.75C443.2 391.5 511.1 416 575.1 416V96C511.1 96 443.2 120.5 400.1 149.2zM287.1 288h-32c-17.62 0-32-14.38-32-32s14.38-32 32-32h32c17.62 0 32 14.38 32 32S305.6 288 287.1 288z\" />\n </svg>\n </div>\n <div class=\"pi-btn-group\" role=\"group\">\n <input\n type=\"radio\"\n class=\"btn-check\"\n name=\"showside\"\n id=\"SHoutside\"\n autocomplete=\"off\"\n [(ngModel)]=\"selectedShadow().inset\"\n (ngModelChange)=\"updateShadow({ inset: selectedShadow().inset })\"\n [value]=\"false\" />\n <label class=\"button\" for=\"SHoutside\" title=\"Outside\">Outside</label>\n <input\n type=\"radio\"\n class=\"btn-check\"\n name=\"showside\"\n id=\"SHinside\"\n autocomplete=\"off\"\n [(ngModel)]=\"selectedShadow().inset\"\n (ngModelChange)=\"updateShadow({ inset: selectedShadow().inset })\"\n [value]=\"true\" />\n <label class=\"button\" for=\"SHinside\" title=\"Inside\">Inside</label>\n </div>\n <div class=\"shadow-item\">\n <table>\n <tr>\n <th>\n <span>X</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().xOffset\"\n (ngModelChange)=\"updateShadow({ xOffset: selectedShadow().xOffset })\" />\n <input\n type=\"number\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().xOffset\"\n (ngModelChange)=\"updateShadow({ xOffset: selectedShadow().xOffset })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Y</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().yOffset\"\n (ngModelChange)=\"updateShadow({ yOffset: selectedShadow().yOffset })\" />\n <input\n type=\"number\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().yOffset\"\n (ngModelChange)=\"updateShadow({ yOffset: selectedShadow().yOffset })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Blur</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().blurRadius\"\n min=\"0\"\n (ngModelChange)=\"updateShadow({ blurRadius: selectedShadow().blurRadius })\" />\n <input\n type=\"number\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().blurRadius\"\n min=\"0\"\n (ngModelChange)=\"updateShadow({ blurRadius: selectedShadow().blurRadius })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Spread</span>\n </th>\n <td>\n <div class=\"d-flex\">\n <input\n type=\"range\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().spreadRadius\"\n (ngModelChange)=\"updateShadow({ spreadRadius: selectedShadow().spreadRadius })\" />\n <input\n type=\"number\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().spreadRadius\"\n (ngModelChange)=\"updateShadow({ spreadRadius: selectedShadow().spreadRadius })\" />\n </div>\n </td>\n </tr>\n <tr>\n <th>\n <span>Color</span>\n </th>\n <td>\n <input\n type=\"text\"\n [(ngModel)]=\"selectedShadow().color\"\n (ngModelChange)=\"updateShadow({ color: selectedShadow().color })\"\n ngxInputColor\n [simpleMode]=\"true\" />\n </td>\n </tr>\n </table>\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DOCUMENT,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostListener,\n inject,\n input,\n Input,\n OnInit,\n output,\n Output,\n signal,\n ViewChild,\n} from '@angular/core';\nimport { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { formatBoxShadowToCSS, parseBoxShadow, validateColor } from '../../utils/box-shadow-parser';\nimport { getOffsetPosition, OverlayService, WINDOW } from 'ngx-kit/core';\nimport { BoxShadow } from '../../contracts/BoxShadowValue';\nimport { NgxShadowControl } from '../shadow-control/shadow-control';\n\n@Component({\n selector: 'ngx-box-shadow',\n templateUrl: './box-shadow.html',\n styleUrls: ['./box-shadow.scss'],\n standalone: true,\n imports: [CommonModule, FormsModule],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NgxShadowBox),\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxShadowBox implements OnInit, AfterViewInit {\n protected readonly maxRange = input(25);\n protected readonly shadowChange = output<string>();\n\n selectedIndex = signal(-1);\n\n shadows = signal<BoxShadow[]>([]);\n\n result = '';\n protected readonly doc = inject(DOCUMENT);\n protected readonly win = inject(WINDOW);\n protected readonly overlay = inject(OverlayService);\n protected readonly chdr = inject(ChangeDetectorRef);\n\n isDisabled: boolean = false;\n onChange = (_: string) => {};\n onTouched = () => {};\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled = isDisabled;\n }\n constructor() {}\n ngOnInit() {}\n ngAfterViewInit() {}\n writeValue(val: string): void {\n if (!val) {\n this.shadows.set([]);\n this.result = '';\n return;\n }\n this.shadows.set(parseBoxShadow(val));\n this.result = formatBoxShadowToCSS(this.shadows());\n // if (val !== this.result) {\n // this.update();\n // }\n }\n\n addShadow(container: HTMLElement) {\n this.shadows.update((u) => [\n ...u,\n {\n xOffset: 0,\n yOffset: 0,\n blurRadius: 10,\n spreadRadius: 0,\n color: 'rgba(0, 0, 0, 0.5)',\n unit: 'px',\n inset: false,\n },\n ]);\n this.update();\n setTimeout(() => {\n container.scrollTop = container.scrollHeight;\n }, 100);\n }\n\n setShadow(el: HTMLElement, item: BoxShadow, index: number) {\n this.selectedIndex.set(index);\n this.overlay.open({\n component: NgxShadowControl,\n anchor: el,\n configure: (instance, ref) => {\n ref.componentRef?.setInput('maxRange', this.maxRange());\n ref.componentRef?.setInput('selectedShadow', item);\n instance.shadowChange.subscribe((v) => {\n item = v;\n this.shadows.update((shadows) => {\n shadows[this.selectedIndex()] = item;\n return shadows;\n });\n this.chdr.markForCheck();\n this.update();\n });\n },\n onClosed: () => {\n this.selectedIndex.set(-1);\n },\n });\n }\n\n removeShadow(ev: Event, index: number) {\n ev.stopPropagation();\n\n this.shadows().splice(index, 1);\n this.update();\n }\n\n private update() {\n this.result = formatBoxShadowToCSS(this.shadows());\n this.shadows().forEach((m) => (m.cssValue = formatBoxShadowToCSS([m])));\n this.onChange(this.result);\n this.shadowChange.emit(this.result);\n }\n}\n","<div class=\"\">\n <button (click)=\"addShadow(list)\" type=\"button\" class=\"action-btn add-btn\">Add</button>\n</div>\n<div class=\"list-box\" #list>\n @for (item of shadows(); let i = $index; track i) {\n <button\n type=\"button\"\n class=\"list-item\"\n [class.active]=\"i == selectedIndex()\"\n #el\n (click)=\"setShadow(el, item, i)\">\n <span>{{ item.cssValue }}</span>\n <button (click)=\"removeShadow($event, i)\" type=\"button\" class=\"action-btn\">\n <svg fill=\"currentColor\" viewBox=\"0 0 320 512\">\n <path\n d=\"M315.3 411.3c-6.253 6.253-16.37 6.253-22.63 0L160 278.6l-132.7 132.7c-6.253 6.253-16.37 6.253-22.63 0c-6.253-6.253-6.253-16.37 0-22.63L137.4 256L4.69 123.3c-6.253-6.253-6.253-16.37 0-22.63c6.253-6.253 16.37-6.253 22.63 0L160 233.4l132.7-132.7c6.253-6.253 16.37-6.253 22.63 0c6.253 6.253 6.253 16.37 0 22.63L182.6 256l132.7 132.7C321.6 394.9 321.6 405.1 315.3 411.3z\" />\n </svg>\n </button>\n </button>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -2230,9 +2230,9 @@ class NgxCalendarComponent extends NgxDatePickerBase {
2230
2230
  this._config = { ...new NgxDatePickerConfig(), ...val };
2231
2231
  }
2232
2232
  set locale(val) {
2233
- this._locale = val;
2233
+ this._locale = val || 'en';
2234
2234
  this.adapter = this.dateAdapterRegistry.resolve(this._locale);
2235
- if (this.currYear !== undefined)
2235
+ if (this.currYear() !== undefined)
2236
2236
  this.syncAnchorToLocale();
2237
2237
  this.renderCalendar(this.view);
2238
2238
  }
@@ -2254,7 +2254,7 @@ class NgxCalendarComponent extends NgxDatePickerBase {
2254
2254
  _events = [];
2255
2255
  set events(val) {
2256
2256
  this._events = Array.isArray(val) ? val : [];
2257
- if (this.anchorDate)
2257
+ if (this.anchorDate())
2258
2258
  this.renderCalendar(this.view);
2259
2259
  }
2260
2260
  get events() {
@@ -2266,7 +2266,8 @@ class NgxCalendarComponent extends NgxDatePickerBase {
2266
2266
  eventsChange = new EventEmitter();
2267
2267
  selected;
2268
2268
  // Todo: change to signal
2269
- anchorDate;
2269
+ anchorDate = signal(undefined, /* @ts-ignore */
2270
+ ...(ngDevMode ? [{ debugName: "anchorDate" }] : /* istanbul ignore next */ []));
2270
2271
  eventViewItems = [];
2271
2272
  monthEventSegments = [];
2272
2273
  monthEventRows = Array.from({ length: MONTH_ROW_COUNT }, () => []);
@@ -2285,9 +2286,7 @@ class NgxCalendarComponent extends NgxDatePickerBase {
2285
2286
  ngOnInit() {
2286
2287
  this.months = this.adapter.longMonths;
2287
2288
  this.weeks = this.adapter.longDays;
2288
- this.anchorDate = this.selected
2289
- ? new Date(this.selected)
2290
- : this.adapter.getDate(this.adapter.today());
2289
+ this.anchorDate.set(this.selected ? new Date(this.selected) : this.adapter.getDate(this.adapter.today()));
2291
2290
  this.syncAnchorToLocale();
2292
2291
  this.renderCalendar(this.view);
2293
2292
  }
@@ -2315,7 +2314,7 @@ class NgxCalendarComponent extends NgxDatePickerBase {
2315
2314
  this.weeks = fullWidth <= 500 ? this.adapter.shortDays : this.adapter.longDays;
2316
2315
  }
2317
2316
  renderCalendar(view) {
2318
- if (!this.anchorDate)
2317
+ if (!this.anchorDate())
2319
2318
  return;
2320
2319
  this.syncAnchorToLocale();
2321
2320
  switch (view) {
@@ -2338,15 +2337,19 @@ class NgxCalendarComponent extends NgxDatePickerBase {
2338
2337
  return this._events;
2339
2338
  }
2340
2339
  syncAnchorToLocale() {
2341
- const localeDate = this.adapter.toLocale(this.anchorDate);
2340
+ if (!this.anchorDate())
2341
+ return;
2342
+ const localeDate = this.adapter.toLocale(this.anchorDate());
2342
2343
  this.currYear.set(localeDate.year);
2343
2344
  this.currMonth.set(localeDate.month ?? 0);
2344
2345
  this.months = this.adapter.longMonths;
2345
2346
  this.weeks = this.adapter.longDays;
2346
2347
  }
2347
2348
  renderTimedView() {
2348
- const dates = this.getWeekDates(this.anchorDate);
2349
- const visibleDates = this.view === 'day' ? [new Date(this.startOfDay(this.anchorDate))] : dates;
2349
+ if (!this.anchorDate())
2350
+ return;
2351
+ const dates = this.getWeekDates(this.anchorDate());
2352
+ const visibleDates = this.view === 'day' ? [new Date(this.startOfDay(this.anchorDate()))] : dates;
2350
2353
  this.weekDays = visibleDates.map((date, column) => ({
2351
2354
  date,
2352
2355
  label: this.adapter.formatDate(this.adapter.toLocale(date), 'full') ?? '',
@@ -2568,16 +2571,16 @@ class NgxCalendarComponent extends NgxDatePickerBase {
2568
2571
  .sort((a, b) => a.start.getTime() - b.start.getTime());
2569
2572
  }
2570
2573
  get headerText() {
2571
- if (!this.anchorDate)
2574
+ if (!this.anchorDate())
2572
2575
  return '';
2573
2576
  if (this.view === 'day') {
2574
- return this.adapter.formatDate(this.adapter.toLocale(this.anchorDate), 'full') ?? '';
2577
+ return this.adapter.formatDate(this.adapter.toLocale(this.anchorDate()), 'full') ?? '';
2575
2578
  }
2576
2579
  if (this.view === 'week') {
2577
- const days = this.getWeekDates(this.anchorDate);
2580
+ const days = this.getWeekDates(this.anchorDate());
2578
2581
  return this.formatDateRange(days[0], days[6]);
2579
2582
  }
2580
- return `${this.displayMonth} ${this.currYear}`;
2583
+ return `${this.displayMonth()} ${this.currYear()}`;
2581
2584
  }
2582
2585
  formatDateRange(start, end) {
2583
2586
  const s = this.adapter.toLocale(start);
@@ -2601,8 +2604,8 @@ class NgxCalendarComponent extends NgxDatePickerBase {
2601
2604
  }
2602
2605
  gotoToday() {
2603
2606
  this.cancelEventInteraction();
2604
- this.anchorDate = this.adapter.getDate(this.adapter.today());
2605
- this.selected = new Date(this.anchorDate);
2607
+ this.anchorDate.set(this.adapter.getDate(this.adapter.today()));
2608
+ this.selected = new Date(this.anchorDate());
2606
2609
  this.syncAnchorToLocale();
2607
2610
  this.renderCalendar(this.view);
2608
2611
  }
@@ -2610,7 +2613,7 @@ class NgxCalendarComponent extends NgxDatePickerBase {
2610
2613
  ev.stopPropagation();
2611
2614
  if (item.active) {
2612
2615
  this.selected = item.date;
2613
- this.anchorDate = new Date(item.date);
2616
+ this.anchorDate.set(new Date(item.date));
2614
2617
  this.dateChange.emit(item);
2615
2618
  this.renderCalendar(this.view);
2616
2619
  }
@@ -2622,19 +2625,21 @@ class NgxCalendarComponent extends NgxDatePickerBase {
2622
2625
  this.navigate(-1);
2623
2626
  }
2624
2627
  navigate(direction) {
2625
- const d = new Date(this.anchorDate);
2628
+ if (!this.anchorDate())
2629
+ return;
2630
+ const d = new Date(this.anchorDate());
2626
2631
  if (this.view === 'month' || this.view === 'event') {
2627
2632
  const locale = this.adapter.toLocale(d);
2628
- this.anchorDate = this.adapter.getDate({
2633
+ this.anchorDate.set(this.adapter.getDate({
2629
2634
  locale: this._locale,
2630
2635
  year: locale.year,
2631
2636
  month: locale.month + direction,
2632
2637
  day: 1,
2633
- });
2638
+ }));
2634
2639
  }
2635
2640
  else {
2636
2641
  d.setDate(d.getDate() + direction * (this.view === 'week' ? 7 : 1));
2637
- this.anchorDate = d;
2642
+ this.anchorDate.set(d);
2638
2643
  }
2639
2644
  this.syncAnchorToLocale();
2640
2645
  this.renderCalendar(this.view);