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.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 = /^\d+deg$/i.test(firstPart) ||
6442
- /^to\s+/.test(firstPart) ||
6443
- /^(?:circle|ellipse)/.test(firstPart) ||
6444
- /at\s+/.test(firstPart);
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
- // Try to extract color and position
6482
- var stopMatch = stopString.match(/^(.+?)(?:\s+(\d+(?:\.\d+)?)(%)?)?$/);
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], isPercent = _b[3];
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
- // Assume percentage if no unit specified
6493
- if (isPercent || !isPercent) {
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: "".concat(type, "-gradient(").concat(typeof gradient !== 'string' ? gradient.original : str, ")"),
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
- setFormatedDefColors(checkValidColorsArray(defaultColors, 'grad').map(function (item) {
7223
- return parseGradient(item);
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
- var x = e.clientX;
7379
- var y = e.clientY;
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
- var x = e.clientX;
7636
- var y = e.clientY;
7637
- var shiftKey = e.shiftKey;
7638
- var ctrlKey = e.ctrlKey * 2;
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
- return parseGradient('linear-gradient(90deg, #ffffff 0%, #000000 100%)');
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
- return parsed;
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 parseGradient('linear-gradient(90deg, #ffffff 0%, #000000 100%)');
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: 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: stops[activeStopIndex][1],
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 lastStop_1 = rgbaToArray(newColor.stops[newColor.stops.length - 1][0]);
8075
- var activeStop_1 = rgbaToHex([lastStop_1[0], lastStop_1[1], lastStop_1[2]]);
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(lastStop_1[3] * 100),
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;