react-iro-gradient-picker 1.2.3 → 1.2.5
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/dist/index.es.js +202 -34
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +202 -33
- package/dist/index.js.map +1 -1
- package/dist/lib/types/types.d.ts +13 -1
- package/dist/utils/gradient/gradientConverter.d.ts +7 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
@@ -6438,10 +6438,20 @@ var validGradient = (function (input) {
|
|
6438
6438
|
var colorStops = [];
|
6439
6439
|
// Determine if first part is direction/angle or color stop
|
6440
6440
|
var firstPart = parts[0];
|
6441
|
-
var isDirection =
|
6442
|
-
|
6443
|
-
|
6444
|
-
|
6441
|
+
var isDirection = false;
|
6442
|
+
if (type === 'linear') {
|
6443
|
+
isDirection =
|
6444
|
+
/^\d+deg$/i.test(firstPart) ||
|
6445
|
+
/^to\s+/.test(firstPart);
|
6446
|
+
}
|
6447
|
+
else if (type === 'radial') {
|
6448
|
+
// For radial gradients, check for size, shape, or position keywords
|
6449
|
+
isDirection =
|
6450
|
+
/^(?:circle|ellipse)/.test(firstPart) ||
|
6451
|
+
/at\s+/.test(firstPart) ||
|
6452
|
+
/^(?:closest-side|closest-corner|farthest-side|farthest-corner)$/i.test(firstPart) ||
|
6453
|
+
/^\d+(?:%|px|em|rem)?$/i.test(firstPart); // Size values like "70", "70%", "70px"
|
6454
|
+
}
|
6445
6455
|
if (isDirection) {
|
6446
6456
|
if (type === 'linear') {
|
6447
6457
|
if (/^\d+deg$/i.test(firstPart)) {
|
@@ -6478,10 +6488,11 @@ var validGradient = (function (input) {
|
|
6478
6488
|
var stops_1 = [];
|
6479
6489
|
for (var i = 0; i < colorStops.length; i++) {
|
6480
6490
|
var stopString = colorStops[i].trim();
|
6481
|
-
//
|
6482
|
-
|
6491
|
+
// Improved regex to handle various gradient stop formats
|
6492
|
+
// Matches: color position%, color position, or just color
|
6493
|
+
var stopMatch = stopString.match(/^(.+?)(?:\s+([\d.]+)(%|px|em|rem)?)?$/);
|
6483
6494
|
if (stopMatch) {
|
6484
|
-
var _b = __read(stopMatch, 4), colorStr = _b[1], positionStr = _b[2],
|
6495
|
+
var _b = __read(stopMatch, 4), colorStr = _b[1], positionStr = _b[2], unit = _b[3];
|
6485
6496
|
var tinyColorInstance = tinycolor(colorStr.trim());
|
6486
6497
|
if (tinyColorInstance.isValid()) {
|
6487
6498
|
var stop_1 = {
|
@@ -6489,14 +6500,21 @@ var validGradient = (function (input) {
|
|
6489
6500
|
};
|
6490
6501
|
if (positionStr) {
|
6491
6502
|
var position = parseFloat(positionStr);
|
6492
|
-
//
|
6493
|
-
if (
|
6503
|
+
// Convert percentage to decimal (0-1 range)
|
6504
|
+
if (unit === '%' || !unit) {
|
6505
|
+
// If no unit specified, assume percentage
|
6494
6506
|
position = position / 100;
|
6495
6507
|
}
|
6496
6508
|
stop_1.position = Math.max(0, Math.min(1, position));
|
6497
6509
|
}
|
6498
6510
|
stops_1.push(stop_1);
|
6499
6511
|
}
|
6512
|
+
else {
|
6513
|
+
console.warn('Invalid color in gradient stop:', colorStr.trim());
|
6514
|
+
}
|
6515
|
+
}
|
6516
|
+
else {
|
6517
|
+
console.warn('Could not parse gradient stop:', stopString);
|
6500
6518
|
}
|
6501
6519
|
}
|
6502
6520
|
// Auto-assign positions if missing
|
@@ -6594,7 +6612,7 @@ var parseGradient = (function (str) {
|
|
6594
6612
|
var helperAngle = type === 'linear' ? '180' : 'circle at center';
|
6595
6613
|
var modifier = findF || angle_1 || helperAngle;
|
6596
6614
|
return {
|
6597
|
-
gradient:
|
6615
|
+
gradient: typeof gradient !== 'string' ? gradient.original : str,
|
6598
6616
|
type: type,
|
6599
6617
|
modifier: modifier.match(/\d+/) !== null
|
6600
6618
|
? Number((_b = modifier.match(/\d+/)) === null || _b === void 0 ? void 0 : _b.join(''))
|
@@ -6611,7 +6629,7 @@ var parseGradient = (function (str) {
|
|
6611
6629
|
});
|
6612
6630
|
|
6613
6631
|
/**
|
6614
|
-
* Convert gradient object to CSS gradient string
|
6632
|
+
* Convert gradient object to CSS gradient string (strict typing)
|
6615
6633
|
*/
|
6616
6634
|
function gradientObjectToCss(gradientData) {
|
6617
6635
|
var type = gradientData.type, _a = gradientData.angle, angle = _a === void 0 ? 90 : _a, stops = gradientData.stops;
|
@@ -6630,6 +6648,38 @@ function gradientObjectToCss(gradientData) {
|
|
6630
6648
|
return "radial-gradient(circle, ".concat(cssStops, ")");
|
6631
6649
|
}
|
6632
6650
|
}
|
6651
|
+
/**
|
6652
|
+
* Convert flexible gradient object to CSS gradient string (loose typing)
|
6653
|
+
*/
|
6654
|
+
function flexibleGradientToCss(gradientData) {
|
6655
|
+
var _a = gradientData.type, type = _a === void 0 ? 'linear' : _a, angle = gradientData.angle, direction = gradientData.direction, position = gradientData.position, stops = gradientData.stops;
|
6656
|
+
// Convert stops to CSS format with flexible position handling
|
6657
|
+
var cssStops = stops
|
6658
|
+
.map(function (stop) {
|
6659
|
+
var color = tinycolor(stop.color);
|
6660
|
+
var positionStr = '';
|
6661
|
+
if (stop.position !== undefined) {
|
6662
|
+
if (typeof stop.position === 'string') {
|
6663
|
+
positionStr = " ".concat(stop.position);
|
6664
|
+
}
|
6665
|
+
else {
|
6666
|
+
positionStr = " ".concat(stop.position, "%");
|
6667
|
+
}
|
6668
|
+
}
|
6669
|
+
return "".concat(color.toRgbString()).concat(positionStr);
|
6670
|
+
})
|
6671
|
+
.join(', ');
|
6672
|
+
if (type === 'linear') {
|
6673
|
+
// Use direction if provided, otherwise use angle
|
6674
|
+
var gradientDirection = direction || (angle ? "".concat(angle, "deg") : '90deg');
|
6675
|
+
return "linear-gradient(".concat(gradientDirection, ", ").concat(cssStops, ")");
|
6676
|
+
}
|
6677
|
+
else {
|
6678
|
+
// Handle radial gradients with flexible positioning
|
6679
|
+
var radialPosition = position || 'circle';
|
6680
|
+
return "radial-gradient(".concat(radialPosition, ", ").concat(cssStops, ")");
|
6681
|
+
}
|
6682
|
+
}
|
6633
6683
|
/**
|
6634
6684
|
* Convert CSS gradient string to gradient object
|
6635
6685
|
*/
|
@@ -7219,9 +7269,22 @@ var DefaultColorPanel = function (_a) {
|
|
7219
7269
|
var _d = __read(React.useState([]), 2), formatedDefColors = _d[0], setFormatedDefColors = _d[1];
|
7220
7270
|
React.useEffect(function () {
|
7221
7271
|
if (colorType === 'gradient') {
|
7222
|
-
|
7223
|
-
|
7224
|
-
|
7272
|
+
var validGradients = checkValidColorsArray(defaultColors, 'grad');
|
7273
|
+
// For popular colors display, create minimal IColor objects using original CSS strings
|
7274
|
+
// This avoids complex parsing issues while still providing functional display
|
7275
|
+
var displayGradients = validGradients.map(function (gradientString) {
|
7276
|
+
return {
|
7277
|
+
gradient: gradientString, // Use the original CSS string directly for display
|
7278
|
+
type: gradientString.startsWith('radial-') ? 'radial' : 'linear',
|
7279
|
+
modifier: 180, // Default value, not critical for display
|
7280
|
+
stops: [
|
7281
|
+
// Dummy stops that help identify display objects in onChooseColor
|
7282
|
+
['rgba(255, 0, 0, 1)', 0, 0],
|
7283
|
+
['rgba(0, 255, 0, 1)', 1, 1]
|
7284
|
+
]
|
7285
|
+
};
|
7286
|
+
});
|
7287
|
+
setFormatedDefColors(displayGradients);
|
7225
7288
|
}
|
7226
7289
|
else {
|
7227
7290
|
setFormatedDefColors(checkValidColorsArray(defaultColors, 'solid'));
|
@@ -7233,6 +7296,41 @@ var DefaultColorPanel = function (_a) {
|
|
7233
7296
|
return;
|
7234
7297
|
}
|
7235
7298
|
if (colorType === 'gradient' && typeof item !== 'string') {
|
7299
|
+
// If this is a simplified display object (identified by dummy stops), parse the gradient properly
|
7300
|
+
if (item.stops.length === 2 &&
|
7301
|
+
item.stops[0][0] === 'rgba(255, 0, 0, 1)') {
|
7302
|
+
try {
|
7303
|
+
var properlyParsed = parseGradient(item.gradient);
|
7304
|
+
if (properlyParsed &&
|
7305
|
+
properlyParsed.stops &&
|
7306
|
+
properlyParsed.stops.length > 0) {
|
7307
|
+
var stops_1 = properlyParsed.stops;
|
7308
|
+
var lastStop_1 = rgbaToArray(stops_1[stops_1.length - 1][0]);
|
7309
|
+
var lastStopLoc_1 = stops_1[stops_1.length - 1][1];
|
7310
|
+
var activeStop_1 = rgbaToHex([
|
7311
|
+
lastStop_1[0],
|
7312
|
+
lastStop_1[1],
|
7313
|
+
lastStop_1[2]
|
7314
|
+
]);
|
7315
|
+
var activeIdx_1 = stops_1[stops_1.length - 1][2];
|
7316
|
+
setInit(false);
|
7317
|
+
setColor(properlyParsed);
|
7318
|
+
setActiveColor &&
|
7319
|
+
setActiveColor({
|
7320
|
+
hex: activeStop_1,
|
7321
|
+
alpha: Number(Math.round(lastStop_1[3] * 100)),
|
7322
|
+
loc: lastStopLoc_1,
|
7323
|
+
index: activeIdx_1
|
7324
|
+
});
|
7325
|
+
setActive(index);
|
7326
|
+
return;
|
7327
|
+
}
|
7328
|
+
}
|
7329
|
+
catch (error) {
|
7330
|
+
console.warn('Failed to parse popular gradient on click:', item.gradient, error);
|
7331
|
+
}
|
7332
|
+
}
|
7333
|
+
// Normal gradient object processing (fallback)
|
7236
7334
|
var stops = item.stops;
|
7237
7335
|
var lastStop = rgbaToArray(stops[stops.length - 1][0]);
|
7238
7336
|
var lastStopLoc = stops[stops.length - 1][1];
|
@@ -7375,9 +7473,18 @@ var Markers = function (_a) {
|
|
7375
7473
|
};
|
7376
7474
|
var onDrag = function (e) {
|
7377
7475
|
var _a;
|
7378
|
-
|
7379
|
-
|
7476
|
+
// Defensive check for event object
|
7477
|
+
if (!e) {
|
7478
|
+
console.warn('onDrag called with undefined event object');
|
7479
|
+
return;
|
7480
|
+
}
|
7481
|
+
var x = e.clientX || 0;
|
7482
|
+
var y = e.clientY || 0;
|
7380
7483
|
var rect = (_a = node === null || node === void 0 ? void 0 : node.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect();
|
7484
|
+
if (!rect) {
|
7485
|
+
console.warn('Unable to get bounding rect for drag operation');
|
7486
|
+
return;
|
7487
|
+
}
|
7381
7488
|
var rootDistance = y - rect.y;
|
7382
7489
|
// Now we know user is actually dragging
|
7383
7490
|
setIsDragging(true);
|
@@ -7632,10 +7739,15 @@ var GradientPanel = function (_a) {
|
|
7632
7739
|
}
|
7633
7740
|
};
|
7634
7741
|
var onDrag = function (e) {
|
7635
|
-
|
7636
|
-
|
7637
|
-
|
7638
|
-
|
7742
|
+
// Defensive check for event object
|
7743
|
+
if (!e) {
|
7744
|
+
console.warn('onDrag called with undefined event object');
|
7745
|
+
return;
|
7746
|
+
}
|
7747
|
+
var x = e.clientX || 0;
|
7748
|
+
var y = e.clientY || 0;
|
7749
|
+
var shiftKey = e.shiftKey || false;
|
7750
|
+
var ctrlKey = (e.ctrlKey || false) * 2;
|
7639
7751
|
pointMoveTo({
|
7640
7752
|
x: x,
|
7641
7753
|
y: y,
|
@@ -7772,25 +7884,81 @@ var IroGradient = function (_a) {
|
|
7772
7884
|
// If parsing failed, return fallback gradient
|
7773
7885
|
if (typeof parsed === 'string') {
|
7774
7886
|
console.warn('Gradient parsing failed, using fallback:', parsed);
|
7775
|
-
|
7887
|
+
var fallback = parseGradient('linear-gradient(90deg, #ffffff 0%, #000000 100%)');
|
7888
|
+
// Ensure fallback has valid structure
|
7889
|
+
if (fallback &&
|
7890
|
+
typeof fallback === 'object' &&
|
7891
|
+
Array.isArray(fallback.stops) &&
|
7892
|
+
fallback.stops.length > 0) {
|
7893
|
+
return fallback;
|
7894
|
+
}
|
7895
|
+
// Ultimate fallback with guaranteed structure
|
7896
|
+
return {
|
7897
|
+
stops: [
|
7898
|
+
['rgba(255, 255, 255, 1)', 0, 0],
|
7899
|
+
['rgba(0, 0, 0, 1)', 1, 1]
|
7900
|
+
],
|
7901
|
+
gradient: 'linear-gradient(90deg, #ffffff 0%, #000000 100%)',
|
7902
|
+
modifier: 90,
|
7903
|
+
type: 'linear'
|
7904
|
+
};
|
7905
|
+
}
|
7906
|
+
// Validate parsed result has required structure
|
7907
|
+
if (parsed &&
|
7908
|
+
typeof parsed === 'object' &&
|
7909
|
+
Array.isArray(parsed.stops) &&
|
7910
|
+
parsed.stops.length > 0) {
|
7911
|
+
return parsed;
|
7776
7912
|
}
|
7777
|
-
|
7913
|
+
// If parsed result is invalid, use ultimate fallback
|
7914
|
+
console.warn('Parsed gradient has invalid structure:', parsed);
|
7915
|
+
return {
|
7916
|
+
stops: [
|
7917
|
+
['rgba(255, 255, 255, 1)', 0, 0],
|
7918
|
+
['rgba(0, 0, 0, 1)', 1, 1]
|
7919
|
+
],
|
7920
|
+
gradient: 'linear-gradient(90deg, #ffffff 0%, #000000 100%)',
|
7921
|
+
modifier: 90,
|
7922
|
+
type: 'linear'
|
7923
|
+
};
|
7778
7924
|
}
|
7779
7925
|
catch (error) {
|
7780
|
-
console.warn('Error parsing gradient, using fallback:', error);
|
7781
|
-
return
|
7926
|
+
console.warn('Error parsing gradient, using ultimate fallback:', error);
|
7927
|
+
return {
|
7928
|
+
stops: [
|
7929
|
+
['rgba(255, 255, 255, 1)', 0, 0],
|
7930
|
+
['rgba(0, 0, 0, 1)', 1, 1]
|
7931
|
+
],
|
7932
|
+
gradient: 'linear-gradient(90deg, #ffffff 0%, #000000 100%)',
|
7933
|
+
modifier: 90,
|
7934
|
+
type: 'linear'
|
7935
|
+
};
|
7782
7936
|
}
|
7783
7937
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
7784
7938
|
}, [value]);
|
7785
7939
|
var _s = parsedColors(), stops = _s.stops, type = _s.type, modifier = _s.modifier;
|
7786
|
-
var lastStop = rgbaToArray(stops[stops.length - 1][0]);
|
7787
|
-
var activeStopIndex = stops.length - 1;
|
7788
|
-
var activeStop = rgbaToHex([lastStop[0], lastStop[1], lastStop[2]]);
|
7789
|
-
var activeAlpha = Math.round(lastStop[3] * 100);
|
7790
7940
|
var iroPickerRef = React.useRef(null);
|
7791
7941
|
var containerRef = React.useRef(null);
|
7792
7942
|
var isUpdatingFromGradientStop = React.useRef(false);
|
7793
7943
|
var _t = __read(React.useState(200), 2), pickerWidth = _t[0], setPickerWidth = _t[1];
|
7944
|
+
// Safe extraction of stop data with fallbacks
|
7945
|
+
var safeStops = Array.isArray(stops) && stops.length > 0
|
7946
|
+
? stops
|
7947
|
+
: [
|
7948
|
+
['rgba(255, 255, 255, 1)', 0, 0],
|
7949
|
+
['rgba(0, 0, 0, 1)', 1, 1]
|
7950
|
+
];
|
7951
|
+
var safeLastStop = rgbaToArray(safeStops[safeStops.length - 1][0]);
|
7952
|
+
var safeParsedLastStop = Array.isArray(safeLastStop) && safeLastStop.length >= 4
|
7953
|
+
? safeLastStop
|
7954
|
+
: [255, 255, 255, 1];
|
7955
|
+
var activeStopIndex = safeStops.length - 1;
|
7956
|
+
var activeStop = rgbaToHex([
|
7957
|
+
safeParsedLastStop[0],
|
7958
|
+
safeParsedLastStop[1],
|
7959
|
+
safeParsedLastStop[2]
|
7960
|
+
]);
|
7961
|
+
var activeAlpha = Math.round(safeParsedLastStop[3] * 100);
|
7794
7962
|
// Responsive width for IroColorPicker - match solid picker logic
|
7795
7963
|
React.useEffect(function () {
|
7796
7964
|
if (!containerRef.current)
|
@@ -7833,12 +8001,12 @@ var IroGradient = function (_a) {
|
|
7833
8001
|
gradient: value,
|
7834
8002
|
type: type,
|
7835
8003
|
modifier: modifier,
|
7836
|
-
stops:
|
8004
|
+
stops: safeStops
|
7837
8005
|
}), 2), color = _u[0], setColor = _u[1];
|
7838
8006
|
var _v = __read(React.useState({
|
7839
8007
|
hex: activeStop,
|
7840
8008
|
alpha: activeAlpha,
|
7841
|
-
loc:
|
8009
|
+
loc: safeStops[activeStopIndex][1],
|
7842
8010
|
index: activeStopIndex
|
7843
8011
|
}), 2), activeColor = _v[0], setActiveColor = _v[1];
|
7844
8012
|
var debounceColor = useDebounce(color, debounceMS);
|
@@ -8071,11 +8239,11 @@ var IroGradient = function (_a) {
|
|
8071
8239
|
var handleColorFromPanel = function (newColor) {
|
8072
8240
|
setColor(newColor);
|
8073
8241
|
if (newColor === null || newColor === void 0 ? void 0 : newColor.stops) {
|
8074
|
-
var
|
8075
|
-
var activeStop_1 = rgbaToHex([
|
8242
|
+
var lastStop = rgbaToArray(newColor.stops[newColor.stops.length - 1][0]);
|
8243
|
+
var activeStop_1 = rgbaToHex([lastStop[0], lastStop[1], lastStop[2]]);
|
8076
8244
|
var newActiveColor = {
|
8077
8245
|
hex: activeStop_1,
|
8078
|
-
alpha: Math.round(
|
8246
|
+
alpha: Math.round(lastStop[3] * 100),
|
8079
8247
|
loc: newColor.stops[newColor.stops.length - 1][1],
|
8080
8248
|
index: newColor.stops.length - 1
|
8081
8249
|
};
|
@@ -8536,6 +8704,7 @@ exports.checkFormat = checkFormat;
|
|
8536
8704
|
exports.cn = cn;
|
8537
8705
|
exports.cssToGradientObject = cssToGradientObject;
|
8538
8706
|
exports["default"] = ColorPicker;
|
8707
|
+
exports.flexibleGradientToCss = flexibleGradientToCss;
|
8539
8708
|
exports.getGradient = getGradient;
|
8540
8709
|
exports.getHexAlpha = getHexAlpha;
|
8541
8710
|
exports.gradientObjectToCss = gradientObjectToCss;
|