ngx-kit 8.1.0 → 8.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ngx-kit-box-shadow.mjs +23 -4
- package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
- package/fesm2022/ngx-kit-color-picker.mjs +78 -62
- package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
- package/fesm2022/ngx-kit-core.mjs +4 -4
- package/fesm2022/ngx-kit-core.mjs.map +1 -1
- package/fesm2022/ngx-kit-dialog.mjs +2 -2
- package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
- package/fesm2022/ngx-kit-gradient-picker.mjs +132 -122
- package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
- package/fesm2022/ngx-kit-tooltip.mjs +432 -0
- package/fesm2022/ngx-kit-tooltip.mjs.map +1 -0
- package/gradient-picker/README.md +1 -1
- package/package.json +5 -1
- package/styles/all.css +125 -35
- package/styles/tootip.css +120 -0
- package/tooltip/README.md +1 -0
- package/types/ngx-kit-box-shadow.d.ts +2 -1
- package/types/ngx-kit-color-picker.d.ts +5 -8
- package/types/ngx-kit-gradient-picker.d.ts +9 -6
- package/types/ngx-kit-tooltip.d.ts +88 -0
|
@@ -1,154 +1,153 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { input, output, forwardRef, ViewChild, ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostListener, Output, Input, Directive } from '@angular/core';
|
|
3
3
|
import * as i2 from '@angular/forms';
|
|
4
4
|
import { FormsModule, NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';
|
|
5
5
|
import * as i1$1 from 'ngx-kit/core';
|
|
6
|
-
import {
|
|
6
|
+
import { RangeSliderComponent } from 'ngx-kit/core';
|
|
7
7
|
import { NgxInputColor } from 'ngx-kit/color-picker';
|
|
8
8
|
import { NgxInputAngle } from 'ngx-kit/angle-selector';
|
|
9
9
|
import * as i1 from '@angular/common';
|
|
10
10
|
import { CommonModule } from '@angular/common';
|
|
11
11
|
|
|
12
|
-
function buildGradientFromStops(stops, type = 'linear', rotation = 0) {
|
|
13
|
-
if (!stops
|
|
12
|
+
function buildGradientFromStops(stops, type = 'linear', rotation = 0, options = '') {
|
|
13
|
+
if (!stops?.length)
|
|
14
14
|
return '';
|
|
15
|
-
// sort by numeric value
|
|
16
15
|
const sorted = [...stops].sort((a, b) => a.value - b.value);
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return `${s.color.trim()} ${v}%`;
|
|
16
|
+
const parts = sorted.map((stop) => {
|
|
17
|
+
const value = Math.max(0, Math.min(Number(stop.value) || 0, 100));
|
|
18
|
+
return `${stop.color.trim()} ${value}%`;
|
|
21
19
|
});
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
else if (
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
else if (type === 'conic') {
|
|
35
|
-
// conic-gradient accepts angle like 'from 45deg at 50% 50%'
|
|
36
|
-
if (typeof rotation === 'number')
|
|
37
|
-
prefix = `from ${rotation}deg, `;
|
|
38
|
-
else if (typeof rotation === 'string' && rotation.trim())
|
|
39
|
-
prefix = `${rotation.trim()}, `;
|
|
40
|
-
}
|
|
41
|
-
return `${type}-gradient(${prefix}${parts.join(', ')})`;
|
|
20
|
+
const kind = type.replace('repeating-', '');
|
|
21
|
+
let prefix = options.trim();
|
|
22
|
+
if (!prefix && kind === 'linear') {
|
|
23
|
+
prefix = typeof rotation === 'number' ? `${rotation}deg` : rotation.trim();
|
|
24
|
+
}
|
|
25
|
+
else if (!prefix && kind === 'radial') {
|
|
26
|
+
prefix = typeof rotation === 'string' && rotation.trim() ? rotation.trim() : 'circle';
|
|
27
|
+
}
|
|
28
|
+
else if (!prefix && kind === 'conic') {
|
|
29
|
+
prefix = typeof rotation === 'number' ? `from ${rotation}deg` : rotation.trim();
|
|
30
|
+
}
|
|
31
|
+
return `${type}-gradient(${prefix ? `${prefix}, ` : ''}${parts.join(', ')})`;
|
|
42
32
|
}
|
|
43
33
|
function generateRandomColor() {
|
|
44
34
|
const letters = '0123456789ABCDEF';
|
|
45
35
|
let color = '#';
|
|
46
|
-
for (let i = 0; i < 6; i++)
|
|
36
|
+
for (let i = 0; i < 6; i++)
|
|
47
37
|
color += letters[Math.floor(Math.random() * 16)];
|
|
48
|
-
}
|
|
49
38
|
return color;
|
|
50
39
|
}
|
|
51
40
|
function isValidGradient(value) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
return /^\s*(conic|linear|radial)-gradient\s*\(/i.test(value.trim());
|
|
41
|
+
return (typeof value === 'string' &&
|
|
42
|
+
/^\s*(?:repeating-)?(?:conic|linear|radial)-gradient\s*\(/i.test(value));
|
|
55
43
|
}
|
|
56
|
-
/**
|
|
57
|
-
* parseGradient
|
|
58
|
-
* - returns: { type, rotation (number|string), stops, valid }
|
|
59
|
-
* - stops: array of { id, color, value } where value is 0..100 (percent)
|
|
60
|
-
* - rotation: number (deg) for linear if parsed as angle, or string (e.g. 'to right' or '45deg')
|
|
61
|
-
*/
|
|
62
44
|
function parseGradient(value) {
|
|
63
45
|
let type = 'linear';
|
|
64
46
|
let rotation = 180;
|
|
47
|
+
let options = '';
|
|
65
48
|
let shape;
|
|
66
|
-
|
|
49
|
+
const stops = [];
|
|
67
50
|
let valid = false;
|
|
68
51
|
if (!value)
|
|
69
|
-
return { type, rotation, shape, stops, valid };
|
|
70
|
-
const match = value
|
|
52
|
+
return { type, rotation, options, shape, stops, valid };
|
|
53
|
+
const match = value
|
|
54
|
+
.trim()
|
|
55
|
+
.match(/^((?:repeating-)?(?:conic|linear|radial))-gradient\s*\((.*)\)$/i);
|
|
71
56
|
if (!match)
|
|
72
|
-
return { type, rotation, shape, stops, valid };
|
|
73
|
-
type = match[
|
|
74
|
-
|
|
75
|
-
|
|
57
|
+
return { type, rotation, options, shape, stops, valid };
|
|
58
|
+
type = match[1].toLowerCase();
|
|
59
|
+
const parts = splitGradientArguments(match[2]);
|
|
60
|
+
const first = parts[0] ?? '';
|
|
61
|
+
const kind = type.replace('repeating-', '');
|
|
62
|
+
const hasPrelude = kind === 'linear'
|
|
63
|
+
? /^(?:to\s+|in\s+|[-+]?(?:\d*\.)?\d+(?:deg|grad|rad|turn)\b)/i.test(first)
|
|
64
|
+
: kind === 'radial'
|
|
65
|
+
? /^(?:(?:circle|ellipse|closest-side|closest-corner|farthest-side|farthest-corner)\b|at\s+)/i.test(first) || !parseColorStop(first)
|
|
66
|
+
: /^(?:from\s+|at\s+)/i.test(first) || !parseColorStop(first);
|
|
67
|
+
let firstStop = 0;
|
|
68
|
+
if (hasPrelude) {
|
|
69
|
+
options = first;
|
|
70
|
+
firstStop = 1;
|
|
71
|
+
const angle = first.match(/(?:from\s+)?([-+]?(?:\d*\.)?\d+)(deg|grad|rad|turn)\b/i);
|
|
72
|
+
if (angle)
|
|
73
|
+
rotation = angleToDegrees(Number(angle[1]), angle[2]);
|
|
74
|
+
if (kind === 'radial')
|
|
75
|
+
shape = first;
|
|
76
|
+
}
|
|
77
|
+
else if (kind === 'conic') {
|
|
78
|
+
rotation = 0;
|
|
79
|
+
}
|
|
80
|
+
for (let i = firstStop; i < parts.length; i++) {
|
|
81
|
+
const parsed = parseColorStop(parts[i]);
|
|
82
|
+
if (!parsed)
|
|
83
|
+
continue;
|
|
84
|
+
let position = parsed.position;
|
|
85
|
+
if (position === undefined) {
|
|
86
|
+
position =
|
|
87
|
+
stops.length === 0
|
|
88
|
+
? 0
|
|
89
|
+
: i === parts.length - 1
|
|
90
|
+
? 100
|
|
91
|
+
: (100 / (parts.length - firstStop - 1)) * stops.length;
|
|
92
|
+
}
|
|
93
|
+
stops.push({ color: parsed.color, value: position, id: generateId(stops) });
|
|
94
|
+
}
|
|
95
|
+
valid = stops.length >= 2;
|
|
96
|
+
return { type, rotation, options, shape, stops, valid };
|
|
97
|
+
}
|
|
98
|
+
function splitGradientArguments(value) {
|
|
76
99
|
const parts = [];
|
|
77
|
-
let buf = '';
|
|
78
100
|
let depth = 0;
|
|
79
|
-
|
|
80
|
-
|
|
101
|
+
let start = 0;
|
|
102
|
+
for (let i = 0; i < value.length; i++) {
|
|
103
|
+
if (value[i] === '(')
|
|
81
104
|
depth++;
|
|
82
|
-
if (
|
|
105
|
+
else if (value[i] === ')')
|
|
83
106
|
depth--;
|
|
84
|
-
if (
|
|
85
|
-
parts.push(
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
buf += c;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
if (buf.trim())
|
|
93
|
-
parts.push(buf.trim());
|
|
94
|
-
// --- Determine starting index for color stops
|
|
95
|
-
let colorStopStart = 0;
|
|
96
|
-
const first = parts[0];
|
|
97
|
-
if (type === 'linear') {
|
|
98
|
-
// e.g., "90deg" or "to right"
|
|
99
|
-
const angleMatch = first.match(/^(\d+)(deg)?$/i);
|
|
100
|
-
if (angleMatch) {
|
|
101
|
-
rotation = parseFloat(angleMatch[1]);
|
|
102
|
-
colorStopStart = 1;
|
|
103
|
-
}
|
|
104
|
-
else if (/^to /i.test(first)) {
|
|
105
|
-
// optional direction mapping
|
|
106
|
-
colorStopStart = 1;
|
|
107
|
+
else if (value[i] === ',' && depth === 0) {
|
|
108
|
+
parts.push(value.slice(start, i).trim());
|
|
109
|
+
start = i + 1;
|
|
107
110
|
}
|
|
108
111
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
parts.push(value.slice(start).trim());
|
|
113
|
+
return parts.filter(Boolean);
|
|
114
|
+
}
|
|
115
|
+
function parseColorStop(value) {
|
|
116
|
+
const stop = value.trim();
|
|
117
|
+
const positionMatch = stop.match(/\s+([-+]?(?:\d*\.)?\d+)%?$/);
|
|
118
|
+
const color = positionMatch ? stop.slice(0, positionMatch.index).trim() : stop;
|
|
119
|
+
if (!/^(?:#[\da-f]{3,8}|[a-z][\w-]*|[a-z][\w-]*\()/i.test(color))
|
|
120
|
+
return undefined;
|
|
121
|
+
if (color.includes('(')) {
|
|
122
|
+
let depth = 0;
|
|
123
|
+
for (const char of color) {
|
|
124
|
+
if (char === '(')
|
|
125
|
+
depth++;
|
|
126
|
+
else if (char === ')')
|
|
127
|
+
depth--;
|
|
128
|
+
if (depth < 0)
|
|
129
|
+
return undefined;
|
|
114
130
|
}
|
|
131
|
+
if (depth !== 0 || !/\)$/.test(color))
|
|
132
|
+
return undefined;
|
|
115
133
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
const posStr = m[9];
|
|
129
|
-
let value = 0;
|
|
130
|
-
if (posStr && posStr.endsWith('%'))
|
|
131
|
-
value = parseFloat(posStr);
|
|
132
|
-
else if (posStr)
|
|
133
|
-
value = parseFloat(posStr);
|
|
134
|
-
else {
|
|
135
|
-
// اگر درصدی وجود نداشت، با توجه به ایندکس مقدار دهی کن
|
|
136
|
-
if (stops.length === 0)
|
|
137
|
-
value = 0;
|
|
138
|
-
else if (i === parts.length - 1)
|
|
139
|
-
value = 100;
|
|
140
|
-
else
|
|
141
|
-
value = (100 / (parts.length - colorStopStart - 1)) * stops.length;
|
|
142
|
-
}
|
|
143
|
-
stops.push({ color, value, id: generateId(stops) });
|
|
144
|
-
}
|
|
134
|
+
return { color, position: positionMatch ? Number.parseFloat(positionMatch[1]) : undefined };
|
|
135
|
+
}
|
|
136
|
+
function angleToDegrees(value, unit) {
|
|
137
|
+
switch (unit.toLowerCase()) {
|
|
138
|
+
case 'turn':
|
|
139
|
+
return value * 360;
|
|
140
|
+
case 'grad':
|
|
141
|
+
return value * 0.9;
|
|
142
|
+
case 'rad':
|
|
143
|
+
return value * (180 / Math.PI);
|
|
144
|
+
default:
|
|
145
|
+
return value;
|
|
145
146
|
}
|
|
146
|
-
valid = stops.length >= 2;
|
|
147
|
-
return { type, rotation, shape, stops, valid };
|
|
148
147
|
}
|
|
149
|
-
function generateId(
|
|
148
|
+
function generateId(stops) {
|
|
150
149
|
const id = 'ngx-stop-' + Math.random().toString(36).substring(2, 9);
|
|
151
|
-
return
|
|
150
|
+
return stops.some((stop) => stop.id === id) ? generateId(stops) : id;
|
|
152
151
|
}
|
|
153
152
|
|
|
154
153
|
const DefaultGradients = [
|
|
@@ -260,14 +259,16 @@ const DefaultGradients = [
|
|
|
260
259
|
|
|
261
260
|
class NgxInputGradientComponent {
|
|
262
261
|
cd;
|
|
263
|
-
|
|
264
|
-
|
|
262
|
+
showSamples = input(true, /* @ts-ignore */
|
|
263
|
+
...(ngDevMode ? [{ debugName: "showSamples" }] : /* istanbul ignore next */ []));
|
|
264
|
+
change = output();
|
|
265
265
|
defaultGradients = [];
|
|
266
266
|
resultGradient = '';
|
|
267
267
|
baseBg = '';
|
|
268
268
|
rangeValues = [];
|
|
269
269
|
type = 'linear';
|
|
270
270
|
rotation = 90;
|
|
271
|
+
gradientOptions = '';
|
|
271
272
|
selectedIndex = 0;
|
|
272
273
|
isDisabled = false;
|
|
273
274
|
_onChange = (value) => { };
|
|
@@ -309,7 +310,8 @@ class NgxInputGradientComponent {
|
|
|
309
310
|
if (parsed.valid) {
|
|
310
311
|
this.resultGradient = value;
|
|
311
312
|
this.type = parsed.type;
|
|
312
|
-
this.rotation =
|
|
313
|
+
this.rotation = parsed.rotation;
|
|
314
|
+
this.gradientOptions = parsed.options;
|
|
313
315
|
this.rangeValues = parsed.stops;
|
|
314
316
|
}
|
|
315
317
|
else {
|
|
@@ -320,6 +322,7 @@ class NgxInputGradientComponent {
|
|
|
320
322
|
];
|
|
321
323
|
this.type = 'linear';
|
|
322
324
|
this.rotation = 90;
|
|
325
|
+
this.gradientOptions = '';
|
|
323
326
|
}
|
|
324
327
|
}
|
|
325
328
|
else {
|
|
@@ -330,6 +333,7 @@ class NgxInputGradientComponent {
|
|
|
330
333
|
];
|
|
331
334
|
this.type = 'linear';
|
|
332
335
|
this.rotation = 90;
|
|
336
|
+
this.gradientOptions = '';
|
|
333
337
|
}
|
|
334
338
|
this.generateGradient();
|
|
335
339
|
}
|
|
@@ -358,9 +362,17 @@ class NgxInputGradientComponent {
|
|
|
358
362
|
item.color ??= generateRandomColor();
|
|
359
363
|
}
|
|
360
364
|
this.baseBg = buildGradientFromStops(this.rangeValues, 'linear', 90);
|
|
361
|
-
this.resultGradient = buildGradientFromStops(this.rangeValues, this.type,
|
|
365
|
+
this.resultGradient = buildGradientFromStops(this.rangeValues, this.type, this.rotation, this.gradientOptions);
|
|
362
366
|
this.emitChange();
|
|
363
367
|
}
|
|
368
|
+
updateGradientType() {
|
|
369
|
+
this.gradientOptions = '';
|
|
370
|
+
this.generateGradient();
|
|
371
|
+
}
|
|
372
|
+
updateRotation() {
|
|
373
|
+
this.gradientOptions = '';
|
|
374
|
+
this.generateGradient();
|
|
375
|
+
}
|
|
364
376
|
updateRangeSlider() {
|
|
365
377
|
if (this.rangeSlider) {
|
|
366
378
|
this.rangeSlider.writeValue(this.rangeValues);
|
|
@@ -382,7 +394,7 @@ class NgxInputGradientComponent {
|
|
|
382
394
|
this.emitChange();
|
|
383
395
|
}
|
|
384
396
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxInputGradientComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
385
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxInputGradientComponent, isStandalone: true, selector: "ngx-input-gradient", outputs: { change: "change" }, providers: [
|
|
397
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxInputGradientComponent, isStandalone: true, selector: "ngx-input-gradient", inputs: { showSamples: { classPropertyName: "showSamples", publicName: "showSamples", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { change: "change" }, providers: [
|
|
386
398
|
{
|
|
387
399
|
provide: NG_VALUE_ACCESSOR,
|
|
388
400
|
useExisting: forwardRef(() => NgxInputGradientComponent),
|
|
@@ -393,7 +405,7 @@ class NgxInputGradientComponent {
|
|
|
393
405
|
multi: true,
|
|
394
406
|
useExisting: NgxInputGradientComponent,
|
|
395
407
|
},
|
|
396
|
-
], viewQueries: [{ propertyName: "rangeSlider", first: true, predicate: ["rangeSlider"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"ngx-input-gradient-picker\" (click)=\"stopPropagation($event)\">\n <div class=\"ngx-color-preview\" [ngStyle]=\"{ '--ngx-selected-gradient': resultGradient }\"></div>\n <div class=\"ngx-c-inner\">\n <range-slider\n [(ngModel)]=\"rangeValues\"\n name=\"rangeCalues\"\n [min]=\"0\"\n [max]=\"100\"\n [step]=\"1\"\n [addNewRangeOnClick]=\"true\"\n [background]=\"baseBg\"\n [(selectedIndex)]=\"selectedIndex\"\n (change)=\"generateGradient()\"\n #rangeSlider></range-slider>\n\n <div class=\"text-end\">\n <button class=\"remove-btn\" type=\"button\" (click)=\"remove()\">remove</button>\n </div>\n @if (rangeValues[selectedIndex]) {\n <div class=\"ngx-row\">\n <div class=\"ngx-col-6\">\n <div class=\"label\">Color</div>\n <div class=\"input-color\">\n <input\n type=\"text\"\n [(ngModel)]=\"rangeValues[selectedIndex].color\"\n name=\"color\"\n #inputColor\n (ngModelChange)=\"generateGradient(); updateRangeSlider()\" />\n <span\n #ngxGradColor\n class=\"color\"\n [style.backgroundColor]=\"rangeValues[selectedIndex].color\"\n [ngxInputColor]=\"inputColor\"\n [ngModel]=\"rangeValues[selectedIndex].color\"\n [simpleMode]=\"true\"\n (change)=\"generateGradient($event)\"></span>\n </div>\n </div>\n <div class=\"ngx-col-6\">\n <div class=\"label\">Position</div>\n <input\n type=\"number\"\n [(ngModel)]=\"rangeValues[selectedIndex].value\"\n min=\"0\"\n max=\"100\"\n name=\"posiition\"\n (change)=\"generateGradient(); updateRangeSlider()\" />\n </div>\n <div class=\"ngx-col-6\">\n <div class=\"label\">Rotation</div>\n <div class=\"ngx-input-group\">\n <input\n type=\"text\"\n [(ngModel)]=\"rotation\"\n ngxInputAngle\n (change)=\"
|
|
408
|
+
], viewQueries: [{ propertyName: "rangeSlider", first: true, predicate: ["rangeSlider"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"ngx-input-gradient-picker\" (click)=\"stopPropagation($event)\">\n <div class=\"ngx-color-preview\" [ngStyle]=\"{ '--ngx-selected-gradient': resultGradient }\"></div>\n <div class=\"ngx-c-inner\">\n <range-slider\n [(ngModel)]=\"rangeValues\"\n name=\"rangeCalues\"\n [min]=\"0\"\n [max]=\"100\"\n [step]=\"1\"\n [addNewRangeOnClick]=\"true\"\n [background]=\"baseBg\"\n [(selectedIndex)]=\"selectedIndex\"\n (change)=\"generateGradient()\"\n #rangeSlider></range-slider>\n\n <div class=\"text-end\">\n <button class=\"remove-btn\" type=\"button\" (click)=\"remove()\">remove</button>\n </div>\n @if (rangeValues[selectedIndex]) {\n <div class=\"ngx-row\">\n <div class=\"ngx-col-6\">\n <div class=\"label\">Color</div>\n <div class=\"input-color\">\n <input\n type=\"text\"\n [(ngModel)]=\"rangeValues[selectedIndex].color\"\n name=\"color\"\n #inputColor\n (ngModelChange)=\"generateGradient(); updateRangeSlider()\" />\n <span\n #ngxGradColor\n class=\"color\"\n [style.backgroundColor]=\"rangeValues[selectedIndex].color\"\n [ngxInputColor]=\"inputColor\"\n [ngModel]=\"rangeValues[selectedIndex].color\"\n [simpleMode]=\"true\"\n (change)=\"generateGradient($event)\"></span>\n </div>\n </div>\n <div class=\"ngx-col-6\">\n <div class=\"label\">Position</div>\n <input\n type=\"number\"\n [(ngModel)]=\"rangeValues[selectedIndex].value\"\n min=\"0\"\n max=\"100\"\n name=\"posiition\"\n (change)=\"generateGradient(); updateRangeSlider()\" />\n </div>\n <div class=\"ngx-col-6\">\n <div class=\"label\">Rotation</div>\n <div class=\"ngx-input-group\">\n <input\n type=\"text\"\n [(ngModel)]=\"rotation\"\n ngxInputAngle\n (change)=\"updateRotation()\"\n name=\"rotation\"\n [disabled]=\"type.endsWith('radial')\" />\n <span class=\"ngx-input-prefix\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\">\n <path\n d=\"M360.5 217.5l-152 143.1C203.9 365.8 197.9 368 192 368s-11.88-2.188-16.5-6.562L23.5 217.5C13.87 208.3 13.47 193.1 22.56 183.5C31.69 173.8 46.94 173.5 56.5 182.6L192 310.9l135.5-128.4c9.562-9.094 24.75-8.75 33.94 .9375C370.5 193.1 370.1 208.3 360.5 217.5z\" />\n </svg>\n </span>\n </div>\n </div>\n <div class=\"ngx-col-6\">\n <div class=\"label\">Type</div>\n <div class=\"ngx-input-group\">\n <select [(ngModel)]=\"type\" (change)=\"updateGradientType()\" name=\"type\">\n <option value=\"linear\">linear</option>\n <option value=\"radial\">radial</option>\n <option value=\"conic\">conic</option>\n <option value=\"repeating-linear\">repeating linear</option>\n <option value=\"repeating-radial\">repeating radial</option>\n <option value=\"repeating-conic\">repeating conic</option>\n </select>\n <span class=\"ngx-input-prefix\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\">\n <path\n d=\"M360.5 217.5l-152 143.1C203.9 365.8 197.9 368 192 368s-11.88-2.188-16.5-6.562L23.5 217.5C13.87 208.3 13.47 193.1 22.56 183.5C31.69 173.8 46.94 173.5 56.5 182.6L192 310.9l135.5-128.4c9.562-9.094 24.75-8.75 33.94 .9375C370.5 193.1 370.1 208.3 360.5 217.5z\" />\n </svg>\n </span>\n </div>\n </div>\n </div>\n }\n\n @if (showSamples()) {\n <div class=\"default-list\">\n @for (item of defaultGradients; track $index; let i = $index) {\n <span [style.background]=\"item\" (click)=\"onSelectDefault(item, i)\"></span>\n }\n </div>\n }\n </div>\n</div>\n", styles: [":host{--ngx-color-bg: light-dark(#fff, #222);--ngx-color-text: light-dark(#000, #fff)}.ngx-input-gradient-picker{width:270px;max-width:100%;border-radius:15px;background:var(--ngx-color-bg);color:var(--ngx-color-text);overflow:hidden;direction:ltr;font-family:arial,tahoma;border:1px rgba(134,134,134,.3490196078) solid;box-shadow:0 0 20px #7a7a7a21}.ngx-input-gradient-picker .ngx-c-inner{padding:0 12px 12px}.ngx-input-gradient-picker *{box-sizing:border-box}.ngx-color-preview{min-height:100px;padding:10px 36px;line-height:1.6;font-size:14px;font-family:arial,tahoma;font-weight:700;position:relative;color:#353535;background-color:#fff}.ngx-color-preview.is-dark-color{color:#fff}.ngx-color-preview:after,.ngx-color-preview:before{content:\" \";position:absolute;inset:0}.ngx-color-preview:before{background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0px}.ngx-color-preview:after{background:var(--ngx-selected-gradient)}.ngx-row{display:flex;flex-wrap:wrap;gap:12px}.ngx-row .ngx-col-6{width:47%}.ngx-row .ngx-input-group{display:flex}.ngx-row .ngx-input-group .ngx-input-prefix,.ngx-row .ngx-input-group .ngx-input-group-text{width:14px;margin-left:-28px;margin-top:6px;pointer-events:none}.ngx-row .ngx-input-group .ngx-input-prefix svg,.ngx-row .ngx-input-group .ngx-input-group-text svg{max-width:100%;max-height:100%;fill:var(--ngx-color-text)}.ngx-row .input-color{position:relative}.ngx-row .input-color input{padding-right:26px}.ngx-row .input-color .color{position:absolute;top:4px;right:5px;cursor:pointer;display:inline-block;width:24px;height:24px;border-radius:4px;border:1px solid #ccc;transition:all .3s}.ngx-row .input-color .color:hover{border-color:#8db6e4}.ngx-row select,.ngx-row input{outline:none;border:1px solid #ececec;border-radius:4px;padding:8px 10px;background:none;width:100%;color:var(--ngx-color-text);appearance:none}.ngx-row select option,.ngx-row input option{padding:10px 20px;background-color:#fff;transition:all .3s;background:var(--ngx-color-bg);color:var(--ngx-color-text)}.ngx-row select option:hover,.ngx-row input option:hover{background:#f0f0f0}.ngx-row select:disabled,.ngx-row input:disabled{cursor:not-allowed;opacity:.7}.text-end{text-align:end}.remove-btn{background:none;border:none;outline:none;color:#07f;transition:color .3s}.remove-btn:hover{color:#0462cc}.default-list{display:flex;gap:5px;flex-wrap:wrap;margin-top:16px}.default-list span{width:36px;height:26px;border-radius:4px;cursor:pointer;transition:transform .3s}.default-list span:hover{transform:scale(1.2)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.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: i2.NumberValueAccessor, selector: "input[type=number]:not([ngNoCva])[formControlName],input[type=number]:not([ngNoCva])[formControl],input[type=number]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: RangeSliderComponent, selector: "range-slider", inputs: ["step", "min", "max", "background", "isBgTransparent", "addNewRangeOnClick", "selectedIndex"], outputs: ["change", "selectedIndexChange"] }, { kind: "directive", type: NgxInputColor, selector: "[ngxInputColor]", inputs: ["setInputBackgroundColor", "simpleMode", "outputType", "defaultInspector", "useAlphaChannel", "showPresets", "presetColors", "ngxInputColor"], outputs: ["defaultInspectorChange", "colorChange", "change"], exportAs: ["ngxInputColor"] }, { kind: "directive", type: NgxInputAngle, selector: "[ngxInputAngle]", inputs: ["size", "openOnCLick"], outputs: ["change"], exportAs: ["ngxInputAngle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
397
409
|
}
|
|
398
410
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxInputGradientComponent, decorators: [{
|
|
399
411
|
type: Component,
|
|
@@ -408,10 +420,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
|
|
|
408
420
|
multi: true,
|
|
409
421
|
useExisting: NgxInputGradientComponent,
|
|
410
422
|
},
|
|
411
|
-
], imports: [CommonModule, FormsModule, RangeSliderComponent, NgxInputColor, NgxInputAngle], template: "<div class=\"ngx-input-gradient-picker\" (click)=\"stopPropagation($event)\">\n <div class=\"ngx-color-preview\" [ngStyle]=\"{ '--ngx-selected-gradient': resultGradient }\"></div>\n <div class=\"ngx-c-inner\">\n <range-slider\n [(ngModel)]=\"rangeValues\"\n name=\"rangeCalues\"\n [min]=\"0\"\n [max]=\"100\"\n [step]=\"1\"\n [addNewRangeOnClick]=\"true\"\n [background]=\"baseBg\"\n [(selectedIndex)]=\"selectedIndex\"\n (change)=\"generateGradient()\"\n #rangeSlider></range-slider>\n\n <div class=\"text-end\">\n <button class=\"remove-btn\" type=\"button\" (click)=\"remove()\">remove</button>\n </div>\n @if (rangeValues[selectedIndex]) {\n <div class=\"ngx-row\">\n <div class=\"ngx-col-6\">\n <div class=\"label\">Color</div>\n <div class=\"input-color\">\n <input\n type=\"text\"\n [(ngModel)]=\"rangeValues[selectedIndex].color\"\n name=\"color\"\n #inputColor\n (ngModelChange)=\"generateGradient(); updateRangeSlider()\" />\n <span\n #ngxGradColor\n class=\"color\"\n [style.backgroundColor]=\"rangeValues[selectedIndex].color\"\n [ngxInputColor]=\"inputColor\"\n [ngModel]=\"rangeValues[selectedIndex].color\"\n [simpleMode]=\"true\"\n (change)=\"generateGradient($event)\"></span>\n </div>\n </div>\n <div class=\"ngx-col-6\">\n <div class=\"label\">Position</div>\n <input\n type=\"number\"\n [(ngModel)]=\"rangeValues[selectedIndex].value\"\n min=\"0\"\n max=\"100\"\n name=\"posiition\"\n (change)=\"generateGradient(); updateRangeSlider()\" />\n </div>\n <div class=\"ngx-col-6\">\n <div class=\"label\">Rotation</div>\n <div class=\"ngx-input-group\">\n <input\n type=\"text\"\n [(ngModel)]=\"rotation\"\n ngxInputAngle\n (change)=\"
|
|
412
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { change: [{
|
|
413
|
-
type: Output
|
|
414
|
-
}], rangeSlider: [{
|
|
423
|
+
], imports: [CommonModule, FormsModule, RangeSliderComponent, NgxInputColor, NgxInputAngle], template: "<div class=\"ngx-input-gradient-picker\" (click)=\"stopPropagation($event)\">\n <div class=\"ngx-color-preview\" [ngStyle]=\"{ '--ngx-selected-gradient': resultGradient }\"></div>\n <div class=\"ngx-c-inner\">\n <range-slider\n [(ngModel)]=\"rangeValues\"\n name=\"rangeCalues\"\n [min]=\"0\"\n [max]=\"100\"\n [step]=\"1\"\n [addNewRangeOnClick]=\"true\"\n [background]=\"baseBg\"\n [(selectedIndex)]=\"selectedIndex\"\n (change)=\"generateGradient()\"\n #rangeSlider></range-slider>\n\n <div class=\"text-end\">\n <button class=\"remove-btn\" type=\"button\" (click)=\"remove()\">remove</button>\n </div>\n @if (rangeValues[selectedIndex]) {\n <div class=\"ngx-row\">\n <div class=\"ngx-col-6\">\n <div class=\"label\">Color</div>\n <div class=\"input-color\">\n <input\n type=\"text\"\n [(ngModel)]=\"rangeValues[selectedIndex].color\"\n name=\"color\"\n #inputColor\n (ngModelChange)=\"generateGradient(); updateRangeSlider()\" />\n <span\n #ngxGradColor\n class=\"color\"\n [style.backgroundColor]=\"rangeValues[selectedIndex].color\"\n [ngxInputColor]=\"inputColor\"\n [ngModel]=\"rangeValues[selectedIndex].color\"\n [simpleMode]=\"true\"\n (change)=\"generateGradient($event)\"></span>\n </div>\n </div>\n <div class=\"ngx-col-6\">\n <div class=\"label\">Position</div>\n <input\n type=\"number\"\n [(ngModel)]=\"rangeValues[selectedIndex].value\"\n min=\"0\"\n max=\"100\"\n name=\"posiition\"\n (change)=\"generateGradient(); updateRangeSlider()\" />\n </div>\n <div class=\"ngx-col-6\">\n <div class=\"label\">Rotation</div>\n <div class=\"ngx-input-group\">\n <input\n type=\"text\"\n [(ngModel)]=\"rotation\"\n ngxInputAngle\n (change)=\"updateRotation()\"\n name=\"rotation\"\n [disabled]=\"type.endsWith('radial')\" />\n <span class=\"ngx-input-prefix\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\">\n <path\n d=\"M360.5 217.5l-152 143.1C203.9 365.8 197.9 368 192 368s-11.88-2.188-16.5-6.562L23.5 217.5C13.87 208.3 13.47 193.1 22.56 183.5C31.69 173.8 46.94 173.5 56.5 182.6L192 310.9l135.5-128.4c9.562-9.094 24.75-8.75 33.94 .9375C370.5 193.1 370.1 208.3 360.5 217.5z\" />\n </svg>\n </span>\n </div>\n </div>\n <div class=\"ngx-col-6\">\n <div class=\"label\">Type</div>\n <div class=\"ngx-input-group\">\n <select [(ngModel)]=\"type\" (change)=\"updateGradientType()\" name=\"type\">\n <option value=\"linear\">linear</option>\n <option value=\"radial\">radial</option>\n <option value=\"conic\">conic</option>\n <option value=\"repeating-linear\">repeating linear</option>\n <option value=\"repeating-radial\">repeating radial</option>\n <option value=\"repeating-conic\">repeating conic</option>\n </select>\n <span class=\"ngx-input-prefix\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 384 512\">\n <path\n d=\"M360.5 217.5l-152 143.1C203.9 365.8 197.9 368 192 368s-11.88-2.188-16.5-6.562L23.5 217.5C13.87 208.3 13.47 193.1 22.56 183.5C31.69 173.8 46.94 173.5 56.5 182.6L192 310.9l135.5-128.4c9.562-9.094 24.75-8.75 33.94 .9375C370.5 193.1 370.1 208.3 360.5 217.5z\" />\n </svg>\n </span>\n </div>\n </div>\n </div>\n }\n\n @if (showSamples()) {\n <div class=\"default-list\">\n @for (item of defaultGradients; track $index; let i = $index) {\n <span [style.background]=\"item\" (click)=\"onSelectDefault(item, i)\"></span>\n }\n </div>\n }\n </div>\n</div>\n", styles: [":host{--ngx-color-bg: light-dark(#fff, #222);--ngx-color-text: light-dark(#000, #fff)}.ngx-input-gradient-picker{width:270px;max-width:100%;border-radius:15px;background:var(--ngx-color-bg);color:var(--ngx-color-text);overflow:hidden;direction:ltr;font-family:arial,tahoma;border:1px rgba(134,134,134,.3490196078) solid;box-shadow:0 0 20px #7a7a7a21}.ngx-input-gradient-picker .ngx-c-inner{padding:0 12px 12px}.ngx-input-gradient-picker *{box-sizing:border-box}.ngx-color-preview{min-height:100px;padding:10px 36px;line-height:1.6;font-size:14px;font-family:arial,tahoma;font-weight:700;position:relative;color:#353535;background-color:#fff}.ngx-color-preview.is-dark-color{color:#fff}.ngx-color-preview:after,.ngx-color-preview:before{content:\" \";position:absolute;inset:0}.ngx-color-preview:before{background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:16px 16px;background-position:0 0,0 8px,8px -8px,-8px 0px}.ngx-color-preview:after{background:var(--ngx-selected-gradient)}.ngx-row{display:flex;flex-wrap:wrap;gap:12px}.ngx-row .ngx-col-6{width:47%}.ngx-row .ngx-input-group{display:flex}.ngx-row .ngx-input-group .ngx-input-prefix,.ngx-row .ngx-input-group .ngx-input-group-text{width:14px;margin-left:-28px;margin-top:6px;pointer-events:none}.ngx-row .ngx-input-group .ngx-input-prefix svg,.ngx-row .ngx-input-group .ngx-input-group-text svg{max-width:100%;max-height:100%;fill:var(--ngx-color-text)}.ngx-row .input-color{position:relative}.ngx-row .input-color input{padding-right:26px}.ngx-row .input-color .color{position:absolute;top:4px;right:5px;cursor:pointer;display:inline-block;width:24px;height:24px;border-radius:4px;border:1px solid #ccc;transition:all .3s}.ngx-row .input-color .color:hover{border-color:#8db6e4}.ngx-row select,.ngx-row input{outline:none;border:1px solid #ececec;border-radius:4px;padding:8px 10px;background:none;width:100%;color:var(--ngx-color-text);appearance:none}.ngx-row select option,.ngx-row input option{padding:10px 20px;background-color:#fff;transition:all .3s;background:var(--ngx-color-bg);color:var(--ngx-color-text)}.ngx-row select option:hover,.ngx-row input option:hover{background:#f0f0f0}.ngx-row select:disabled,.ngx-row input:disabled{cursor:not-allowed;opacity:.7}.text-end{text-align:end}.remove-btn{background:none;border:none;outline:none;color:#07f;transition:color .3s}.remove-btn:hover{color:#0462cc}.default-list{display:flex;gap:5px;flex-wrap:wrap;margin-top:16px}.default-list span{width:36px;height:26px;border-radius:4px;cursor:pointer;transition:transform .3s}.default-list span:hover{transform:scale(1.2)}\n"] }]
|
|
424
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { showSamples: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSamples", required: false }] }], change: [{ type: i0.Output, args: ["change"] }], rangeSlider: [{
|
|
415
425
|
type: ViewChild,
|
|
416
426
|
args: ['rangeSlider', { static: true }]
|
|
417
427
|
}] } });
|