ngx-kit 7.3.2 → 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.
- package/fesm2022/ngx-kit-box-shadow.mjs +2 -2
- package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
- package/fesm2022/ngx-kit-date-picker.mjs +27 -22
- package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
- package/fesm2022/ngx-kit-dialog.mjs +6 -5
- package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
- package/fesm2022/ngx-kit-dropzone.mjs +5 -5
- package/fesm2022/ngx-kit-dropzone.mjs.map +1 -1
- package/fesm2022/ngx-kit-image-editor.mjs +14 -26
- package/fesm2022/ngx-kit-image-editor.mjs.map +1 -1
- package/fesm2022/ngx-kit-media-control-mse-media-engine-CtP97cb9.mjs +326 -0
- package/fesm2022/ngx-kit-media-control-mse-media-engine-CtP97cb9.mjs.map +1 -0
- package/fesm2022/ngx-kit-media-control.mjs +1847 -0
- package/fesm2022/ngx-kit-media-control.mjs.map +1 -0
- package/media-control/README.md +349 -0
- package/package.json +5 -1
- package/types/ngx-kit-date-picker.d.ts +1 -1
- package/types/ngx-kit-dialog.d.ts +1 -2
- package/types/ngx-kit-dropzone.d.ts +4 -4
- package/types/ngx-kit-image-editor.d.ts +10 -27
- package/types/ngx-kit-media-control.d.ts +671 -0
|
@@ -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-
|
|
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":"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"}
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
2349
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
2642
|
+
this.anchorDate.set(d);
|
|
2638
2643
|
}
|
|
2639
2644
|
this.syncAnchorToLocale();
|
|
2640
2645
|
this.renderCalendar(this.view);
|