ngx-kit 8.2.0 → 8.3.1
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 +23 -4
- package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
- package/fesm2022/ngx-kit-color-picker.mjs +78 -62
- package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
- package/fesm2022/ngx-kit-core.mjs +4 -4
- package/fesm2022/ngx-kit-core.mjs.map +1 -1
- package/fesm2022/ngx-kit-gradient-picker.mjs +143 -133
- package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
- package/gradient-picker/README.md +1 -1
- package/package.json +1 -1
- package/types/ngx-kit-box-shadow.d.ts +2 -1
- package/types/ngx-kit-color-picker.d.ts +5 -8
- package/types/ngx-kit-gradient-picker.d.ts +16 -12
|
@@ -218,6 +218,10 @@ class NgxShadowControl {
|
|
|
218
218
|
this.y.set(0);
|
|
219
219
|
});
|
|
220
220
|
}
|
|
221
|
+
changeInset(val) {
|
|
222
|
+
this.selectedShadow.update((u) => ({ ...u, inset: val }));
|
|
223
|
+
this.updateShadow(this.selectedShadow());
|
|
224
|
+
}
|
|
221
225
|
updateShadow(updatedShadow) {
|
|
222
226
|
this.selectedShadow().cssValue = formatBoxShadowToCSS([this.selectedShadow()]);
|
|
223
227
|
this.setXyFromShadow(this.selectedShadow());
|
|
@@ -252,11 +256,11 @@ class NgxShadowControl {
|
|
|
252
256
|
}
|
|
253
257
|
close() { }
|
|
254
258
|
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-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"] }] });
|
|
259
|
+
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 class=\"tc-head\">\n <span class=\"tc-title\">Shadow</span>\n </div>\n\n <div\n class=\"pad-container\"\n #pad\n aria-hidden=\"true\"\n (mousedown)=\"onPadClick($event)\"\n (touchstart)=\"onPadClick($event)\">\n <div class=\"tc-stage-grid\"></div>\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\n <div class=\"inner\">\n <div class=\"ee-tabs\" role=\"tablist\" aria-label=\"Easing type\">\n <button\n type=\"button\"\n role=\"tab\"\n [class.on]=\"!selectedShadow().inset\"\n [attr.aria-selected]=\"!selectedShadow().inset\"\n (click)=\"changeInset(false)\">\n Outside\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n [class.on]=\"selectedShadow().inset\"\n [attr.aria-selected]=\"selectedShadow().inset\"\n (click)=\"changeInset(true)\">\n Inside\n </button>\n </div>\n\n <table>\n <tr>\n <th>\n <span>X</span>\n </th>\n <td>\n <input\n type=\"range\"\n class=\"kit-range\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().xOffset\"\n (ngModelChange)=\"updateShadow({ xOffset: selectedShadow().xOffset })\" />\n </td>\n <td>\n <input\n type=\"number\"\n class=\"kit-number\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().xOffset\"\n (ngModelChange)=\"updateShadow({ xOffset: selectedShadow().xOffset })\" />\n </td>\n </tr>\n <tr>\n <th>\n <span>Y</span>\n </th>\n <td>\n <input\n type=\"range\"\n class=\"kit-range\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().yOffset\"\n (ngModelChange)=\"updateShadow({ yOffset: selectedShadow().yOffset })\" />\n </td>\n <td>\n <input\n type=\"number\"\n class=\"kit-number\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().yOffset\"\n (ngModelChange)=\"updateShadow({ yOffset: selectedShadow().yOffset })\" />\n </td>\n </tr>\n <tr>\n <th>\n <span>Blur</span>\n </th>\n <td>\n <input\n type=\"range\"\n class=\"kit-range\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().blurRadius\"\n min=\"0\"\n (ngModelChange)=\"updateShadow({ blurRadius: selectedShadow().blurRadius })\" />\n </td>\n <td>\n <input\n type=\"number\"\n class=\"kit-number\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().blurRadius\"\n min=\"0\"\n (ngModelChange)=\"updateShadow({ blurRadius: selectedShadow().blurRadius })\" />\n </td>\n </tr>\n <tr>\n <th>\n <span>Spread</span>\n </th>\n <td>\n <input\n type=\"range\"\n class=\"kit-range\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().spreadRadius\"\n (ngModelChange)=\"updateShadow({ spreadRadius: selectedShadow().spreadRadius })\" />\n </td>\n <td>\n <input\n type=\"number\"\n class=\"kit-number\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().spreadRadius\"\n (ngModelChange)=\"updateShadow({ spreadRadius: selectedShadow().spreadRadius })\" />\n </td>\n </tr>\n <tr>\n <th>\n <span>Color</span>\n </th>\n <td>\n <input\n type=\"text\"\n class=\"kit-color\"\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)}.tc-head{display:flex;align-items:center;justify-content:space-between;margin:0;padding:5px 10px}.tc-title{font-weight:600;font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:light-dark(rgb(43,43,43),#a8a8b2)}.card-sample{border-radius:5px;width:50px;height:50px;background-color:#fff;z-index:1;border:1px #bbbbbb solid}.pad-container{position:relative;border-radius:6px;background:light-dark(#ffffff,#121214);border:1px solid light-dark(#aeb4bb,#34343a);overflow:hidden;width:100%;height:200px;box-sizing:border-box;direction:ltr;display:flex;align-items:center;justify-content:center}.pad-container .tc-stage-grid{position:absolute;inset:0;background:linear-gradient(light-dark(rgba(174,180,187,.3921568627),rgba(255,255,255,.0509803922)) 1px,transparent 1px) 0 0/16px 16px,linear-gradient(90deg,light-dark(rgba(174,180,187,.3921568627),rgba(255,255,255,.0509803922)) 1px,transparent 1px) 0 0/16px 16px}.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}.inner{padding:10px}table{width:100%;table-layout:fixed}table th{width:60px;font-size:12px;text-align:end;padding:4px}table td:last-child{width:50px}i,button{color:inherit}.kit-number{height:26px;border-radius:4px;background:light-dark(#ceced6,#2a2a30);border:1px solid transparent;overflow:hidden;outline:none;min-width:0;width:100%}.kit-number:focus{border-color:#4b8bff}.kit-range{display:block;width:100%;height:16px;margin:4px 0 0;cursor:pointer;appearance:none;-webkit-appearance:none;background:transparent}.kit-range::-webkit-slider-runnable-track{height:4px;border-radius:2px;background:light-dark(#dedee2,#46464f)}.kit-range::-moz-range-track{height:4px;border-radius:2px;background:light-dark(#dedee2,#46464f)}.kit-range::-webkit-slider-thumb{-webkit-appearance:none;width:12px;height:12px;margin-top:-4px;border-radius:50%;background:#4b8bff;border:2px solid light-dark(#dedee2,#1b1a1d);box-shadow:0 0 0 1px #4b8bff}.kit-range::-moz-range-thumb{width:10px;height:10px;border-radius:50%;background:#4b8bff;border:2px solid light-dark(#dedee2,#1b1a1d)}.kit-range:focus-visible{outline:2px solid #4b8bff;outline-offset:2px;border-radius:2px}.ee-tabs{display:flex;background:light-dark(#d5d5dd,#2a2a30);border-radius:5px;padding:2px;gap:2px;margin-bottom:8px}.ee-tabs button{all:unset;box-sizing:border-box;flex:1;text-align:center;padding:4px 8px;border-radius:4px;font-size:11px;color:#a8a8b2;cursor:pointer}.ee-tabs button:hover{color:#fff}.ee-tabs button.on{background:#4b8bff;color:#fff}.ee-tabs button:focus-visible{outline:2px solid #fff;outline-offset:-2px}.kit-color{outline:none;border:none;border-radius:4px;padding:2px 5px;min-width:0;width:100px;mix-blend-mode:color-burn}\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.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
260
|
}
|
|
257
261
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxShadowControl, decorators: [{
|
|
258
262
|
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=\"
|
|
263
|
+
args: [{ selector: 'ngx-shadow-control', imports: [FormsModule, NgxInputColor], template: "<div class=\"ngx-shadow-control\">\n <div class=\"tc-head\">\n <span class=\"tc-title\">Shadow</span>\n </div>\n\n <div\n class=\"pad-container\"\n #pad\n aria-hidden=\"true\"\n (mousedown)=\"onPadClick($event)\"\n (touchstart)=\"onPadClick($event)\">\n <div class=\"tc-stage-grid\"></div>\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\n <div class=\"inner\">\n <div class=\"ee-tabs\" role=\"tablist\" aria-label=\"Easing type\">\n <button\n type=\"button\"\n role=\"tab\"\n [class.on]=\"!selectedShadow().inset\"\n [attr.aria-selected]=\"!selectedShadow().inset\"\n (click)=\"changeInset(false)\">\n Outside\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n [class.on]=\"selectedShadow().inset\"\n [attr.aria-selected]=\"selectedShadow().inset\"\n (click)=\"changeInset(true)\">\n Inside\n </button>\n </div>\n\n <table>\n <tr>\n <th>\n <span>X</span>\n </th>\n <td>\n <input\n type=\"range\"\n class=\"kit-range\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().xOffset\"\n (ngModelChange)=\"updateShadow({ xOffset: selectedShadow().xOffset })\" />\n </td>\n <td>\n <input\n type=\"number\"\n class=\"kit-number\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().xOffset\"\n (ngModelChange)=\"updateShadow({ xOffset: selectedShadow().xOffset })\" />\n </td>\n </tr>\n <tr>\n <th>\n <span>Y</span>\n </th>\n <td>\n <input\n type=\"range\"\n class=\"kit-range\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().yOffset\"\n (ngModelChange)=\"updateShadow({ yOffset: selectedShadow().yOffset })\" />\n </td>\n <td>\n <input\n type=\"number\"\n class=\"kit-number\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().yOffset\"\n (ngModelChange)=\"updateShadow({ yOffset: selectedShadow().yOffset })\" />\n </td>\n </tr>\n <tr>\n <th>\n <span>Blur</span>\n </th>\n <td>\n <input\n type=\"range\"\n class=\"kit-range\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().blurRadius\"\n min=\"0\"\n (ngModelChange)=\"updateShadow({ blurRadius: selectedShadow().blurRadius })\" />\n </td>\n <td>\n <input\n type=\"number\"\n class=\"kit-number\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().blurRadius\"\n min=\"0\"\n (ngModelChange)=\"updateShadow({ blurRadius: selectedShadow().blurRadius })\" />\n </td>\n </tr>\n <tr>\n <th>\n <span>Spread</span>\n </th>\n <td>\n <input\n type=\"range\"\n class=\"kit-range\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().spreadRadius\"\n (ngModelChange)=\"updateShadow({ spreadRadius: selectedShadow().spreadRadius })\" />\n </td>\n <td>\n <input\n type=\"number\"\n class=\"kit-number\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().spreadRadius\"\n (ngModelChange)=\"updateShadow({ spreadRadius: selectedShadow().spreadRadius })\" />\n </td>\n </tr>\n <tr>\n <th>\n <span>Color</span>\n </th>\n <td>\n <input\n type=\"text\"\n class=\"kit-color\"\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)}.tc-head{display:flex;align-items:center;justify-content:space-between;margin:0;padding:5px 10px}.tc-title{font-weight:600;font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:light-dark(rgb(43,43,43),#a8a8b2)}.card-sample{border-radius:5px;width:50px;height:50px;background-color:#fff;z-index:1;border:1px #bbbbbb solid}.pad-container{position:relative;border-radius:6px;background:light-dark(#ffffff,#121214);border:1px solid light-dark(#aeb4bb,#34343a);overflow:hidden;width:100%;height:200px;box-sizing:border-box;direction:ltr;display:flex;align-items:center;justify-content:center}.pad-container .tc-stage-grid{position:absolute;inset:0;background:linear-gradient(light-dark(rgba(174,180,187,.3921568627),rgba(255,255,255,.0509803922)) 1px,transparent 1px) 0 0/16px 16px,linear-gradient(90deg,light-dark(rgba(174,180,187,.3921568627),rgba(255,255,255,.0509803922)) 1px,transparent 1px) 0 0/16px 16px}.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}.inner{padding:10px}table{width:100%;table-layout:fixed}table th{width:60px;font-size:12px;text-align:end;padding:4px}table td:last-child{width:50px}i,button{color:inherit}.kit-number{height:26px;border-radius:4px;background:light-dark(#ceced6,#2a2a30);border:1px solid transparent;overflow:hidden;outline:none;min-width:0;width:100%}.kit-number:focus{border-color:#4b8bff}.kit-range{display:block;width:100%;height:16px;margin:4px 0 0;cursor:pointer;appearance:none;-webkit-appearance:none;background:transparent}.kit-range::-webkit-slider-runnable-track{height:4px;border-radius:2px;background:light-dark(#dedee2,#46464f)}.kit-range::-moz-range-track{height:4px;border-radius:2px;background:light-dark(#dedee2,#46464f)}.kit-range::-webkit-slider-thumb{-webkit-appearance:none;width:12px;height:12px;margin-top:-4px;border-radius:50%;background:#4b8bff;border:2px solid light-dark(#dedee2,#1b1a1d);box-shadow:0 0 0 1px #4b8bff}.kit-range::-moz-range-thumb{width:10px;height:10px;border-radius:50%;background:#4b8bff;border:2px solid light-dark(#dedee2,#1b1a1d)}.kit-range:focus-visible{outline:2px solid #4b8bff;outline-offset:2px;border-radius:2px}.ee-tabs{display:flex;background:light-dark(#d5d5dd,#2a2a30);border-radius:5px;padding:2px;gap:2px;margin-bottom:8px}.ee-tabs button{all:unset;box-sizing:border-box;flex:1;text-align:center;padding:4px 8px;border-radius:4px;font-size:11px;color:#a8a8b2;cursor:pointer}.ee-tabs button:hover{color:#fff}.ee-tabs button.on{background:#4b8bff;color:#fff}.ee-tabs button:focus-visible{outline:2px solid #fff;outline-offset:-2px}.kit-color{outline:none;border:none;border-radius:4px;padding:2px 5px;min-width:0;width:100px;mix-blend-mode:color-burn}\n"] }]
|
|
260
264
|
}], 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
265
|
type: ViewChild,
|
|
262
266
|
args: ['pad', { static: false }]
|
|
@@ -340,6 +344,8 @@ class NgxShadowBox {
|
|
|
340
344
|
this.overlay.open({
|
|
341
345
|
component: NgxShadowControl,
|
|
342
346
|
anchor: el,
|
|
347
|
+
alignment: 'end',
|
|
348
|
+
placement: 'bottom',
|
|
343
349
|
configure: (instance, ref) => {
|
|
344
350
|
ref.componentRef?.setInput('maxRange', this.maxRange());
|
|
345
351
|
ref.componentRef?.setInput('selectedShadow', item);
|
|
@@ -363,6 +369,19 @@ class NgxShadowBox {
|
|
|
363
369
|
this.shadows().splice(index, 1);
|
|
364
370
|
this.update();
|
|
365
371
|
}
|
|
372
|
+
duplicate(ev, index) {
|
|
373
|
+
ev.stopPropagation();
|
|
374
|
+
const src = this.shadows()[index];
|
|
375
|
+
if (!src)
|
|
376
|
+
return;
|
|
377
|
+
const copy = Object.assign({}, src);
|
|
378
|
+
this.shadows.update((s) => {
|
|
379
|
+
const n = [...s];
|
|
380
|
+
n.splice(index + 1, 0, copy);
|
|
381
|
+
return n;
|
|
382
|
+
});
|
|
383
|
+
this.update();
|
|
384
|
+
}
|
|
366
385
|
update() {
|
|
367
386
|
this.result = formatBoxShadowToCSS(this.shadows());
|
|
368
387
|
this.shadows().forEach((m) => (m.cssValue = formatBoxShadowToCSS([m])));
|
|
@@ -376,7 +395,7 @@ class NgxShadowBox {
|
|
|
376
395
|
useExisting: forwardRef(() => NgxShadowBox),
|
|
377
396
|
multi: true,
|
|
378
397
|
},
|
|
379
|
-
], ngImport: i0, template: "<div class=\"\">\n <button (click)=\"addShadow(list)\" type=\"button\" class=\"
|
|
398
|
+
], ngImport: i0, template: "<div class=\"trc\">\n <div class=\"kit-head\">\n <span class=\"kit-title\">Shadow</span>\n <span class=\"kit-actions\">\n <button (click)=\"addShadow(list)\" type=\"button\" class=\"kit-add\">\n <svg viewBox=\"0 0 12 12\" width=\"11\" height=\"11\" aria-hidden=\"true\">\n <path\n d=\"M6 1v10M1 6h10\"\n stroke=\"currentColor\"\n stroke-width=\"1.7\"\n stroke-linecap=\"round\" />\n </svg>\n </button>\n </span>\n </div>\n <ul class=\"kit-list\" role=\"list\" #list>\n @for (item of shadows(); let i = $index; track i) {\n <li\n #row\n class=\"kit-row\"\n role=\"listitem\"\n tabindex=\"0\"\n [class.on]=\"i == selectedIndex()\"\n (click)=\"setShadow(row, item, i)\"\n (keydown.enter)=\"setShadow(row, item, i)\"\n (keydown.space)=\"$event.preventDefault(); setShadow(row, item, i)\">\n <span class=\"kit-text\">{{ item.cssValue }}</span>\n <span class=\"kit-ops\">\n <button\n type=\"button\"\n class=\"kit-icon\"\n title=\"Duplicate\"\n aria-label=\"Duplicate\"\n (click)=\"duplicate($event, i)\">\n \u29C9\n </button>\n <button\n type=\"button\"\n class=\"kit-icon del\"\n title=\"Remove\"\n aria-label=\"Remove\"\n (click)=\"removeShadow($event, i)\">\n \u2715\n </button>\n </span>\n </li>\n }\n </ul>\n</div>\n", styles: [".kit-head{display:flex;align-items:center;justify-content:space-between;margin:2px 0 8px}.kit-title{font-weight:600;font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:#a8a8b2}.kit-actions{display:inline-flex;align-items:center;gap:6px}.kit-add{all:unset;box-sizing:border-box;width:24px;height:24px;display:grid;place-items:center;border-radius:5px;background:light-dark(#4e4efc,#2a2a30);color:#c9c9d2;cursor:pointer}.kit-add:hover{background:#4b8bff;color:#fff}.kit-add:focus-visible{outline:2px solid #4b8bff}.kit-list{list-style:none;margin:0;padding:0;display:grid;gap:3px}.kit-row{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:38px;padding:4px 4px 4px 6px;border-radius:5px;background:light-dark(#f1f1f1,#26262c);border:1px solid transparent;cursor:pointer;transition:background .3s}.kit-row:hover{background:light-dark(#e0e0e4,#2f2f37)}.kit-row:hover .kit-ops{opacity:1}.kit-row:focus-visible{outline:2px solid #4b8bff}.kit-row.on{background:light-dark(#0099ff,#243153);border-color:#4b8bff}.kit-row.on .kit-ops{opacity:1}.kit-text{direction:ltr}.kit-ops{display:inline-flex;opacity:.6;transition:opacity .12s}.kit-icon{all:unset;box-sizing:border-box;width:22px;height:22px;display:grid;place-items:center;border-radius:4px;cursor:pointer;color:light-dark(#26262c,#c9c9d2);font-size:12px}.kit-icon:hover{background:light-dark(rgba(103,166,255,.7490196078),rgba(255,255,255,.1215686275));color:light-dark(#000,#fff)}.kit-icon.del:hover{background:#e5484da1}.kit-icon:focus-visible{outline:2px solid #4b8bff}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
380
399
|
}
|
|
381
400
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxShadowBox, decorators: [{
|
|
382
401
|
type: Component,
|
|
@@ -386,7 +405,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
|
|
|
386
405
|
useExisting: forwardRef(() => NgxShadowBox),
|
|
387
406
|
multi: true,
|
|
388
407
|
},
|
|
389
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"\">\n <button (click)=\"addShadow(list)\" type=\"button\" class=\"
|
|
408
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"trc\">\n <div class=\"kit-head\">\n <span class=\"kit-title\">Shadow</span>\n <span class=\"kit-actions\">\n <button (click)=\"addShadow(list)\" type=\"button\" class=\"kit-add\">\n <svg viewBox=\"0 0 12 12\" width=\"11\" height=\"11\" aria-hidden=\"true\">\n <path\n d=\"M6 1v10M1 6h10\"\n stroke=\"currentColor\"\n stroke-width=\"1.7\"\n stroke-linecap=\"round\" />\n </svg>\n </button>\n </span>\n </div>\n <ul class=\"kit-list\" role=\"list\" #list>\n @for (item of shadows(); let i = $index; track i) {\n <li\n #row\n class=\"kit-row\"\n role=\"listitem\"\n tabindex=\"0\"\n [class.on]=\"i == selectedIndex()\"\n (click)=\"setShadow(row, item, i)\"\n (keydown.enter)=\"setShadow(row, item, i)\"\n (keydown.space)=\"$event.preventDefault(); setShadow(row, item, i)\">\n <span class=\"kit-text\">{{ item.cssValue }}</span>\n <span class=\"kit-ops\">\n <button\n type=\"button\"\n class=\"kit-icon\"\n title=\"Duplicate\"\n aria-label=\"Duplicate\"\n (click)=\"duplicate($event, i)\">\n \u29C9\n </button>\n <button\n type=\"button\"\n class=\"kit-icon del\"\n title=\"Remove\"\n aria-label=\"Remove\"\n (click)=\"removeShadow($event, i)\">\n \u2715\n </button>\n </span>\n </li>\n }\n </ul>\n</div>\n", styles: [".kit-head{display:flex;align-items:center;justify-content:space-between;margin:2px 0 8px}.kit-title{font-weight:600;font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:#a8a8b2}.kit-actions{display:inline-flex;align-items:center;gap:6px}.kit-add{all:unset;box-sizing:border-box;width:24px;height:24px;display:grid;place-items:center;border-radius:5px;background:light-dark(#4e4efc,#2a2a30);color:#c9c9d2;cursor:pointer}.kit-add:hover{background:#4b8bff;color:#fff}.kit-add:focus-visible{outline:2px solid #4b8bff}.kit-list{list-style:none;margin:0;padding:0;display:grid;gap:3px}.kit-row{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:38px;padding:4px 4px 4px 6px;border-radius:5px;background:light-dark(#f1f1f1,#26262c);border:1px solid transparent;cursor:pointer;transition:background .3s}.kit-row:hover{background:light-dark(#e0e0e4,#2f2f37)}.kit-row:hover .kit-ops{opacity:1}.kit-row:focus-visible{outline:2px solid #4b8bff}.kit-row.on{background:light-dark(#0099ff,#243153);border-color:#4b8bff}.kit-row.on .kit-ops{opacity:1}.kit-text{direction:ltr}.kit-ops{display:inline-flex;opacity:.6;transition:opacity .12s}.kit-icon{all:unset;box-sizing:border-box;width:22px;height:22px;display:grid;place-items:center;border-radius:4px;cursor:pointer;color:light-dark(#26262c,#c9c9d2);font-size:12px}.kit-icon:hover{background:light-dark(rgba(103,166,255,.7490196078),rgba(255,255,255,.1215686275));color:light-dark(#000,#fff)}.kit-icon.del:hover{background:#e5484da1}.kit-icon:focus-visible{outline:2px solid #4b8bff}\n"] }]
|
|
390
409
|
}], ctorParameters: () => [], propDecorators: { maxRange: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxRange", required: false }] }], shadowChange: [{ type: i0.Output, args: ["shadowChange"] }] } });
|
|
391
410
|
|
|
392
411
|
/**
|
|
@@ -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 changeInset(val: boolean) {\n this.selectedShadow.update((u) => ({ ...u, inset: val }));\n this.updateShadow(this.selectedShadow());\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 class=\"tc-head\">\n <span class=\"tc-title\">Shadow</span>\n </div>\n\n <div\n class=\"pad-container\"\n #pad\n aria-hidden=\"true\"\n (mousedown)=\"onPadClick($event)\"\n (touchstart)=\"onPadClick($event)\">\n <div class=\"tc-stage-grid\"></div>\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\n <div class=\"inner\">\n <div class=\"ee-tabs\" role=\"tablist\" aria-label=\"Easing type\">\n <button\n type=\"button\"\n role=\"tab\"\n [class.on]=\"!selectedShadow().inset\"\n [attr.aria-selected]=\"!selectedShadow().inset\"\n (click)=\"changeInset(false)\">\n Outside\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n [class.on]=\"selectedShadow().inset\"\n [attr.aria-selected]=\"selectedShadow().inset\"\n (click)=\"changeInset(true)\">\n Inside\n </button>\n </div>\n\n <table>\n <tr>\n <th>\n <span>X</span>\n </th>\n <td>\n <input\n type=\"range\"\n class=\"kit-range\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().xOffset\"\n (ngModelChange)=\"updateShadow({ xOffset: selectedShadow().xOffset })\" />\n </td>\n <td>\n <input\n type=\"number\"\n class=\"kit-number\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().xOffset\"\n (ngModelChange)=\"updateShadow({ xOffset: selectedShadow().xOffset })\" />\n </td>\n </tr>\n <tr>\n <th>\n <span>Y</span>\n </th>\n <td>\n <input\n type=\"range\"\n class=\"kit-range\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().yOffset\"\n (ngModelChange)=\"updateShadow({ yOffset: selectedShadow().yOffset })\" />\n </td>\n <td>\n <input\n type=\"number\"\n class=\"kit-number\"\n [min]=\"-maxRange()\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().yOffset\"\n (ngModelChange)=\"updateShadow({ yOffset: selectedShadow().yOffset })\" />\n </td>\n </tr>\n <tr>\n <th>\n <span>Blur</span>\n </th>\n <td>\n <input\n type=\"range\"\n class=\"kit-range\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().blurRadius\"\n min=\"0\"\n (ngModelChange)=\"updateShadow({ blurRadius: selectedShadow().blurRadius })\" />\n </td>\n <td>\n <input\n type=\"number\"\n class=\"kit-number\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().blurRadius\"\n min=\"0\"\n (ngModelChange)=\"updateShadow({ blurRadius: selectedShadow().blurRadius })\" />\n </td>\n </tr>\n <tr>\n <th>\n <span>Spread</span>\n </th>\n <td>\n <input\n type=\"range\"\n class=\"kit-range\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().spreadRadius\"\n (ngModelChange)=\"updateShadow({ spreadRadius: selectedShadow().spreadRadius })\" />\n </td>\n <td>\n <input\n type=\"number\"\n class=\"kit-number\"\n [min]=\"0\"\n [max]=\"maxRange()\"\n [(ngModel)]=\"selectedShadow().spreadRadius\"\n (ngModelChange)=\"updateShadow({ spreadRadius: selectedShadow().spreadRadius })\" />\n </td>\n </tr>\n <tr>\n <th>\n <span>Color</span>\n </th>\n <td>\n <input\n type=\"text\"\n class=\"kit-color\"\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 alignment:'end',\n placement:'bottom',\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 protected removeShadow(ev: Event, index: number) {\n ev.stopPropagation();\n\n this.shadows().splice(index, 1);\n this.update();\n }\n\n protected duplicate(ev: Event, index: number): void {\n ev.stopPropagation();\n const src = this.shadows()[index];\n if (!src) return;\n const copy = Object.assign({}, src);\n this.shadows.update((s) => {\n const n = [...s];\n n.splice(index + 1, 0, copy);\n return n;\n });\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=\"trc\">\n <div class=\"kit-head\">\n <span class=\"kit-title\">Shadow</span>\n <span class=\"kit-actions\">\n <button (click)=\"addShadow(list)\" type=\"button\" class=\"kit-add\">\n <svg viewBox=\"0 0 12 12\" width=\"11\" height=\"11\" aria-hidden=\"true\">\n <path\n d=\"M6 1v10M1 6h10\"\n stroke=\"currentColor\"\n stroke-width=\"1.7\"\n stroke-linecap=\"round\" />\n </svg>\n </button>\n </span>\n </div>\n <ul class=\"kit-list\" role=\"list\" #list>\n @for (item of shadows(); let i = $index; track i) {\n <li\n #row\n class=\"kit-row\"\n role=\"listitem\"\n tabindex=\"0\"\n [class.on]=\"i == selectedIndex()\"\n (click)=\"setShadow(row, item, i)\"\n (keydown.enter)=\"setShadow(row, item, i)\"\n (keydown.space)=\"$event.preventDefault(); setShadow(row, item, i)\">\n <span class=\"kit-text\">{{ item.cssValue }}</span>\n <span class=\"kit-ops\">\n <button\n type=\"button\"\n class=\"kit-icon\"\n title=\"Duplicate\"\n aria-label=\"Duplicate\"\n (click)=\"duplicate($event, i)\">\n ⧉\n </button>\n <button\n type=\"button\"\n class=\"kit-icon del\"\n title=\"Remove\"\n aria-label=\"Remove\"\n (click)=\"removeShadow($event, i)\">\n ✕\n </button>\n </span>\n </li>\n }\n </ul>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|