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.
- package/README.md +2 -0
- package/fesm2022/ngx-input-angle-selector.mjs +338 -0
- package/fesm2022/ngx-input-angle-selector.mjs.map +1 -0
- package/fesm2022/ngx-input-box-shadow.mjs +422 -0
- package/fesm2022/ngx-input-box-shadow.mjs.map +1 -0
- package/fesm2022/ngx-input-color-picker.mjs +1348 -0
- package/fesm2022/ngx-input-color-picker.mjs.map +1 -0
- package/fesm2022/ngx-input-gradient-picker.mjs +607 -0
- package/fesm2022/ngx-input-gradient-picker.mjs.map +1 -0
- package/fesm2022/ngx-input-shared.mjs +915 -0
- package/fesm2022/ngx-input-shared.mjs.map +1 -0
- package/fesm2022/ngx-input.mjs +8 -0
- package/fesm2022/ngx-input.mjs.map +1 -0
- package/package.json +58 -0
- package/types/ngx-input-angle-selector.d.ts +79 -0
- package/types/ngx-input-box-shadow.d.ts +104 -0
- package/types/ngx-input-color-picker.d.ts +244 -0
- package/types/ngx-input-gradient-picker.d.ts +86 -0
- package/types/ngx-input-shared.d.ts +227 -0
- package/types/ngx-input.d.ts +3 -0
|
@@ -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":";;;;;;;;SACgB,kBAAkB,CAAC,MAAc,EAAE,SAAS,GAAG,EAAE,EAAA;AAC/D,IAAA,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE;AAAE,QAAA,OAAO,IAAI;IAC3C,IAAI,KAAK,GAAG,KAAK;AACjB,IAAA,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE;AAEtB,IAAA,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;QAC9B,KAAK,GAAG,IAAI;QACZ,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;IACjC;IAEA,MAAM,UAAU,GACd,6PAA6P;IAC/P,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;IAC3C,IAAI,KAAK,GAAG,OAAO;IACnB,IAAI,UAAU,EAAE;AACd,QAAA,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC;AACrB,QAAA,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;IAC3C;AAEA,IAAA,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,IAAY,KAAY;AACnD,QAAA,QAAQ,IAAI,CAAC,WAAW,EAAE;AACxB,YAAA,KAAK,IAAI;AACT,YAAA,KAAK,EAAE;AACL,gBAAA,OAAO,KAAK;AACd,YAAA,KAAK,IAAI;AACT,YAAA,KAAK,KAAK;gBACR,OAAO,KAAK,GAAG,SAAS;AAC1B,YAAA,KAAK,GAAG;AACN,gBAAA,OAAO,CAAC,KAAK,GAAG,GAAG,IAAI,SAAS;AAClC,YAAA,KAAK,IAAI;gBACP,OAAO,KAAK,GAAG,KAAK;AACtB,YAAA;gBACE,OAAO,KAAK,CAAC;;AAEnB,IAAA,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IAE3E,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,MAAM;IAE/C,OAAO;QACL,KAAK;QACL,OAAO,EAAE,OAAO,IAAI,CAAC;QACrB,OAAO,EAAE,OAAO,IAAI,CAAC;QACrB,UAAU,EAAE,IAAI,IAAI,CAAC;QACrB,YAAY,EAAE,MAAM,IAAI,CAAC;QACzB,KAAK;KACN;AACH;AAEM,SAAU,kBAAkB,CAAC,GAAmB,EAAA;AACpD,IAAA,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,GAAG;AAExE,IAAA,MAAM,KAAK,GAAG;AACZ,QAAA,KAAK,GAAG,OAAO,GAAG,EAAE;AACpB,QAAA,CAAA,EAAG,OAAO,CAAA,EAAA,CAAI;AACd,QAAA,CAAA,EAAG,OAAO,CAAA,EAAA,CAAI;AACd,QAAA,CAAA,EAAG,UAAU,CAAA,EAAA,CAAI;AACjB,QAAA,CAAA,EAAG,YAAY,CAAA,EAAA,CAAI;QACnB,KAAK;KACN;AAED,IAAA,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;AAC/C;;MCjBa,qBAAqB,CAAA;AAqCZ,IAAA,EAAA;IApCpB,KAAK,GAA8B,OAAO;IAC1C,IAAoB,QAAQ,CAAC,GAA8B,EAAA;AACzD,QAAA,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,MAAM,EAAE;AACzB,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,GAAG,MAAM,GAAG,OAAO;QACrE;aAAO;AACL,YAAA,IAAI,CAAC,KAAK,GAAG,GAAG;QAClB;IACF;AACA;;;AAGG;IACM,QAAQ,GAAG,EAAE;AACZ,IAAA,MAAM,GAAG,IAAI,YAAY,EAAU;IAC7C,UAAU,GAAG,KAAK;IAClB,UAAU,GAAG,KAAK;IAClB,KAAK,GAAc,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;IACjC,CAAC,GAAG,CAAC;IACL,CAAC,GAAG,CAAC;IACL,IAAI,GAAG,CAAC;IACR,MAAM,GAAG,CAAC;IACV,KAAK,GAAG,OAAO;AACf,IAAA,IAAI,GAAuD,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;IACzF,MAAM,GAA6B,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAEjD,IAAA,OAAO;AACP,IAAA,SAAS;AACT,IAAA,SAAS,GAAG,CAAC,KAAa,KAAI,EAAE,CAAC;AACjC,IAAA,UAAU,GAAG,MAAK,EAAE,CAAC;AACrB,IAAA,iBAAiB,GAAG,MAAK,EAAE,CAAC;AAEQ,IAAA,GAAG;AACD,IAAA,KAAK;AAE3C,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AAEvC,IAAA,WAAA,CAAoB,EAAqB,EAAA;QAArB,IAAA,CAAA,EAAE,GAAF,EAAE;IAAsB;AAE5C,IAAA,QAAQ,KAAU;IAClB,eAAe,GAAA;QACb,IAAI,CAAC,WAAW,EAAE;IACpB;AACA,IAAA,WAAW,KAAU;AACrB,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AACA,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AACA,IAAA,gBAAgB,CAAC,QAAiB,EAAA;AAChC,QAAA,IAAI,CAAC,UAAU,GAAG,QAAQ;IAC5B;AACA,IAAA,yBAAyB,CAAC,EAAc,EAAA;AACtC,QAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;IAC7B;AACA,IAAA,QAAQ,CAAC,OAAwB,EAAA;AAC/B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,UAAU,CAAC,KAAU,EAAA;QACnB,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,KAAK,EAAE;AACT,YAAA,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC;;YAE3C,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE;AAC3D,gBAAA,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,UAAU;AAChC,gBAAA,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,YAAY;AACpC,gBAAA,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK;gBAC5B,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC;YACnE;QACF;IACF;AAEA,IAAA,SAAS,CAAC,EAA2B,EAAA;QACnC,EAAE,CAAC,eAAe,EAAE;QACpB,EAAE,CAAC,cAAc,EAAE;AACnB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,QAAA,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,EAAE;IACpB;IACQ,WAAW,GAAA;QACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,qBAAqB,EAAE;QAC7D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,qBAAqB,EAAE;IACnE;IACQ,aAAa,GAAA;QACnB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,WAAW,EAAE;QACxD,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,OAAQ,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACzE,QAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,SAAU,CAAC,KAAK,GAAG,CAAC;AAClD,QAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,SAAU,CAAC,MAAM,GAAG,CAAC;AACnD,QAAA,IAAI,CAAC,IAAI,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;AAC1F,QAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;IACzB;IAGA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B;AAIA,IAAA,MAAM,CAAC,EAA2B,EAAA;QAChC,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;AACtB,QAAA,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;IACzB;AAEQ,IAAA,cAAc,CAAC,EAA2B,EAAA;QAChD,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;QACtB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,WAAW,EAAE;AACxD,QAAA,MAAM,QAAQ,GAAG,iBAAiB,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;AAE9D,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAQ;AAC5B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAU;AAEhC,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC;AAC9C,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;AAEhD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC3D,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;;QAG3D,IAAI,CAAC,CAAC,GAAG,QAAQ,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC;QACtC,IAAI,CAAC,CAAC,GAAG,QAAQ,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;QAEvC,IAAI,CAAC,IAAI,GAAG;AACV,YAAA,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;AACjB,YAAA,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACjB,EAAE,EAAE,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC;YAC/B,EAAE,EAAE,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;SACjC;AAED,QAAA,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3C;AAIA,IAAA,SAAS,CAAC,EAA2B,EAAA;AACnC,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;IACzB;IAEA,kBAAkB,CAAC,QAAiB,EAAE,MAAe,EAAA;AACnD,QAAA,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,CAAC;AACtD,QAAA,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC;;AAGxD,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,UAAU;AAC9B,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,UAAU;;AAG9B,QAAA,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,CAAC;AACtD,QAAA,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC;AAExD,QAAA,IAAI,MAAM,GAAG,CAAC,EAAE,GAAG,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC;QAC/C,IAAI,MAAM,GAAG,CAAC,EAAE,GAAG,UAAU,IAAI,IAAI,CAAC,QAAQ;;AAG9C,QAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;AAC3B,QAAA,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;;QAG3B,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC;QAClE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC;QAElE,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE;QAEzC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,MAAM,EAAE;AACrE,YAAA,IAAI,CAAC,KAAK,GAAG,QAAQ;YACrB,IAAI,CAAC,YAAY,EAAE;QACrB;IACF;IAEO,aAAa,GAAA;AAClB,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,YAAY,EAAE;IACrB;IACQ,sBAAsB,CAAC,OAAe,EAAE,OAAe,EAAA;QAC7D,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,WAAW,EAAE;;AAGxD,QAAA,IAAI,SAAS,GAAG,IAAI,CAAC,OAAQ,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,SAAU,CAAC,KAAK,GAAG,CAAC;AAC7E,QAAA,IAAI,SAAS,GAAG,IAAI,CAAC,OAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,SAAU,CAAC,MAAM,GAAG,CAAC;;QAG/E,MAAM,IAAI,GAAG,CAAC;AACd,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,SAAU,CAAC,KAAK;QACxD,MAAM,IAAI,GAAG,CAAC;AACd,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,SAAU,CAAC,MAAM;AAE1D,QAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAClD,QAAA,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;;QAGlD,IAAI,CAAC,IAAI,GAAG;AACV,YAAA,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;AACjB,YAAA,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACjB,EAAE,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,SAAU,CAAC,KAAK,GAAG,CAAC;YACtC,EAAE,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,SAAU,CAAC,MAAM,GAAG,CAAC;SACxC;AAED,QAAA,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;IACzB;IAEA,YAAY,GAAA;QACV,MAAM,SAAS,GAAG,kBAAkB,CAAC;AACnC,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AACrB,YAAA,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,UAAU,EAAE,IAAI,CAAC,IAAI;YACrB,YAAY,EAAE,IAAI,CAAC,MAAM;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;AAClB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;IAC7B;AAEA,IAAA,eAAe,CAAC,EAAS,EAAA;QACvB,EAAE,CAAC,eAAe,EAAE;IACtB;uGA5NW,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,CAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,eAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,SAAA,EAbrB;AACT,YAAA,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,qBAAqB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AACjG,YAAA;AACE,gBAAA,OAAO,EAAE,aAAa;AACtB,gBAAA,KAAK,EAAE,IAAI;AACX,gBAAA,WAAW,EAAE,qBAAqB;AACnC,aAAA;AACF,SAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,KAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,KAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,OAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,OAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1CH,2+FAwFA,EAAA,MAAA,EAAA,CAAA,wtCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED7CY,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,wSAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,8IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,2IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,YAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAKzB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAlBjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,eAAA,EAGT,uBAAuB,CAAC,MAAM,EAAA,SAAA,EACpC;AACT,wBAAA,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,2BAA2B,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AACjG,wBAAA;AACE,4BAAA,OAAO,EAAE,aAAa;AACtB,4BAAA,KAAK,EAAE,IAAI;AACX,4BAAA,WAAW,EAAA,qBAAuB;AACnC,yBAAA;AACF,qBAAA,EAAA,OAAA,EACQ,CAAC,WAAW,EAAE,aAAa,CAAC,EAAA,IAAA,EAC/B;AACJ,wBAAA,cAAc,EAAE,eAAe;AAChC,qBAAA,EAAA,QAAA,EAAA,2+FAAA,EAAA,MAAA,EAAA,CAAA,wtCAAA,CAAA,EAAA;;sBAIA,KAAK;uBAAC,OAAO;;sBAWb;;sBACA;;sBAkBA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;sBACjC,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;sBA8DnC,YAAY;uBAAC,eAAe;;sBAK5B,YAAY;uBAAC,oBAAoB,EAAE,CAAC,QAAQ,CAAC;;sBAC7C,YAAY;uBAAC,oBAAoB,EAAE,CAAC,QAAQ,CAAC;;sBAoC7C,YAAY;uBAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC;;sBAC3C,YAAY;uBAAC,mBAAmB,EAAE,CAAC,QAAQ,CAAC;;;MEvJlC,iBAAiB,CAAA;AAWlB,IAAA,EAAA;AACA,IAAA,gBAAA;AACA,IAAA,QAAA;AACA,IAAA,aAAA;IAbD,kBAAkB,GAAG,IAAI;AAE1B,IAAA,SAAS;IAEjB,KAAK,GAAG,EAAE;AAEV,IAAA,SAAS,GAAG,CAAC,KAAa,KAAI,EAAE,CAAC;AACjC,IAAA,UAAU,GAAG,MAAK,EAAE,CAAC;AACrB,IAAA,iBAAiB,GAAG,MAAK,EAAE,CAAC;AAC5B,IAAA,WAAA,CACU,EAAc,EACd,gBAAkC,EAClC,QAAmB,EACnB,aAA4B,EAAA;QAH5B,IAAA,CAAA,EAAE,GAAF,EAAE;QACF,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAChB,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,aAAa,GAAb,aAAa;IACpB;AAEgC,IAAA,OAAO,CAAC,EAAS,EAAA;QAClD,EAAE,CAAC,eAAe,EAAE;QACpB,EAAE,CAAC,cAAc,EAAE;QACnB,IAAI,CAAC,iBAAiB,EAAE;IAC1B;AAEA,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AACA,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AACA,IAAA,gBAAgB,CAAC,QAAiB,EAAA;QAChC,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC;QACxE;aAAO;AACL,YAAA,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC;QAClE;IACF;AACA,IAAA,yBAAyB,CAAC,EAAc,EAAA;AACtC,QAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;IAC7B;AACA,IAAA,QAAQ,CAAC,OAAwB,EAAA;AAC/B,QAAA,OAAO,IAAI;IACb;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,aAAa,EAAE;IACtB;AAEA,IAAA,UAAU,CAAC,KAAU,EAAA;AACnB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;IACpB;IAEA,iBAAiB,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,aAAa,EAAE;YACpB;QACF;QACA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACvC,YAAA,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,aAAa;AAC7B,YAAA,SAAS,EAAE,qBAAqB;YAChC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;AACvC,YAAA,SAAS,EAAE,OAAO;AAClB,YAAA,SAAS,EAAE,MAAM;AACjB,YAAA,SAAS,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAI;AAC3B,gBAAA,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;gBAE/B,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAS,KAAI;AACtC,oBAAA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACnB,gBAAA,CAAC,CAAC;;YAGJ,CAAC;YACD,QAAQ,EAAE,MAAK;AACb,gBAAA,IAAI,CAAC,SAAS,GAAG,SAAS;YAC5B,CAAC;AACF,SAAA,CAAC;IACJ;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AACtB,YAAA,IAAI,CAAC,SAAS,GAAG,SAAS;QAC5B;IACF;uGAlFW,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,SAAA,EATjB;AACT,YAAA,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,iBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AAC7F,YAAA;AACE,gBAAA,OAAO,EAAE,aAAa;AACtB,gBAAA,KAAK,EAAE,IAAI;AACX,gBAAA,WAAW,EAAE,iBAAiB;AAC/B,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAEU,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAX7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;AAC/B,oBAAA,SAAS,EAAE;AACT,wBAAA,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,CAAC,uBAAuB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE;AAC7F,wBAAA;AACE,4BAAA,OAAO,EAAE,aAAa;AACtB,4BAAA,KAAK,EAAE,IAAI;AACX,4BAAA,WAAW,EAAA,iBAAmB;AAC/B,yBAAA;AACF,qBAAA;AACF,iBAAA;;sBAEE;;sBAgBA,YAAY;uBAAC,OAAO,EAAE,CAAC,QAAQ,CAAC;;;ACpDnC;;AAEG;;;;"}
|