ngx-kit 1.0.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.
@@ -0,0 +1,422 @@
1
+ import * as i0 from '@angular/core';
2
+ import { EventEmitter, inject, forwardRef, HostListener, ViewChild, Output, Input, ChangeDetectionStrategy, Component, Directive } from '@angular/core';
3
+ import * as i1 from '@angular/forms';
4
+ import { FormsModule, NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';
5
+ import * as i1$1 from 'ngx-input/shared';
6
+ import { BrowserService, getOffsetPosition } from 'ngx-input/shared';
7
+ import { NgxInputColor } from 'ngx-input/color-picker';
8
+
9
+ function parseBoxShadowToPx(shadow, contextPx = 16) {
10
+ if (!shadow || !shadow?.trim())
11
+ return null;
12
+ let inset = false;
13
+ shadow = shadow.trim();
14
+ if (shadow.startsWith('inset')) {
15
+ inset = true;
16
+ shadow = shadow.slice(5).trim();
17
+ }
18
+ const colorRegex = /(#(?:[a-f0-9]{3}|[a-f0-9]{6}|[a-f0-9]{4}|[a-f0-9]{8})\b|rgb\(\d{1,3},\s*\d{1,3},\s*\d{1,3}\)|rgba\(\d{1,3},\s*\d{1,3},\s*\d{1,3},\s*\d*(?:\.\d+)?\)|hsl\(\s*\d+,\s*\d*(?:\.\d+)?%,\s*\d*(?:\.\d+)?%\)|hsla\(\d+,\s*[\d.]+%,\s*[\d.]+%,\s*\d*(?:\.\d+)?\))/gi;
19
+ const colorMatch = shadow.match(colorRegex);
20
+ let color = 'black';
21
+ if (colorMatch) {
22
+ color = colorMatch[0];
23
+ shadow = shadow.replace(color, '').trim();
24
+ }
25
+ const toPx = (value, unit) => {
26
+ switch (unit.toLowerCase()) {
27
+ case 'px':
28
+ case '':
29
+ return value;
30
+ case 'em':
31
+ case 'rem':
32
+ return value * contextPx;
33
+ case '%':
34
+ return (value / 100) * contextPx;
35
+ case 'pt':
36
+ return value * 1.333;
37
+ default:
38
+ return value; // fallback
39
+ }
40
+ };
41
+ const matches = [...shadow.matchAll(/(-?\d*\.?\d+)([a-zA-Z%]*)/g)];
42
+ const values = matches.map(([_, num, unit]) => toPx(parseFloat(num), unit));
43
+ const [offsetX, offsetY, blur, spread] = values;
44
+ return {
45
+ inset,
46
+ offsetX: offsetX ?? 0,
47
+ offsetY: offsetY ?? 0,
48
+ blurRadius: blur ?? 0,
49
+ spreadRadius: spread ?? 0,
50
+ color,
51
+ };
52
+ }
53
+ function stringifyBoxShadow(obj) {
54
+ const { inset, offsetX, offsetY, blurRadius, spreadRadius, color } = obj;
55
+ const parts = [
56
+ inset ? 'inset' : '',
57
+ `${offsetX}px`,
58
+ `${offsetY}px`,
59
+ `${blurRadius}px`,
60
+ `${spreadRadius}px`,
61
+ color,
62
+ ];
63
+ return parts.filter(Boolean).join(' ').trim();
64
+ }
65
+
66
+ class NgxBoxShadowComponent {
67
+ cd;
68
+ theme = 'light';
69
+ set setTheme(val) {
70
+ if (!val || val == 'auto') {
71
+ this.theme = this.browserService.prefersDarkMode ? 'dark' : 'light';
72
+ }
73
+ else {
74
+ this.theme = val;
75
+ }
76
+ }
77
+ /**
78
+ * The maximum range of the box shadow.
79
+ * @default 25
80
+ */
81
+ maxRange = 25;
82
+ change = new EventEmitter();
83
+ isDisabled = false;
84
+ isDragging = false;
85
+ value = { x: 0, y: 0 };
86
+ x = 0;
87
+ y = 0;
88
+ blur = 0;
89
+ spread = 0;
90
+ color = 'black';
91
+ line = { x1: 0, y1: 0, x2: 0, y2: 0 };
92
+ center = { x: 0, y: 0 };
93
+ padRect;
94
+ thumbRect;
95
+ _onChange = (value) => { };
96
+ _onTouched = () => { };
97
+ _onValidateChange = () => { };
98
+ pad;
99
+ thumb;
100
+ browserService = inject(BrowserService);
101
+ constructor(cd) {
102
+ this.cd = cd;
103
+ }
104
+ ngOnInit() { }
105
+ ngAfterViewInit() {
106
+ this.updateRects();
107
+ }
108
+ ngOnDestroy() { }
109
+ registerOnChange(fn) {
110
+ this._onChange = fn;
111
+ }
112
+ registerOnTouched(fn) {
113
+ this._onTouched = fn;
114
+ }
115
+ setDisabledState(disabled) {
116
+ this.isDisabled = disabled;
117
+ }
118
+ registerOnValidatorChange(fn) {
119
+ this._onValidateChange = fn;
120
+ }
121
+ validate(control) {
122
+ return null;
123
+ }
124
+ writeValue(value) {
125
+ this.resetPosition();
126
+ if (value) {
127
+ const boxShadow = parseBoxShadowToPx(value);
128
+ // console.log(boxShadow);
129
+ if (boxShadow) {
130
+ this.value = { x: boxShadow.offsetX, y: boxShadow.offsetY };
131
+ this.blur = boxShadow.blurRadius;
132
+ this.spread = boxShadow.spreadRadius;
133
+ this.color = boxShadow.color;
134
+ this.convertValueToPosition(boxShadow.offsetX, boxShadow.offsetY);
135
+ }
136
+ }
137
+ }
138
+ dragStart(ev) {
139
+ ev.stopPropagation();
140
+ ev.preventDefault();
141
+ this.isDragging = true;
142
+ this.updatePosition(ev);
143
+ this.updateRects();
144
+ }
145
+ updateRects() {
146
+ this.padRect = this.pad.nativeElement.getBoundingClientRect();
147
+ this.thumbRect = this.thumb.nativeElement.getBoundingClientRect();
148
+ }
149
+ resetPosition() {
150
+ if (!this.padRect || !this.thumbRect)
151
+ this.updateRects();
152
+ this.center = { x: this.padRect.width / 2, y: this.padRect.height / 2 };
153
+ this.x = this.center.x - this.thumbRect.width / 2;
154
+ this.y = this.center.y - this.thumbRect.height / 2;
155
+ this.line = { x1: this.center.x, y1: this.center.y, x2: this.center.x, y2: this.center.y };
156
+ this.cd.detectChanges();
157
+ }
158
+ onResize() {
159
+ this.writeValue(this.value);
160
+ }
161
+ onDrag(ev) {
162
+ if (!this.isDragging)
163
+ return;
164
+ this.updatePosition(ev);
165
+ }
166
+ updatePosition(ev) {
167
+ if (!this.isDragging)
168
+ return;
169
+ if (!this.padRect || !this.thumbRect)
170
+ this.updateRects();
171
+ const position = getOffsetPosition(ev, this.pad.nativeElement);
172
+ const padRec = this.padRect;
173
+ const thumbRec = this.thumbRect;
174
+ const minX = thumbRec.width / 2;
175
+ const maxX = padRec.width - thumbRec.width / 2;
176
+ const minY = thumbRec.height / 2;
177
+ const maxY = padRec.height - thumbRec.height / 2;
178
+ const clampedX = Math.max(minX, Math.min(position.x, maxX));
179
+ const clampedY = Math.max(minY, Math.min(position.y, maxY));
180
+ // فقط یکبار از وسط اصلاح کن
181
+ this.x = clampedX - thumbRec.width / 2;
182
+ this.y = clampedY - thumbRec.height / 2;
183
+ this.line = {
184
+ x1: this.center.x,
185
+ y1: this.center.y,
186
+ x2: this.x + thumbRec.width / 2,
187
+ y2: this.y + thumbRec.height / 2,
188
+ };
189
+ this.setValueByPosition(thumbRec, padRec);
190
+ }
191
+ onDragEnd(ev) {
192
+ this.isDragging = false;
193
+ }
194
+ setValueByPosition(thumbRec, padRec) {
195
+ const padCenterX = (padRec.width - thumbRec.width) / 2;
196
+ const padCenterY = (padRec.height - thumbRec.height) / 2;
197
+ // فاصله thumb از مرکز
198
+ const dx = this.x - padCenterX;
199
+ const dy = this.y - padCenterY;
200
+ // مقیاس تبدیل به -50 تا +50 (یا هرچقدر بخوای)
201
+ const halfRangeX = (padRec.width - thumbRec.width) / 2;
202
+ const halfRangeY = (padRec.height - thumbRec.height) / 2;
203
+ let valueX = (dx / halfRangeX) * this.maxRange; // -50 تا +50
204
+ let valueY = (dy / halfRangeY) * this.maxRange;
205
+ // رُند کردن
206
+ valueX = Math.round(valueX);
207
+ valueY = Math.round(valueY);
208
+ // محدود کردن به -50 تا +50 یا هر مقدار دلخواه
209
+ valueX = Math.min(Math.max(valueX, -this.maxRange), this.maxRange);
210
+ valueY = Math.min(Math.max(valueY, -this.maxRange), this.maxRange);
211
+ const newValue = { x: valueX, y: valueY };
212
+ if (!this.value || this.value.x !== valueX || this.value.y !== valueY) {
213
+ this.value = newValue;
214
+ this.onChangeData();
215
+ }
216
+ }
217
+ onChangeValue() {
218
+ this.convertValueToPosition(this.value.x, this.value.y);
219
+ this.onChangeData();
220
+ }
221
+ convertValueToPosition(offsetX, offsetY) {
222
+ if (!this.padRect || !this.thumbRect)
223
+ this.updateRects();
224
+ // موقعیت پیشنهادی بر اساس offset
225
+ let proposedX = this.padRect.width / 2 + offsetX - this.thumbRect.width / 2;
226
+ let proposedY = this.padRect.height / 2 + offsetY - this.thumbRect.height / 2;
227
+ // محدود کردن (clamp) تا خارج از pad نره
228
+ const minX = 0;
229
+ const maxX = this.padRect.width - this.thumbRect.width;
230
+ const minY = 0;
231
+ const maxY = this.padRect.height - this.thumbRect.height;
232
+ this.x = Math.min(Math.max(proposedX, minX), maxX);
233
+ this.y = Math.min(Math.max(proposedY, minY), maxY);
234
+ // رسم خط راهنما از مرکز به thumb
235
+ this.line = {
236
+ x1: this.center.x,
237
+ y1: this.center.y,
238
+ x2: this.x + this.thumbRect.width / 2,
239
+ y2: this.y + this.thumbRect.height / 2,
240
+ };
241
+ this.cd.detectChanges();
242
+ }
243
+ onChangeData() {
244
+ const boxShadow = stringifyBoxShadow({
245
+ inset: false,
246
+ offsetX: this.value.x,
247
+ offsetY: this.value.y,
248
+ blurRadius: this.blur,
249
+ spreadRadius: this.spread,
250
+ color: this.color,
251
+ });
252
+ this._onChange(boxShadow);
253
+ this.change.emit(boxShadow);
254
+ }
255
+ stopPropagation(ev) {
256
+ ev.stopPropagation();
257
+ }
258
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxBoxShadowComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
259
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.4", type: NgxBoxShadowComponent, isStandalone: true, selector: "ngx-box-shadow", inputs: { setTheme: ["theme", "setTheme"], maxRange: "maxRange" }, outputs: { change: "change" }, host: { listeners: { "window:resize": "onResize()", "document:mousemove": "onDrag($event)", "document:touchmove": "onDrag($event)", "document:mouseup": "onDragEnd($event)", "document:touchend": "onDragEnd($event)" }, properties: { "class.dark": "theme==\"dark\"" } }, providers: [
260
+ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxBoxShadowComponent), multi: true },
261
+ {
262
+ provide: NG_VALIDATORS,
263
+ multi: true,
264
+ useExisting: NgxBoxShadowComponent,
265
+ },
266
+ ], viewQueries: [{ propertyName: "pad", first: true, predicate: ["pad"], descendants: true, static: true }, { propertyName: "thumb", first: true, predicate: ["thumb"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"ngx-box-shadow-container\" (click)=\"stopPropagation($event)\">\r\n <div class=\"pad-container\" #pad>\r\n <svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <line\r\n [attr.x1]=\"line.x1\"\r\n [attr.y1]=\"line.y1\"\r\n [attr.x2]=\"line.x2\"\r\n [attr.y2]=\"line.y2\"\r\n stroke=\"blue\"\r\n stroke-width=\"2\" />\r\n </svg>\r\n <div\r\n class=\"thumb\"\r\n #thumb\r\n [style.left.px]=\"x\"\r\n [style.top.px]=\"y\"\r\n (mousedown)=\"dragStart($event)\"\r\n (touchstart)=\"dragStart($event)\"></div>\r\n </div>\r\n\r\n <div class=\"ngx-settings\">\r\n <div class=\"ngx-setting-item\">\r\n <div class=\"ngx-row\">\r\n <span>Offset X</span>\r\n <input type=\"number\" id=\"offsetX\" [(ngModel)]=\"value.x\" name=\"offsetX\" (ngModelChange)=\"onChangeValue()\" />\r\n </div>\r\n <input\r\n type=\"range\"\r\n id=\"offsetX\"\r\n [(ngModel)]=\"value.x\"\r\n name=\"rangeOffsetX\"\r\n (ngModelChange)=\"onChangeValue()\"\r\n step=\"1\"\r\n [min]=\"-maxRange\"\r\n [max]=\"maxRange\" />\r\n </div>\r\n <div class=\"ngx-setting-item\">\r\n <div class=\"ngx-row\">\r\n <span>Offset Y</span>\r\n <input type=\"number\" id=\"offsetY\" [(ngModel)]=\"value.y\" name=\"offsetY\" (ngModelChange)=\"onChangeValue()\" />\r\n </div>\r\n <input\r\n type=\"range\"\r\n id=\"offsetY\"\r\n [(ngModel)]=\"value.y\"\r\n name=\"rangeOffsetY\"\r\n (ngModelChange)=\"onChangeValue()\"\r\n step=\"1\"\r\n [min]=\"-maxRange\"\r\n [max]=\"maxRange\" />\r\n </div>\r\n <div class=\"ngx-setting-item\">\r\n <div class=\"ngx-row\">\r\n <span>Blur</span>\r\n <input type=\"number\" id=\"blur\" [(ngModel)]=\"blur\" name=\"blur\" (ngModelChange)=\"onChangeValue()\" />\r\n </div>\r\n <input type=\"range\" id=\"blur\" [(ngModel)]=\"blur\" name=\"rangeBlur\" (ngModelChange)=\"onChangeValue()\" step=\"1\" />\r\n </div>\r\n <div class=\"ngx-setting-item\">\r\n <div class=\"ngx-row\">\r\n <span>Spread</span>\r\n <input type=\"number\" id=\"spread\" [(ngModel)]=\"spread\" name=\"spread\" (ngModelChange)=\"onChangeValue()\" />\r\n </div>\r\n <input\r\n type=\"range\"\r\n id=\"spread\"\r\n [(ngModel)]=\"spread\"\r\n name=\"rangeSpread\"\r\n (ngModelChange)=\"onChangeValue()\"\r\n step=\"1\" />\r\n </div>\r\n <div class=\"ngx-setting-item\">\r\n <div class=\"ngx-row\">\r\n <span>color</span>\r\n <input\r\n type=\"text\"\r\n readonly\r\n id=\"color\"\r\n [(ngModel)]=\"color\"\r\n name=\"color\"\r\n ngxInputColor\r\n [simpleMode]=\"true\"\r\n (ngModelChange)=\"onChangeData()\"\r\n autocomplete=\"off\" />\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".ngx-box-shadow-container{width:180px;max-width:100%;border:1px #bfbfbf solid;border-radius:15px;background-color:#fff;overflow:hidden;box-shadow:0 0 20px #0000004f;direction:ltr;padding:12px}.ngx-box-shadow-container *{box-sizing:border-box}.pad-container{position:relative;width:100px;height:100px;border:1px #545454 solid;box-sizing:border-box;direction:ltr;border-radius:3px}.pad-container:after,.pad-container:before{content:\"\";position:absolute;border:1px rgba(145,145,145,.4117647059) solid}.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}.ngx-settings .ngx-row{display:flex;align-items:flex-end;justify-content:space-between}.ngx-settings input:not([type=range]){width:46px;border:none;border:1px solid rgba(145,145,145,.4117647059);padding:2px 4px;border-radius:5px;background-color:transparent;color:#000;font-size:14px;font-weight:500;text-align:center;direction:ltr}.ngx-settings input:not([type=range]):focus{outline:none;border:1px solid #09218d}.ngx-settings input[type=range]{width:100%}\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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgxInputColor, selector: "[ngxInputColor]", inputs: ["setInputBackgroundColor", "defaultInspector", "simpleMode", "outputType", "theme", "useAlphaChannel", "ngxInputColor"], outputs: ["change"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
267
+ }
268
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxBoxShadowComponent, decorators: [{
269
+ type: Component,
270
+ args: [{ selector: 'ngx-box-shadow', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
271
+ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxBoxShadowComponent), multi: true },
272
+ {
273
+ provide: NG_VALIDATORS,
274
+ multi: true,
275
+ useExisting: NgxBoxShadowComponent,
276
+ },
277
+ ], imports: [FormsModule, NgxInputColor], host: {
278
+ '[class.dark]': 'theme=="dark"',
279
+ }, template: "<div class=\"ngx-box-shadow-container\" (click)=\"stopPropagation($event)\">\r\n <div class=\"pad-container\" #pad>\r\n <svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <line\r\n [attr.x1]=\"line.x1\"\r\n [attr.y1]=\"line.y1\"\r\n [attr.x2]=\"line.x2\"\r\n [attr.y2]=\"line.y2\"\r\n stroke=\"blue\"\r\n stroke-width=\"2\" />\r\n </svg>\r\n <div\r\n class=\"thumb\"\r\n #thumb\r\n [style.left.px]=\"x\"\r\n [style.top.px]=\"y\"\r\n (mousedown)=\"dragStart($event)\"\r\n (touchstart)=\"dragStart($event)\"></div>\r\n </div>\r\n\r\n <div class=\"ngx-settings\">\r\n <div class=\"ngx-setting-item\">\r\n <div class=\"ngx-row\">\r\n <span>Offset X</span>\r\n <input type=\"number\" id=\"offsetX\" [(ngModel)]=\"value.x\" name=\"offsetX\" (ngModelChange)=\"onChangeValue()\" />\r\n </div>\r\n <input\r\n type=\"range\"\r\n id=\"offsetX\"\r\n [(ngModel)]=\"value.x\"\r\n name=\"rangeOffsetX\"\r\n (ngModelChange)=\"onChangeValue()\"\r\n step=\"1\"\r\n [min]=\"-maxRange\"\r\n [max]=\"maxRange\" />\r\n </div>\r\n <div class=\"ngx-setting-item\">\r\n <div class=\"ngx-row\">\r\n <span>Offset Y</span>\r\n <input type=\"number\" id=\"offsetY\" [(ngModel)]=\"value.y\" name=\"offsetY\" (ngModelChange)=\"onChangeValue()\" />\r\n </div>\r\n <input\r\n type=\"range\"\r\n id=\"offsetY\"\r\n [(ngModel)]=\"value.y\"\r\n name=\"rangeOffsetY\"\r\n (ngModelChange)=\"onChangeValue()\"\r\n step=\"1\"\r\n [min]=\"-maxRange\"\r\n [max]=\"maxRange\" />\r\n </div>\r\n <div class=\"ngx-setting-item\">\r\n <div class=\"ngx-row\">\r\n <span>Blur</span>\r\n <input type=\"number\" id=\"blur\" [(ngModel)]=\"blur\" name=\"blur\" (ngModelChange)=\"onChangeValue()\" />\r\n </div>\r\n <input type=\"range\" id=\"blur\" [(ngModel)]=\"blur\" name=\"rangeBlur\" (ngModelChange)=\"onChangeValue()\" step=\"1\" />\r\n </div>\r\n <div class=\"ngx-setting-item\">\r\n <div class=\"ngx-row\">\r\n <span>Spread</span>\r\n <input type=\"number\" id=\"spread\" [(ngModel)]=\"spread\" name=\"spread\" (ngModelChange)=\"onChangeValue()\" />\r\n </div>\r\n <input\r\n type=\"range\"\r\n id=\"spread\"\r\n [(ngModel)]=\"spread\"\r\n name=\"rangeSpread\"\r\n (ngModelChange)=\"onChangeValue()\"\r\n step=\"1\" />\r\n </div>\r\n <div class=\"ngx-setting-item\">\r\n <div class=\"ngx-row\">\r\n <span>color</span>\r\n <input\r\n type=\"text\"\r\n readonly\r\n id=\"color\"\r\n [(ngModel)]=\"color\"\r\n name=\"color\"\r\n ngxInputColor\r\n [simpleMode]=\"true\"\r\n (ngModelChange)=\"onChangeData()\"\r\n autocomplete=\"off\" />\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".ngx-box-shadow-container{width:180px;max-width:100%;border:1px #bfbfbf solid;border-radius:15px;background-color:#fff;overflow:hidden;box-shadow:0 0 20px #0000004f;direction:ltr;padding:12px}.ngx-box-shadow-container *{box-sizing:border-box}.pad-container{position:relative;width:100px;height:100px;border:1px #545454 solid;box-sizing:border-box;direction:ltr;border-radius:3px}.pad-container:after,.pad-container:before{content:\"\";position:absolute;border:1px rgba(145,145,145,.4117647059) solid}.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}.ngx-settings .ngx-row{display:flex;align-items:flex-end;justify-content:space-between}.ngx-settings input:not([type=range]){width:46px;border:none;border:1px solid rgba(145,145,145,.4117647059);padding:2px 4px;border-radius:5px;background-color:transparent;color:#000;font-size:14px;font-weight:500;text-align:center;direction:ltr}.ngx-settings input:not([type=range]):focus{outline:none;border:1px solid #09218d}.ngx-settings input[type=range]{width:100%}\n"] }]
280
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { setTheme: [{
281
+ type: Input,
282
+ args: ['theme']
283
+ }], maxRange: [{
284
+ type: Input
285
+ }], change: [{
286
+ type: Output
287
+ }], pad: [{
288
+ type: ViewChild,
289
+ args: ['pad', { static: true }]
290
+ }], thumb: [{
291
+ type: ViewChild,
292
+ args: ['thumb', { static: true }]
293
+ }], onResize: [{
294
+ type: HostListener,
295
+ args: ['window:resize']
296
+ }], onDrag: [{
297
+ type: HostListener,
298
+ args: ['document:mousemove', ['$event']]
299
+ }, {
300
+ type: HostListener,
301
+ args: ['document:touchmove', ['$event']]
302
+ }], onDragEnd: [{
303
+ type: HostListener,
304
+ args: ['document:mouseup', ['$event']]
305
+ }, {
306
+ type: HostListener,
307
+ args: ['document:touchend', ['$event']]
308
+ }] } });
309
+
310
+ class NgxInputBoxShadow {
311
+ el;
312
+ viewContainerRef;
313
+ renderer;
314
+ dialogService;
315
+ setInputBackground = true;
316
+ pickerRef;
317
+ value = '';
318
+ _onChange = (value) => { };
319
+ _onTouched = () => { };
320
+ _onValidateChange = () => { };
321
+ constructor(el, viewContainerRef, renderer, dialogService) {
322
+ this.el = el;
323
+ this.viewContainerRef = viewContainerRef;
324
+ this.renderer = renderer;
325
+ this.dialogService = dialogService;
326
+ }
327
+ onClick(ev) {
328
+ ev.stopPropagation();
329
+ ev.preventDefault();
330
+ this.toggleColorPicker();
331
+ }
332
+ registerOnChange(fn) {
333
+ this._onChange = fn;
334
+ }
335
+ registerOnTouched(fn) {
336
+ this._onTouched = fn;
337
+ }
338
+ setDisabledState(disabled) {
339
+ if (disabled) {
340
+ this.renderer.setProperty(this.el.nativeElement, 'disabled', disabled);
341
+ }
342
+ else {
343
+ this.renderer.removeAttribute(this.el.nativeElement, 'disabled');
344
+ }
345
+ }
346
+ registerOnValidatorChange(fn) {
347
+ this._onValidateChange = fn;
348
+ }
349
+ validate(control) {
350
+ return null;
351
+ }
352
+ ngOnDestroy() {
353
+ this.destroyPicker();
354
+ }
355
+ writeValue(value) {
356
+ this.value = value;
357
+ }
358
+ toggleColorPicker() {
359
+ if (this.pickerRef) {
360
+ this.destroyPicker();
361
+ return;
362
+ }
363
+ this.pickerRef = this.dialogService.open({
364
+ anchor: this.el.nativeElement,
365
+ component: NgxBoxShadowComponent,
366
+ viewContainerRef: this.viewContainerRef,
367
+ alignment: 'start',
368
+ placement: 'auto',
369
+ configure: (instance, ref) => {
370
+ instance.writeValue(this.value);
371
+ instance.change.subscribe((c) => {
372
+ this._onChange(c);
373
+ });
374
+ // instance.closed.subscribe(() => ref.close());
375
+ },
376
+ onClosed: () => {
377
+ this.pickerRef = undefined;
378
+ },
379
+ });
380
+ }
381
+ destroyPicker() {
382
+ if (this.pickerRef) {
383
+ this.pickerRef.close();
384
+ this.pickerRef = undefined;
385
+ }
386
+ }
387
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxInputBoxShadow, deps: [{ token: i0.ElementRef }, { token: i0.ViewContainerRef }, { token: i0.Renderer2 }, { token: i1$1.DialogService }], target: i0.ɵɵFactoryTarget.Directive });
388
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.4", type: NgxInputBoxShadow, isStandalone: true, selector: "[ngxInputBoxShadow]", inputs: { setInputBackground: "setInputBackground" }, host: { listeners: { "click": "onClick($event)" } }, providers: [
389
+ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxInputBoxShadow), multi: true },
390
+ {
391
+ provide: NG_VALIDATORS,
392
+ multi: true,
393
+ useExisting: NgxInputBoxShadow,
394
+ },
395
+ ], ngImport: i0 });
396
+ }
397
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxInputBoxShadow, decorators: [{
398
+ type: Directive,
399
+ args: [{
400
+ selector: '[ngxInputBoxShadow]',
401
+ providers: [
402
+ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxInputBoxShadow), multi: true },
403
+ {
404
+ provide: NG_VALIDATORS,
405
+ multi: true,
406
+ useExisting: NgxInputBoxShadow,
407
+ },
408
+ ],
409
+ }]
410
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ViewContainerRef }, { type: i0.Renderer2 }, { type: i1$1.DialogService }], propDecorators: { setInputBackground: [{
411
+ type: Input
412
+ }], onClick: [{
413
+ type: HostListener,
414
+ args: ['click', ['$event']]
415
+ }] } });
416
+
417
+ /**
418
+ * Generated bundle index. Do not edit.
419
+ */
420
+
421
+ export { NgxBoxShadowComponent, NgxInputBoxShadow };
422
+ //# sourceMappingURL=ngx-input-box-shadow.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngx-input-box-shadow.mjs","sources":["../../../projects/libs/box-shadow/utils/box-shadow.ts","../../../projects/libs/box-shadow/components/box-shadow.component.ts","../../../projects/libs/box-shadow/components/box-shadow.component.html","../../../projects/libs/box-shadow/directives/ngx-input-box-shadow.directive.ts","../../../projects/libs/box-shadow/ngx-input-box-shadow.ts"],"sourcesContent":["import { BoxShadowValue } from '../contracts/BoxShadowValue';\r\nexport function parseBoxShadowToPx(shadow: string, contextPx = 16): BoxShadowValue | null {\r\n if (!shadow || !shadow?.trim()) return null;\r\n let inset = false;\r\n shadow = shadow.trim();\r\n\r\n if (shadow.startsWith('inset')) {\r\n inset = true;\r\n shadow = shadow.slice(5).trim();\r\n }\r\n\r\n const colorRegex =\r\n /(#(?:[a-f0-9]{3}|[a-f0-9]{6}|[a-f0-9]{4}|[a-f0-9]{8})\\b|rgb\\(\\d{1,3},\\s*\\d{1,3},\\s*\\d{1,3}\\)|rgba\\(\\d{1,3},\\s*\\d{1,3},\\s*\\d{1,3},\\s*\\d*(?:\\.\\d+)?\\)|hsl\\(\\s*\\d+,\\s*\\d*(?:\\.\\d+)?%,\\s*\\d*(?:\\.\\d+)?%\\)|hsla\\(\\d+,\\s*[\\d.]+%,\\s*[\\d.]+%,\\s*\\d*(?:\\.\\d+)?\\))/gi;\r\n const colorMatch = shadow.match(colorRegex);\r\n let color = 'black';\r\n if (colorMatch) {\r\n color = colorMatch[0];\r\n shadow = shadow.replace(color, '').trim();\r\n }\r\n\r\n const toPx = (value: number, unit: string): number => {\r\n switch (unit.toLowerCase()) {\r\n case 'px':\r\n case '':\r\n return value;\r\n case 'em':\r\n case 'rem':\r\n return value * contextPx;\r\n case '%':\r\n return (value / 100) * contextPx;\r\n case 'pt':\r\n return value * 1.333;\r\n default:\r\n return value; // fallback\r\n }\r\n };\r\n\r\n const matches = [...shadow.matchAll(/(-?\\d*\\.?\\d+)([a-zA-Z%]*)/g)];\r\n const values = matches.map(([_, num, unit]) => toPx(parseFloat(num), unit));\r\n\r\n const [offsetX, offsetY, blur, spread] = values;\r\n\r\n return {\r\n inset,\r\n offsetX: offsetX ?? 0,\r\n offsetY: offsetY ?? 0,\r\n blurRadius: blur ?? 0,\r\n spreadRadius: spread ?? 0,\r\n color,\r\n };\r\n}\r\n\r\nexport function stringifyBoxShadow(obj: BoxShadowValue): string {\r\n const { inset, offsetX, offsetY, blurRadius, spreadRadius, color } = obj;\r\n\r\n const parts = [\r\n inset ? 'inset' : '',\r\n `${offsetX}px`,\r\n `${offsetY}px`,\r\n `${blurRadius}px`,\r\n `${spreadRadius}px`,\r\n color,\r\n ];\r\n\r\n return parts.filter(Boolean).join(' ').trim();\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n forwardRef,\r\n OnInit,\r\n OnDestroy,\r\n ChangeDetectorRef,\r\n HostListener,\r\n ElementRef,\r\n ViewChild,\r\n AfterViewInit,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n inject,\r\n} from '@angular/core';\r\nimport {\r\n NG_VALUE_ACCESSOR,\r\n NG_VALIDATORS,\r\n FormsModule,\r\n ControlValueAccessor,\r\n Validator,\r\n AbstractControl,\r\n ValidationErrors,\r\n} from '@angular/forms';\r\nimport { parseBoxShadowToPx, stringifyBoxShadow } from '../utils/box-shadow';\r\nimport { IPosition, getOffsetPosition } from 'ngx-input/shared';\r\nimport { NgxInputColor } from 'ngx-input/color-picker';\r\nimport { BrowserService } from 'ngx-input/shared';\r\n\r\n@Component({\r\n selector: 'ngx-box-shadow',\r\n templateUrl: './box-shadow.component.html',\r\n styleUrls: ['./box-shadow.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxBoxShadowComponent), multi: true },\r\n {\r\n provide: NG_VALIDATORS,\r\n multi: true,\r\n useExisting: NgxBoxShadowComponent,\r\n },\r\n ],\r\n imports: [FormsModule, NgxInputColor],\r\n host: {\r\n '[class.dark]': 'theme==\"dark\"',\r\n },\r\n})\r\nexport class NgxBoxShadowComponent implements OnInit, AfterViewInit, OnDestroy, ControlValueAccessor, Validator {\r\n theme: 'light' | 'dark' | 'auto' = 'light';\r\n @Input('theme') set setTheme(val: 'light' | 'dark' | 'auto') {\r\n if (!val || val == 'auto') {\r\n this.theme = this.browserService.prefersDarkMode ? 'dark' : 'light';\r\n } else {\r\n this.theme = val;\r\n }\r\n }\r\n /**\r\n * The maximum range of the box shadow.\r\n * @default 25\r\n */\r\n @Input() maxRange = 25;\r\n @Output() change = new EventEmitter<string>();\r\n isDisabled = false;\r\n isDragging = false;\r\n value: IPosition = { x: 0, y: 0 };\r\n x = 0;\r\n y = 0;\r\n blur = 0;\r\n spread = 0;\r\n color = 'black';\r\n line: { x1: number; y1: number; x2: number; y2: number } = { x1: 0, y1: 0, x2: 0, y2: 0 };\r\n center: { x: number; y: number } = { x: 0, y: 0 };\r\n\r\n padRect?: DOMRect;\r\n thumbRect?: DOMRect;\r\n _onChange = (value: string) => {};\r\n _onTouched = () => {};\r\n _onValidateChange = () => {};\r\n\r\n @ViewChild('pad', { static: true }) pad!: ElementRef<HTMLDivElement>;\r\n @ViewChild('thumb', { static: true }) thumb!: ElementRef<HTMLDivElement>;\r\n\r\n browserService = inject(BrowserService);\r\n\r\n constructor(private cd: ChangeDetectorRef) {}\r\n\r\n ngOnInit(): void {}\r\n ngAfterViewInit(): void {\r\n this.updateRects();\r\n }\r\n ngOnDestroy(): void {}\r\n registerOnChange(fn: any): void {\r\n this._onChange = fn;\r\n }\r\n registerOnTouched(fn: any): void {\r\n this._onTouched = fn;\r\n }\r\n setDisabledState(disabled: boolean): void {\r\n this.isDisabled = disabled;\r\n }\r\n registerOnValidatorChange(fn: () => void): void {\r\n this._onValidateChange = fn;\r\n }\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n return null;\r\n }\r\n\r\n writeValue(value: any): void {\r\n this.resetPosition();\r\n if (value) {\r\n const boxShadow = parseBoxShadowToPx(value);\r\n // console.log(boxShadow);\r\n if (boxShadow) {\r\n this.value = { x: boxShadow.offsetX, y: boxShadow.offsetY };\r\n this.blur = boxShadow.blurRadius;\r\n this.spread = boxShadow.spreadRadius;\r\n this.color = boxShadow.color;\r\n this.convertValueToPosition(boxShadow.offsetX, boxShadow.offsetY);\r\n }\r\n }\r\n }\r\n\r\n dragStart(ev: MouseEvent | TouchEvent) {\r\n ev.stopPropagation();\r\n ev.preventDefault();\r\n this.isDragging = true;\r\n this.updatePosition(ev);\r\n this.updateRects();\r\n }\r\n private updateRects() {\r\n this.padRect = this.pad.nativeElement.getBoundingClientRect();\r\n this.thumbRect = this.thumb.nativeElement.getBoundingClientRect();\r\n }\r\n private resetPosition() {\r\n if (!this.padRect || !this.thumbRect) this.updateRects();\r\n this.center = { x: this.padRect!.width / 2, y: this.padRect!.height / 2 };\r\n this.x = this.center.x - this.thumbRect!.width / 2;\r\n this.y = this.center.y - this.thumbRect!.height / 2;\r\n this.line = { x1: this.center.x, y1: this.center.y, x2: this.center.x, y2: this.center.y };\r\n this.cd.detectChanges();\r\n }\r\n\r\n @HostListener('window:resize')\r\n onResize() {\r\n this.writeValue(this.value);\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n @HostListener('document:touchmove', ['$event'])\r\n onDrag(ev: MouseEvent | TouchEvent) {\r\n if (!this.isDragging) return;\r\n this.updatePosition(ev);\r\n }\r\n\r\n private updatePosition(ev: MouseEvent | TouchEvent) {\r\n if (!this.isDragging) return;\r\n if (!this.padRect || !this.thumbRect) this.updateRects();\r\n const position = getOffsetPosition(ev, this.pad.nativeElement);\r\n\r\n const padRec = this.padRect!;\r\n const thumbRec = this.thumbRect!;\r\n\r\n const minX = thumbRec.width / 2;\r\n const maxX = padRec.width - thumbRec.width / 2;\r\n const minY = thumbRec.height / 2;\r\n const maxY = padRec.height - thumbRec.height / 2;\r\n\r\n const clampedX = Math.max(minX, Math.min(position.x, maxX));\r\n const clampedY = Math.max(minY, Math.min(position.y, maxY));\r\n\r\n // فقط یکبار از وسط اصلاح کن\r\n this.x = clampedX - thumbRec.width / 2;\r\n this.y = clampedY - thumbRec.height / 2;\r\n\r\n this.line = {\r\n x1: this.center.x,\r\n y1: this.center.y,\r\n x2: this.x + thumbRec.width / 2,\r\n y2: this.y + thumbRec.height / 2,\r\n };\r\n\r\n this.setValueByPosition(thumbRec, padRec);\r\n }\r\n\r\n @HostListener('document:mouseup', ['$event'])\r\n @HostListener('document:touchend', ['$event'])\r\n onDragEnd(ev: MouseEvent | TouchEvent) {\r\n this.isDragging = false;\r\n }\r\n\r\n setValueByPosition(thumbRec: DOMRect, padRec: DOMRect) {\r\n const padCenterX = (padRec.width - thumbRec.width) / 2;\r\n const padCenterY = (padRec.height - thumbRec.height) / 2;\r\n\r\n // فاصله thumb از مرکز\r\n const dx = this.x - padCenterX;\r\n const dy = this.y - padCenterY;\r\n\r\n // مقیاس تبدیل به -50 تا +50 (یا هرچقدر بخوای)\r\n const halfRangeX = (padRec.width - thumbRec.width) / 2;\r\n const halfRangeY = (padRec.height - thumbRec.height) / 2;\r\n\r\n let valueX = (dx / halfRangeX) * this.maxRange; // -50 تا +50\r\n let valueY = (dy / halfRangeY) * this.maxRange;\r\n\r\n // رُند کردن\r\n valueX = Math.round(valueX);\r\n valueY = Math.round(valueY);\r\n\r\n // محدود کردن به -50 تا +50 یا هر مقدار دلخواه\r\n valueX = Math.min(Math.max(valueX, -this.maxRange), this.maxRange);\r\n valueY = Math.min(Math.max(valueY, -this.maxRange), this.maxRange);\r\n\r\n const newValue = { x: valueX, y: valueY };\r\n\r\n if (!this.value || this.value.x !== valueX || this.value.y !== valueY) {\r\n this.value = newValue;\r\n this.onChangeData();\r\n }\r\n }\r\n\r\n public onChangeValue() {\r\n this.convertValueToPosition(this.value.x, this.value.y);\r\n this.onChangeData();\r\n }\r\n private convertValueToPosition(offsetX: number, offsetY: number) {\r\n if (!this.padRect || !this.thumbRect) this.updateRects();\r\n\r\n // موقعیت پیشنهادی بر اساس offset\r\n let proposedX = this.padRect!.width / 2 + offsetX - this.thumbRect!.width / 2;\r\n let proposedY = this.padRect!.height / 2 + offsetY - this.thumbRect!.height / 2;\r\n\r\n // محدود کردن (clamp) تا خارج از pad نره\r\n const minX = 0;\r\n const maxX = this.padRect!.width - this.thumbRect!.width;\r\n const minY = 0;\r\n const maxY = this.padRect!.height - this.thumbRect!.height;\r\n\r\n this.x = Math.min(Math.max(proposedX, minX), maxX);\r\n this.y = Math.min(Math.max(proposedY, minY), maxY);\r\n\r\n // رسم خط راهنما از مرکز به thumb\r\n this.line = {\r\n x1: this.center.x,\r\n y1: this.center.y,\r\n x2: this.x + this.thumbRect!.width / 2,\r\n y2: this.y + this.thumbRect!.height / 2,\r\n };\r\n\r\n this.cd.detectChanges();\r\n }\r\n\r\n onChangeData() {\r\n const boxShadow = stringifyBoxShadow({\r\n inset: false,\r\n offsetX: this.value.x,\r\n offsetY: this.value.y,\r\n blurRadius: this.blur,\r\n spreadRadius: this.spread,\r\n color: this.color,\r\n });\r\n this._onChange(boxShadow);\r\n this.change.emit(boxShadow);\r\n }\r\n\r\n stopPropagation(ev: Event) {\r\n ev.stopPropagation();\r\n }\r\n}\r\n","<div class=\"ngx-box-shadow-container\" (click)=\"stopPropagation($event)\">\r\n <div class=\"pad-container\" #pad>\r\n <svg viewBox=\"0 0 100 100\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <line\r\n [attr.x1]=\"line.x1\"\r\n [attr.y1]=\"line.y1\"\r\n [attr.x2]=\"line.x2\"\r\n [attr.y2]=\"line.y2\"\r\n stroke=\"blue\"\r\n stroke-width=\"2\" />\r\n </svg>\r\n <div\r\n class=\"thumb\"\r\n #thumb\r\n [style.left.px]=\"x\"\r\n [style.top.px]=\"y\"\r\n (mousedown)=\"dragStart($event)\"\r\n (touchstart)=\"dragStart($event)\"></div>\r\n </div>\r\n\r\n <div class=\"ngx-settings\">\r\n <div class=\"ngx-setting-item\">\r\n <div class=\"ngx-row\">\r\n <span>Offset X</span>\r\n <input type=\"number\" id=\"offsetX\" [(ngModel)]=\"value.x\" name=\"offsetX\" (ngModelChange)=\"onChangeValue()\" />\r\n </div>\r\n <input\r\n type=\"range\"\r\n id=\"offsetX\"\r\n [(ngModel)]=\"value.x\"\r\n name=\"rangeOffsetX\"\r\n (ngModelChange)=\"onChangeValue()\"\r\n step=\"1\"\r\n [min]=\"-maxRange\"\r\n [max]=\"maxRange\" />\r\n </div>\r\n <div class=\"ngx-setting-item\">\r\n <div class=\"ngx-row\">\r\n <span>Offset Y</span>\r\n <input type=\"number\" id=\"offsetY\" [(ngModel)]=\"value.y\" name=\"offsetY\" (ngModelChange)=\"onChangeValue()\" />\r\n </div>\r\n <input\r\n type=\"range\"\r\n id=\"offsetY\"\r\n [(ngModel)]=\"value.y\"\r\n name=\"rangeOffsetY\"\r\n (ngModelChange)=\"onChangeValue()\"\r\n step=\"1\"\r\n [min]=\"-maxRange\"\r\n [max]=\"maxRange\" />\r\n </div>\r\n <div class=\"ngx-setting-item\">\r\n <div class=\"ngx-row\">\r\n <span>Blur</span>\r\n <input type=\"number\" id=\"blur\" [(ngModel)]=\"blur\" name=\"blur\" (ngModelChange)=\"onChangeValue()\" />\r\n </div>\r\n <input type=\"range\" id=\"blur\" [(ngModel)]=\"blur\" name=\"rangeBlur\" (ngModelChange)=\"onChangeValue()\" step=\"1\" />\r\n </div>\r\n <div class=\"ngx-setting-item\">\r\n <div class=\"ngx-row\">\r\n <span>Spread</span>\r\n <input type=\"number\" id=\"spread\" [(ngModel)]=\"spread\" name=\"spread\" (ngModelChange)=\"onChangeValue()\" />\r\n </div>\r\n <input\r\n type=\"range\"\r\n id=\"spread\"\r\n [(ngModel)]=\"spread\"\r\n name=\"rangeSpread\"\r\n (ngModelChange)=\"onChangeValue()\"\r\n step=\"1\" />\r\n </div>\r\n <div class=\"ngx-setting-item\">\r\n <div class=\"ngx-row\">\r\n <span>color</span>\r\n <input\r\n type=\"text\"\r\n readonly\r\n id=\"color\"\r\n [(ngModel)]=\"color\"\r\n name=\"color\"\r\n ngxInputColor\r\n [simpleMode]=\"true\"\r\n (ngModelChange)=\"onChangeData()\"\r\n autocomplete=\"off\" />\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import {\r\n ComponentRef,\r\n Directive,\r\n ElementRef,\r\n HostListener,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n Renderer2,\r\n ViewContainerRef,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport {\r\n AbstractControl,\r\n ControlValueAccessor,\r\n NG_VALIDATORS,\r\n NG_VALUE_ACCESSOR,\r\n ValidationErrors,\r\n Validator,\r\n} from '@angular/forms';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { NgxBoxShadowComponent } from '../components/box-shadow.component';\r\nimport { DialogOverlayRef, DialogService } from 'ngx-input/shared';\r\n\r\n@Directive({\r\n selector: '[ngxInputBoxShadow]',\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NgxInputBoxShadow), multi: true },\r\n {\r\n provide: NG_VALIDATORS,\r\n multi: true,\r\n useExisting: NgxInputBoxShadow,\r\n },\r\n ],\r\n})\r\nexport class NgxInputBoxShadow implements OnDestroy, ControlValueAccessor, Validator {\r\n @Input() setInputBackground = true;\r\n\r\n private pickerRef?: DialogOverlayRef<NgxBoxShadowComponent>;\r\n\r\n value = '';\r\n\r\n _onChange = (value: string) => {};\r\n _onTouched = () => {};\r\n _onValidateChange = () => {};\r\n constructor(\r\n private el: ElementRef,\r\n private viewContainerRef: ViewContainerRef,\r\n private renderer: Renderer2,\r\n private dialogService: DialogService,\r\n ) {}\r\n\r\n @HostListener('click', ['$event']) onClick(ev: Event) {\r\n ev.stopPropagation();\r\n ev.preventDefault();\r\n this.toggleColorPicker();\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this._onChange = fn;\r\n }\r\n registerOnTouched(fn: any): void {\r\n this._onTouched = fn;\r\n }\r\n setDisabledState(disabled: boolean): void {\r\n if (disabled) {\r\n this.renderer.setProperty(this.el.nativeElement, 'disabled', disabled);\r\n } else {\r\n this.renderer.removeAttribute(this.el.nativeElement, 'disabled');\r\n }\r\n }\r\n registerOnValidatorChange(fn: () => void): void {\r\n this._onValidateChange = fn;\r\n }\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n return null;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroyPicker();\r\n }\r\n\r\n writeValue(value: any): void {\r\n this.value = value;\r\n }\r\n\r\n toggleColorPicker() {\r\n if (this.pickerRef) {\r\n this.destroyPicker();\r\n return;\r\n }\r\n this.pickerRef = this.dialogService.open({\r\n anchor: this.el.nativeElement,\r\n component: NgxBoxShadowComponent,\r\n viewContainerRef: this.viewContainerRef,\r\n alignment: 'start',\r\n placement: 'auto',\r\n configure: (instance, ref) => {\r\n instance.writeValue(this.value);\r\n\r\n instance.change.subscribe((c: string) => {\r\n this._onChange(c);\r\n });\r\n\r\n // instance.closed.subscribe(() => ref.close());\r\n },\r\n onClosed: () => {\r\n this.pickerRef = undefined;\r\n },\r\n });\r\n }\r\n\r\n destroyPicker() {\r\n if (this.pickerRef) {\r\n this.pickerRef.close();\r\n this.pickerRef = undefined;\r\n }\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}