react-iro-gradient-picker 1.2.3 → 1.2.4

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
@@ -6478,10 +6478,11 @@ var validGradient = (function (input) {
6478
6478
  var stops_1 = [];
6479
6479
  for (var i = 0; i < colorStops.length; i++) {
6480
6480
  var stopString = colorStops[i].trim();
6481
- // Try to extract color and position
6482
- var stopMatch = stopString.match(/^(.+?)(?:\s+(\d+(?:\.\d+)?)(%)?)?$/);
6481
+ // Improved regex to handle various gradient stop formats
6482
+ // Matches: color position%, color position, or just color
6483
+ var stopMatch = stopString.match(/^(.+?)(?:\s+([\d.]+)(%|px|em|rem)?)?$/);
6483
6484
  if (stopMatch) {
6484
- var _b = __read(stopMatch, 4), colorStr = _b[1], positionStr = _b[2], isPercent = _b[3];
6485
+ var _b = __read(stopMatch, 4), colorStr = _b[1], positionStr = _b[2], unit = _b[3];
6485
6486
  var tinyColorInstance = tinycolor(colorStr.trim());
6486
6487
  if (tinyColorInstance.isValid()) {
6487
6488
  var stop_1 = {
@@ -6489,14 +6490,21 @@ var validGradient = (function (input) {
6489
6490
  };
6490
6491
  if (positionStr) {
6491
6492
  var position = parseFloat(positionStr);
6492
- // Assume percentage if no unit specified
6493
- if (isPercent || !isPercent) {
6493
+ // Convert percentage to decimal (0-1 range)
6494
+ if (unit === '%' || !unit) {
6495
+ // If no unit specified, assume percentage
6494
6496
  position = position / 100;
6495
6497
  }
6496
6498
  stop_1.position = Math.max(0, Math.min(1, position));
6497
6499
  }
6498
6500
  stops_1.push(stop_1);
6499
6501
  }
6502
+ else {
6503
+ console.warn('Invalid color in gradient stop:', colorStr.trim());
6504
+ }
6505
+ }
6506
+ else {
6507
+ console.warn('Could not parse gradient stop:', stopString);
6500
6508
  }
6501
6509
  }
6502
6510
  // Auto-assign positions if missing
@@ -6594,7 +6602,7 @@ var parseGradient = (function (str) {
6594
6602
  var helperAngle = type === 'linear' ? '180' : 'circle at center';
6595
6603
  var modifier = findF || angle_1 || helperAngle;
6596
6604
  return {
6597
- gradient: "".concat(type, "-gradient(").concat(typeof gradient !== 'string' ? gradient.original : str, ")"),
6605
+ gradient: typeof gradient !== 'string' ? gradient.original : str,
6598
6606
  type: type,
6599
6607
  modifier: modifier.match(/\d+/) !== null
6600
6608
  ? Number((_b = modifier.match(/\d+/)) === null || _b === void 0 ? void 0 : _b.join(''))
@@ -6611,7 +6619,7 @@ var parseGradient = (function (str) {
6611
6619
  });
6612
6620
 
6613
6621
  /**
6614
- * Convert gradient object to CSS gradient string
6622
+ * Convert gradient object to CSS gradient string (strict typing)
6615
6623
  */
6616
6624
  function gradientObjectToCss(gradientData) {
6617
6625
  var type = gradientData.type, _a = gradientData.angle, angle = _a === void 0 ? 90 : _a, stops = gradientData.stops;
@@ -6630,6 +6638,38 @@ function gradientObjectToCss(gradientData) {
6630
6638
  return "radial-gradient(circle, ".concat(cssStops, ")");
6631
6639
  }
6632
6640
  }
6641
+ /**
6642
+ * Convert flexible gradient object to CSS gradient string (loose typing)
6643
+ */
6644
+ function flexibleGradientToCss(gradientData) {
6645
+ var _a = gradientData.type, type = _a === void 0 ? 'linear' : _a, angle = gradientData.angle, direction = gradientData.direction, position = gradientData.position, stops = gradientData.stops;
6646
+ // Convert stops to CSS format with flexible position handling
6647
+ var cssStops = stops
6648
+ .map(function (stop) {
6649
+ var color = tinycolor(stop.color);
6650
+ var positionStr = '';
6651
+ if (stop.position !== undefined) {
6652
+ if (typeof stop.position === 'string') {
6653
+ positionStr = " ".concat(stop.position);
6654
+ }
6655
+ else {
6656
+ positionStr = " ".concat(stop.position, "%");
6657
+ }
6658
+ }
6659
+ return "".concat(color.toRgbString()).concat(positionStr);
6660
+ })
6661
+ .join(', ');
6662
+ if (type === 'linear') {
6663
+ // Use direction if provided, otherwise use angle
6664
+ var gradientDirection = direction || (angle ? "".concat(angle, "deg") : '90deg');
6665
+ return "linear-gradient(".concat(gradientDirection, ", ").concat(cssStops, ")");
6666
+ }
6667
+ else {
6668
+ // Handle radial gradients with flexible positioning
6669
+ var radialPosition = position || 'circle';
6670
+ return "radial-gradient(".concat(radialPosition, ", ").concat(cssStops, ")");
6671
+ }
6672
+ }
6633
6673
  /**
6634
6674
  * Convert CSS gradient string to gradient object
6635
6675
  */
@@ -7219,9 +7259,22 @@ var DefaultColorPanel = function (_a) {
7219
7259
  var _d = __read(React.useState([]), 2), formatedDefColors = _d[0], setFormatedDefColors = _d[1];
7220
7260
  React.useEffect(function () {
7221
7261
  if (colorType === 'gradient') {
7222
- setFormatedDefColors(checkValidColorsArray(defaultColors, 'grad').map(function (item) {
7223
- return parseGradient(item);
7224
- }));
7262
+ var validGradients = checkValidColorsArray(defaultColors, 'grad');
7263
+ // For popular colors display, create minimal IColor objects using original CSS strings
7264
+ // This avoids complex parsing issues while still providing functional display
7265
+ var displayGradients = validGradients.map(function (gradientString) {
7266
+ return {
7267
+ gradient: gradientString, // Use the original CSS string directly for display
7268
+ type: gradientString.startsWith('radial-') ? 'radial' : 'linear',
7269
+ modifier: 180, // Default value, not critical for display
7270
+ stops: [
7271
+ // Dummy stops that help identify display objects in onChooseColor
7272
+ ['rgba(255, 0, 0, 1)', 0, 0],
7273
+ ['rgba(0, 255, 0, 1)', 1, 1]
7274
+ ]
7275
+ };
7276
+ });
7277
+ setFormatedDefColors(displayGradients);
7225
7278
  }
7226
7279
  else {
7227
7280
  setFormatedDefColors(checkValidColorsArray(defaultColors, 'solid'));
@@ -7233,6 +7286,41 @@ var DefaultColorPanel = function (_a) {
7233
7286
  return;
7234
7287
  }
7235
7288
  if (colorType === 'gradient' && typeof item !== 'string') {
7289
+ // If this is a simplified display object (identified by dummy stops), parse the gradient properly
7290
+ if (item.stops.length === 2 &&
7291
+ item.stops[0][0] === 'rgba(255, 0, 0, 1)') {
7292
+ try {
7293
+ var properlyParsed = parseGradient(item.gradient);
7294
+ if (properlyParsed &&
7295
+ properlyParsed.stops &&
7296
+ properlyParsed.stops.length > 0) {
7297
+ var stops_1 = properlyParsed.stops;
7298
+ var lastStop_1 = rgbaToArray(stops_1[stops_1.length - 1][0]);
7299
+ var lastStopLoc_1 = stops_1[stops_1.length - 1][1];
7300
+ var activeStop_1 = rgbaToHex([
7301
+ lastStop_1[0],
7302
+ lastStop_1[1],
7303
+ lastStop_1[2]
7304
+ ]);
7305
+ var activeIdx_1 = stops_1[stops_1.length - 1][2];
7306
+ setInit(false);
7307
+ setColor(properlyParsed);
7308
+ setActiveColor &&
7309
+ setActiveColor({
7310
+ hex: activeStop_1,
7311
+ alpha: Number(Math.round(lastStop_1[3] * 100)),
7312
+ loc: lastStopLoc_1,
7313
+ index: activeIdx_1
7314
+ });
7315
+ setActive(index);
7316
+ return;
7317
+ }
7318
+ }
7319
+ catch (error) {
7320
+ console.warn('Failed to parse popular gradient on click:', item.gradient, error);
7321
+ }
7322
+ }
7323
+ // Normal gradient object processing (fallback)
7236
7324
  var stops = item.stops;
7237
7325
  var lastStop = rgbaToArray(stops[stops.length - 1][0]);
7238
7326
  var lastStopLoc = stops[stops.length - 1][1];
@@ -7772,25 +7860,64 @@ var IroGradient = function (_a) {
7772
7860
  // If parsing failed, return fallback gradient
7773
7861
  if (typeof parsed === 'string') {
7774
7862
  console.warn('Gradient parsing failed, using fallback:', parsed);
7775
- return parseGradient('linear-gradient(90deg, #ffffff 0%, #000000 100%)');
7863
+ var fallback = parseGradient('linear-gradient(90deg, #ffffff 0%, #000000 100%)');
7864
+ // Ensure fallback has valid structure
7865
+ if (fallback && typeof fallback === 'object' && Array.isArray(fallback.stops) && fallback.stops.length > 0) {
7866
+ return fallback;
7867
+ }
7868
+ // Ultimate fallback with guaranteed structure
7869
+ return {
7870
+ stops: [
7871
+ ['rgba(255, 255, 255, 1)', 0, 0],
7872
+ ['rgba(0, 0, 0, 1)', 1, 1]
7873
+ ],
7874
+ gradient: 'linear-gradient(90deg, #ffffff 0%, #000000 100%)',
7875
+ modifier: 90,
7876
+ type: 'linear'
7877
+ };
7878
+ }
7879
+ // Validate parsed result has required structure
7880
+ if (parsed && typeof parsed === 'object' && Array.isArray(parsed.stops) && parsed.stops.length > 0) {
7881
+ return parsed;
7776
7882
  }
7777
- return parsed;
7883
+ // If parsed result is invalid, use ultimate fallback
7884
+ console.warn('Parsed gradient has invalid structure:', parsed);
7885
+ return {
7886
+ stops: [
7887
+ ['rgba(255, 255, 255, 1)', 0, 0],
7888
+ ['rgba(0, 0, 0, 1)', 1, 1]
7889
+ ],
7890
+ gradient: 'linear-gradient(90deg, #ffffff 0%, #000000 100%)',
7891
+ modifier: 90,
7892
+ type: 'linear'
7893
+ };
7778
7894
  }
7779
7895
  catch (error) {
7780
- console.warn('Error parsing gradient, using fallback:', error);
7781
- return parseGradient('linear-gradient(90deg, #ffffff 0%, #000000 100%)');
7896
+ console.warn('Error parsing gradient, using ultimate fallback:', error);
7897
+ return {
7898
+ stops: [
7899
+ ['rgba(255, 255, 255, 1)', 0, 0],
7900
+ ['rgba(0, 0, 0, 1)', 1, 1]
7901
+ ],
7902
+ gradient: 'linear-gradient(90deg, #ffffff 0%, #000000 100%)',
7903
+ modifier: 90,
7904
+ type: 'linear'
7905
+ };
7782
7906
  }
7783
7907
  // eslint-disable-next-line react-hooks/exhaustive-deps
7784
7908
  }, [value]);
7785
7909
  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
7910
  var iroPickerRef = React.useRef(null);
7791
7911
  var containerRef = React.useRef(null);
7792
7912
  var isUpdatingFromGradientStop = React.useRef(false);
7793
7913
  var _t = __read(React.useState(200), 2), pickerWidth = _t[0], setPickerWidth = _t[1];
7914
+ // Safe extraction of stop data with fallbacks
7915
+ var safeStops = Array.isArray(stops) && stops.length > 0 ? stops : [['rgba(255, 255, 255, 1)', 0, 0], ['rgba(0, 0, 0, 1)', 1, 1]];
7916
+ var safeLastStop = rgbaToArray(safeStops[safeStops.length - 1][0]);
7917
+ var safeParsedLastStop = Array.isArray(safeLastStop) && safeLastStop.length >= 4 ? safeLastStop : [255, 255, 255, 1];
7918
+ var activeStopIndex = safeStops.length - 1;
7919
+ var activeStop = rgbaToHex([safeParsedLastStop[0], safeParsedLastStop[1], safeParsedLastStop[2]]);
7920
+ var activeAlpha = Math.round(safeParsedLastStop[3] * 100);
7794
7921
  // Responsive width for IroColorPicker - match solid picker logic
7795
7922
  React.useEffect(function () {
7796
7923
  if (!containerRef.current)
@@ -7833,12 +7960,12 @@ var IroGradient = function (_a) {
7833
7960
  gradient: value,
7834
7961
  type: type,
7835
7962
  modifier: modifier,
7836
- stops: stops
7963
+ stops: safeStops
7837
7964
  }), 2), color = _u[0], setColor = _u[1];
7838
7965
  var _v = __read(React.useState({
7839
7966
  hex: activeStop,
7840
7967
  alpha: activeAlpha,
7841
- loc: stops[activeStopIndex][1],
7968
+ loc: safeStops[activeStopIndex][1],
7842
7969
  index: activeStopIndex
7843
7970
  }), 2), activeColor = _v[0], setActiveColor = _v[1];
7844
7971
  var debounceColor = useDebounce(color, debounceMS);
@@ -8071,11 +8198,11 @@ var IroGradient = function (_a) {
8071
8198
  var handleColorFromPanel = function (newColor) {
8072
8199
  setColor(newColor);
8073
8200
  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]]);
8201
+ var lastStop = rgbaToArray(newColor.stops[newColor.stops.length - 1][0]);
8202
+ var activeStop_1 = rgbaToHex([lastStop[0], lastStop[1], lastStop[2]]);
8076
8203
  var newActiveColor = {
8077
8204
  hex: activeStop_1,
8078
- alpha: Math.round(lastStop_1[3] * 100),
8205
+ alpha: Math.round(lastStop[3] * 100),
8079
8206
  loc: newColor.stops[newColor.stops.length - 1][1],
8080
8207
  index: newColor.stops.length - 1
8081
8208
  };
@@ -8536,6 +8663,7 @@ exports.checkFormat = checkFormat;
8536
8663
  exports.cn = cn;
8537
8664
  exports.cssToGradientObject = cssToGradientObject;
8538
8665
  exports["default"] = ColorPicker;
8666
+ exports.flexibleGradientToCss = flexibleGradientToCss;
8539
8667
  exports.getGradient = getGradient;
8540
8668
  exports.getHexAlpha = getHexAlpha;
8541
8669
  exports.gradientObjectToCss = gradientObjectToCss;