react-iro-gradient-picker 1.2.1 → 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/README.md CHANGED
@@ -272,6 +272,58 @@ This is an enhanced version of the original react-gcolor-picker with major impro
272
272
  - **Updated Dependencies** - Latest versions of all packages
273
273
  - **Better Build Process** - Optimized for modern React applications
274
274
 
275
+ ## 🎨 Supported CSS Gradient Formats
276
+
277
+ **v1.2.2+ supports all standard CSS gradient formats with robust parsing:**
278
+
279
+ ### Linear Gradients
280
+
281
+ ```css
282
+ /* Angle-based directions */
283
+ linear-gradient(120deg, #FF6B6B, #FFD93D, #6BCB77)
284
+ linear-gradient(45deg, #4FACFE, #00F2FE, #38EF7D)
285
+ linear-gradient(200deg, #FF9A9E, #FAD0C4, #FBC2EB)
286
+ linear-gradient(60deg, #30CFD0, #330867, #6A82FB)
287
+
288
+ /* Named directions */
289
+ linear-gradient(to top right, #FF6B6B, #FFD93D)
290
+ linear-gradient(to bottom, #4FACFE, #00F2FE)
291
+ linear-gradient(to left, #FF9A9E, #FAD0C4)
292
+
293
+ /* With explicit positions */
294
+ linear-gradient(90deg, #FF6B6B 0%, #FFD93D 50%, #6BCB77 100%)
295
+
296
+ /* Without positions (auto-distributed) */
297
+ linear-gradient(180deg, #FF9966, #FF5E62, #F54EA2)
298
+ ```
299
+
300
+ ### Radial Gradients
301
+
302
+ ```css
303
+ /* Basic circle gradients */
304
+ radial-gradient(circle at center, #00C9FF, #92FE9D, #0061FF)
305
+ radial-gradient(circle at top left, #FF6B6B, #FF4757, #2F3542)
306
+ radial-gradient(circle at bottom right, #1E90FF, #3742FA, #2C3E50)
307
+
308
+ /* Positioned radial gradients */
309
+ radial-gradient(circle at 70% 30%, #2ED573, #1EAE98, #004E64)
310
+ radial-gradient(circle at 20% 80%, #FFB347, #FFCC33, #FF6347)
311
+ radial-gradient(circle at top center, #FF7E5F, #FEB47B, #FFD93D)
312
+ radial-gradient(circle at right center, #6A82FB, #FC5C7D, #FF85A1)
313
+
314
+ /* Complex positioning */
315
+ radial-gradient(circle at 30% 70%, #11998E, #38EF7D, #8BC34A)
316
+ radial-gradient(circle at 80% 20%, #F7971E, #FFD200, #FF512F)
317
+ radial-gradient(circle at 40% 40%, #C6FFDD, #FBD786, #F7797D)
318
+ ```
319
+
320
+ ### Advanced Features
321
+
322
+ - **Auto-positioning**: Color stops without explicit positions are automatically distributed evenly
323
+ - **Flexible syntax**: Supports various positioning keywords and percentage values
324
+ - **Error recovery**: Invalid gradients fall back to a default gradient instead of crashing
325
+ - **Type safety**: Full TypeScript support with proper gradient object interfaces
326
+
275
327
  ## Props
276
328
 
277
329
  | Attribute | Type | Default | Description |
package/dist/index.es.js CHANGED
@@ -6386,111 +6386,147 @@ var isValidRgba = (function (rgba) {
6386
6386
  return !!rgbaToHex(rgba);
6387
6387
  });
6388
6388
 
6389
- var combineRegExp = function (regexpList, flags) {
6390
- return new RegExp(regexpList.reduce(function (result, item) {
6391
- return result + (typeof item === 'string' ? item : item.source);
6392
- }, ''), flags);
6393
- };
6394
- var generateRegExp = function () {
6395
- var searchFlags = 'gi';
6396
- var rAngle = /(?:[+-]?\d*\.?\d+)(?:deg|grad|rad|turn)/;
6397
- var rSideCornerCapture = /to\s+((?:(?:left|right)(?:\s+(?:top|bottom))?))/;
6398
- var rRadial = /circle at\s+((?:(?:left|right|center|top|bottom)(?:\s+(?:left|right|center|top|bottom))?))/;
6399
- var rComma = /\s*,\s*/;
6400
- var rColorHex = /\#(?:[a-f0-9]{6,8}|[a-f0-9]{3})/;
6401
- var rDigits3 = /\(\s*(?:\d{1,3}%?\s*,\s*){2}%?\d{1,3}%?\s*\)/;
6402
- var rDigits4 = /\(\s*(?:\d{1,3}%?\s*,\s*){2}%?\d{1,3}%?\s*,\s*\d*\.?\d+\)/;
6403
- var rValue = /(?:[+-]?\d*\.?\d+)(?:%|[a-z]+)?/;
6404
- var rKeyword = /[_a-z-][_a-z0-9-]*/;
6405
- var rColor = combineRegExp([
6406
- '(?:',
6407
- rColorHex,
6408
- '|',
6409
- '(?:rgb|hsl)',
6410
- rDigits3,
6411
- '|',
6412
- '(?:rgba|hsla)',
6413
- rDigits4,
6414
- '|',
6415
- rKeyword,
6416
- ')'
6417
- ], '');
6418
- var rColorStop = combineRegExp([rColor, '(?:\\s+', rValue, '(?:\\s+', rValue, ')?)?'], '');
6419
- var rColorStopList = combineRegExp(['(?:', rColorStop, rComma, ')*', rColorStop], '');
6420
- var rLineCapture = combineRegExp(['(?:(', rAngle, ')|', rSideCornerCapture, '|', rRadial, ')'], '');
6421
- var rGradientSearch = combineRegExp(['(?:(', rLineCapture, ')', rComma, ')?(', rColorStopList, ')'], searchFlags);
6422
- var rColorStopSearch = combineRegExp([
6423
- '\\s*(',
6424
- rColor,
6425
- ')',
6426
- '(?:\\s+',
6427
- '(',
6428
- rValue,
6429
- '))?',
6430
- '(?:',
6431
- rComma,
6432
- '\\s*)?'
6433
- ], searchFlags);
6434
- return {
6435
- gradientSearch: rGradientSearch,
6436
- colorStopSearch: rColorStopSearch
6437
- };
6438
- };
6439
- var parseGradient$1 = function (regExpLib, input) {
6440
- var result = {
6441
- stops: [],
6442
- angle: '',
6443
- line: '',
6444
- original: ''
6445
- };
6446
- var matchGradient, matchColorStop, stopResult;
6447
- regExpLib.gradientSearch.lastIndex = 0;
6448
- matchGradient = regExpLib.gradientSearch.exec(input);
6449
- if (matchGradient !== null) {
6450
- result = __assign(__assign({}, result), { original: matchGradient[0] });
6451
- if (matchGradient[1]) {
6452
- result.line = matchGradient[1];
6389
+ var validGradient = (function (input) {
6390
+ try {
6391
+ // Clean input
6392
+ var cleanInput = input
6393
+ .trim()
6394
+ .replace(/;$/, '')
6395
+ .replace(/^background-image:\s*/, '');
6396
+ // Extract gradient type and content
6397
+ var gradientMatch = cleanInput.match(/^(linear|radial)-gradient\s*\(\s*(.*)\s*\)$/i);
6398
+ if (!gradientMatch) {
6399
+ return 'Failed to find gradient';
6453
6400
  }
6454
- if (matchGradient[2]) {
6455
- result.angle = matchGradient[2];
6401
+ var _a = __read(gradientMatch, 3), type = _a[1], content = _a[2];
6402
+ var parts = [];
6403
+ var currentPart = '';
6404
+ var parenDepth = 0;
6405
+ var inQuotes = false;
6406
+ // Parse content by splitting on commas, but respect parentheses and quotes
6407
+ for (var i = 0; i < content.length; i++) {
6408
+ var char = content[i];
6409
+ if (char === '"' || char === "'") {
6410
+ inQuotes = !inQuotes;
6411
+ }
6412
+ else if (!inQuotes) {
6413
+ if (char === '(')
6414
+ parenDepth++;
6415
+ else if (char === ')')
6416
+ parenDepth--;
6417
+ else if (char === ',' && parenDepth === 0) {
6418
+ parts.push(currentPart.trim());
6419
+ currentPart = '';
6420
+ continue;
6421
+ }
6422
+ }
6423
+ currentPart += char;
6456
6424
  }
6457
- if (matchGradient[3]) {
6458
- result.sideCorner = matchGradient[3];
6425
+ if (currentPart.trim()) {
6426
+ parts.push(currentPart.trim());
6459
6427
  }
6460
- regExpLib.colorStopSearch.lastIndex = 0;
6461
- matchColorStop = regExpLib.colorStopSearch.exec(matchGradient[5]);
6462
- while (matchColorStop !== null) {
6463
- var tinyColor = tinycolor(matchColorStop[1]);
6464
- stopResult = {
6465
- color: tinyColor.toRgbString()
6466
- };
6467
- if (matchColorStop[2]) {
6468
- stopResult.position = Number((parseInt(matchColorStop[2], 10) / 100).toFixed(2));
6428
+ var angle = '';
6429
+ var line = '';
6430
+ var colorStops = [];
6431
+ // Determine if first part is direction/angle or color stop
6432
+ var firstPart = parts[0];
6433
+ var isDirection = /^\d+deg$/i.test(firstPart) ||
6434
+ /^to\s+/.test(firstPart) ||
6435
+ /^(?:circle|ellipse)/.test(firstPart) ||
6436
+ /at\s+/.test(firstPart);
6437
+ if (isDirection) {
6438
+ if (type === 'linear') {
6439
+ if (/^\d+deg$/i.test(firstPart)) {
6440
+ angle = firstPart.replace(/deg$/i, '');
6441
+ }
6442
+ else if (/^to\s+/.test(firstPart)) {
6443
+ line = firstPart;
6444
+ // Convert named directions to angles
6445
+ var directionMap = {
6446
+ 'to top': '0',
6447
+ 'to top right': '45',
6448
+ 'to right': '90',
6449
+ 'to bottom right': '135',
6450
+ 'to bottom': '180',
6451
+ 'to bottom left': '225',
6452
+ 'to left': '270',
6453
+ 'to top left': '315'
6454
+ };
6455
+ angle = directionMap[firstPart] || '0';
6456
+ }
6469
6457
  }
6470
- result.stops.push(stopResult);
6471
- matchColorStop = regExpLib.colorStopSearch.exec(matchGradient[5]);
6458
+ else {
6459
+ line = firstPart;
6460
+ }
6461
+ colorStops = parts.slice(1);
6472
6462
  }
6473
- }
6474
- return result;
6475
- };
6476
- var validGradient = (function (input) {
6477
- var regExpLib = generateRegExp();
6478
- var result;
6479
- var rGradientEnclosedInBrackets = /.*gradient\s*\(((?:\([^\)]*\)|[^\)\(]*)*)\)/;
6480
- var match = rGradientEnclosedInBrackets.exec(input);
6481
- if (match !== null) {
6482
- result = parseGradient$1(regExpLib, match[1]);
6483
- if (result.original.trim() !== match[1].trim()) {
6484
- result.parseWarning = true;
6463
+ else {
6464
+ // No explicit direction, use defaults
6465
+ angle = type === 'linear' ? '180' : '';
6466
+ line = type === 'radial' ? 'circle at center' : '';
6467
+ colorStops = parts;
6485
6468
  }
6486
- if (result.stops.every(function (item) { return item.hasOwnProperty('position'); }) === false) {
6487
- result = 'Not correct position';
6469
+ // Parse color stops
6470
+ var stops_1 = [];
6471
+ for (var i = 0; i < colorStops.length; i++) {
6472
+ var stopString = colorStops[i].trim();
6473
+ // Improved regex to handle various gradient stop formats
6474
+ // Matches: color position%, color position, or just color
6475
+ var stopMatch = stopString.match(/^(.+?)(?:\s+([\d.]+)(%|px|em|rem)?)?$/);
6476
+ if (stopMatch) {
6477
+ var _b = __read(stopMatch, 4), colorStr = _b[1], positionStr = _b[2], unit = _b[3];
6478
+ var tinyColorInstance = tinycolor(colorStr.trim());
6479
+ if (tinyColorInstance.isValid()) {
6480
+ var stop_1 = {
6481
+ color: tinyColorInstance.toRgbString()
6482
+ };
6483
+ if (positionStr) {
6484
+ var position = parseFloat(positionStr);
6485
+ // Convert percentage to decimal (0-1 range)
6486
+ if (unit === '%' || !unit) {
6487
+ // If no unit specified, assume percentage
6488
+ position = position / 100;
6489
+ }
6490
+ stop_1.position = Math.max(0, Math.min(1, position));
6491
+ }
6492
+ stops_1.push(stop_1);
6493
+ }
6494
+ else {
6495
+ console.warn('Invalid color in gradient stop:', colorStr.trim());
6496
+ }
6497
+ }
6498
+ else {
6499
+ console.warn('Could not parse gradient stop:', stopString);
6500
+ }
6501
+ }
6502
+ // Auto-assign positions if missing
6503
+ stops_1.forEach(function (stop, index) {
6504
+ if (!stop.hasOwnProperty('position')) {
6505
+ stop.position = stops_1.length > 1 ? index / (stops_1.length - 1) : 0;
6506
+ }
6507
+ });
6508
+ // Ensure we have at least 2 stops
6509
+ if (stops_1.length === 0) {
6510
+ return 'No valid color stops found';
6488
6511
  }
6512
+ else if (stops_1.length === 1) {
6513
+ // Duplicate the single stop to create a valid gradient
6514
+ stops_1.push({
6515
+ color: stops_1[0].color,
6516
+ position: 1
6517
+ });
6518
+ }
6519
+ return {
6520
+ stops: stops_1,
6521
+ angle: angle,
6522
+ line: line,
6523
+ original: cleanInput
6524
+ };
6489
6525
  }
6490
- else {
6491
- result = 'Failed to find gradient';
6526
+ catch (error) {
6527
+ console.warn('Error parsing gradient:', error);
6528
+ return 'Failed to parse gradient';
6492
6529
  }
6493
- return result;
6494
6530
  });
6495
6531
 
6496
6532
  var LINEAR_POS = [
@@ -6558,7 +6594,7 @@ var parseGradient = (function (str) {
6558
6594
  var helperAngle = type === 'linear' ? '180' : 'circle at center';
6559
6595
  var modifier = findF || angle_1 || helperAngle;
6560
6596
  return {
6561
- gradient: "".concat(type, "-gradient(").concat(typeof gradient !== 'string' ? gradient.original : str, ")"),
6597
+ gradient: typeof gradient !== 'string' ? gradient.original : str,
6562
6598
  type: type,
6563
6599
  modifier: modifier.match(/\d+/) !== null
6564
6600
  ? Number((_b = modifier.match(/\d+/)) === null || _b === void 0 ? void 0 : _b.join(''))
@@ -6575,7 +6611,7 @@ var parseGradient = (function (str) {
6575
6611
  });
6576
6612
 
6577
6613
  /**
6578
- * Convert gradient object to CSS gradient string
6614
+ * Convert gradient object to CSS gradient string (strict typing)
6579
6615
  */
6580
6616
  function gradientObjectToCss(gradientData) {
6581
6617
  var type = gradientData.type, _a = gradientData.angle, angle = _a === void 0 ? 90 : _a, stops = gradientData.stops;
@@ -6594,6 +6630,38 @@ function gradientObjectToCss(gradientData) {
6594
6630
  return "radial-gradient(circle, ".concat(cssStops, ")");
6595
6631
  }
6596
6632
  }
6633
+ /**
6634
+ * Convert flexible gradient object to CSS gradient string (loose typing)
6635
+ */
6636
+ function flexibleGradientToCss(gradientData) {
6637
+ var _a = gradientData.type, type = _a === void 0 ? 'linear' : _a, angle = gradientData.angle, direction = gradientData.direction, position = gradientData.position, stops = gradientData.stops;
6638
+ // Convert stops to CSS format with flexible position handling
6639
+ var cssStops = stops
6640
+ .map(function (stop) {
6641
+ var color = tinycolor(stop.color);
6642
+ var positionStr = '';
6643
+ if (stop.position !== undefined) {
6644
+ if (typeof stop.position === 'string') {
6645
+ positionStr = " ".concat(stop.position);
6646
+ }
6647
+ else {
6648
+ positionStr = " ".concat(stop.position, "%");
6649
+ }
6650
+ }
6651
+ return "".concat(color.toRgbString()).concat(positionStr);
6652
+ })
6653
+ .join(', ');
6654
+ if (type === 'linear') {
6655
+ // Use direction if provided, otherwise use angle
6656
+ var gradientDirection = direction || (angle ? "".concat(angle, "deg") : '90deg');
6657
+ return "linear-gradient(".concat(gradientDirection, ", ").concat(cssStops, ")");
6658
+ }
6659
+ else {
6660
+ // Handle radial gradients with flexible positioning
6661
+ var radialPosition = position || 'circle';
6662
+ return "radial-gradient(".concat(radialPosition, ", ").concat(cssStops, ")");
6663
+ }
6664
+ }
6597
6665
  /**
6598
6666
  * Convert CSS gradient string to gradient object
6599
6667
  */
@@ -7183,9 +7251,22 @@ var DefaultColorPanel = function (_a) {
7183
7251
  var _d = __read(useState([]), 2), formatedDefColors = _d[0], setFormatedDefColors = _d[1];
7184
7252
  useEffect(function () {
7185
7253
  if (colorType === 'gradient') {
7186
- setFormatedDefColors(checkValidColorsArray(defaultColors, 'grad').map(function (item) {
7187
- return parseGradient(item);
7188
- }));
7254
+ var validGradients = checkValidColorsArray(defaultColors, 'grad');
7255
+ // For popular colors display, create minimal IColor objects using original CSS strings
7256
+ // This avoids complex parsing issues while still providing functional display
7257
+ var displayGradients = validGradients.map(function (gradientString) {
7258
+ return {
7259
+ gradient: gradientString, // Use the original CSS string directly for display
7260
+ type: gradientString.startsWith('radial-') ? 'radial' : 'linear',
7261
+ modifier: 180, // Default value, not critical for display
7262
+ stops: [
7263
+ // Dummy stops that help identify display objects in onChooseColor
7264
+ ['rgba(255, 0, 0, 1)', 0, 0],
7265
+ ['rgba(0, 255, 0, 1)', 1, 1]
7266
+ ]
7267
+ };
7268
+ });
7269
+ setFormatedDefColors(displayGradients);
7189
7270
  }
7190
7271
  else {
7191
7272
  setFormatedDefColors(checkValidColorsArray(defaultColors, 'solid'));
@@ -7197,6 +7278,41 @@ var DefaultColorPanel = function (_a) {
7197
7278
  return;
7198
7279
  }
7199
7280
  if (colorType === 'gradient' && typeof item !== 'string') {
7281
+ // If this is a simplified display object (identified by dummy stops), parse the gradient properly
7282
+ if (item.stops.length === 2 &&
7283
+ item.stops[0][0] === 'rgba(255, 0, 0, 1)') {
7284
+ try {
7285
+ var properlyParsed = parseGradient(item.gradient);
7286
+ if (properlyParsed &&
7287
+ properlyParsed.stops &&
7288
+ properlyParsed.stops.length > 0) {
7289
+ var stops_1 = properlyParsed.stops;
7290
+ var lastStop_1 = rgbaToArray(stops_1[stops_1.length - 1][0]);
7291
+ var lastStopLoc_1 = stops_1[stops_1.length - 1][1];
7292
+ var activeStop_1 = rgbaToHex([
7293
+ lastStop_1[0],
7294
+ lastStop_1[1],
7295
+ lastStop_1[2]
7296
+ ]);
7297
+ var activeIdx_1 = stops_1[stops_1.length - 1][2];
7298
+ setInit(false);
7299
+ setColor(properlyParsed);
7300
+ setActiveColor &&
7301
+ setActiveColor({
7302
+ hex: activeStop_1,
7303
+ alpha: Number(Math.round(lastStop_1[3] * 100)),
7304
+ loc: lastStopLoc_1,
7305
+ index: activeIdx_1
7306
+ });
7307
+ setActive(index);
7308
+ return;
7309
+ }
7310
+ }
7311
+ catch (error) {
7312
+ console.warn('Failed to parse popular gradient on click:', item.gradient, error);
7313
+ }
7314
+ }
7315
+ // Normal gradient object processing (fallback)
7200
7316
  var stops = item.stops;
7201
7317
  var lastStop = rgbaToArray(stops[stops.length - 1][0]);
7202
7318
  var lastStopLoc = stops[stops.length - 1][1];
@@ -7731,18 +7847,69 @@ var IroGradient = function (_a) {
7731
7847
  // Store the initial value for reset functionality
7732
7848
  var initialValue = useRef(value);
7733
7849
  var parsedColors = useCallback(function () {
7734
- return parseGradient(value);
7850
+ try {
7851
+ var parsed = parseGradient(value);
7852
+ // If parsing failed, return fallback gradient
7853
+ if (typeof parsed === 'string') {
7854
+ console.warn('Gradient parsing failed, using fallback:', parsed);
7855
+ var fallback = parseGradient('linear-gradient(90deg, #ffffff 0%, #000000 100%)');
7856
+ // Ensure fallback has valid structure
7857
+ if (fallback && typeof fallback === 'object' && Array.isArray(fallback.stops) && fallback.stops.length > 0) {
7858
+ return fallback;
7859
+ }
7860
+ // Ultimate fallback with guaranteed structure
7861
+ return {
7862
+ stops: [
7863
+ ['rgba(255, 255, 255, 1)', 0, 0],
7864
+ ['rgba(0, 0, 0, 1)', 1, 1]
7865
+ ],
7866
+ gradient: 'linear-gradient(90deg, #ffffff 0%, #000000 100%)',
7867
+ modifier: 90,
7868
+ type: 'linear'
7869
+ };
7870
+ }
7871
+ // Validate parsed result has required structure
7872
+ if (parsed && typeof parsed === 'object' && Array.isArray(parsed.stops) && parsed.stops.length > 0) {
7873
+ return parsed;
7874
+ }
7875
+ // If parsed result is invalid, use ultimate fallback
7876
+ console.warn('Parsed gradient has invalid structure:', parsed);
7877
+ return {
7878
+ stops: [
7879
+ ['rgba(255, 255, 255, 1)', 0, 0],
7880
+ ['rgba(0, 0, 0, 1)', 1, 1]
7881
+ ],
7882
+ gradient: 'linear-gradient(90deg, #ffffff 0%, #000000 100%)',
7883
+ modifier: 90,
7884
+ type: 'linear'
7885
+ };
7886
+ }
7887
+ catch (error) {
7888
+ console.warn('Error parsing gradient, using ultimate fallback:', error);
7889
+ return {
7890
+ stops: [
7891
+ ['rgba(255, 255, 255, 1)', 0, 0],
7892
+ ['rgba(0, 0, 0, 1)', 1, 1]
7893
+ ],
7894
+ gradient: 'linear-gradient(90deg, #ffffff 0%, #000000 100%)',
7895
+ modifier: 90,
7896
+ type: 'linear'
7897
+ };
7898
+ }
7735
7899
  // eslint-disable-next-line react-hooks/exhaustive-deps
7736
7900
  }, [value]);
7737
7901
  var _s = parsedColors(), stops = _s.stops, type = _s.type, modifier = _s.modifier;
7738
- var lastStop = rgbaToArray(stops[stops.length - 1][0]);
7739
- var activeStopIndex = stops.length - 1;
7740
- var activeStop = rgbaToHex([lastStop[0], lastStop[1], lastStop[2]]);
7741
- var activeAlpha = Math.round(lastStop[3] * 100);
7742
7902
  var iroPickerRef = useRef(null);
7743
7903
  var containerRef = useRef(null);
7744
7904
  var isUpdatingFromGradientStop = useRef(false);
7745
7905
  var _t = __read(useState(200), 2), pickerWidth = _t[0], setPickerWidth = _t[1];
7906
+ // Safe extraction of stop data with fallbacks
7907
+ var safeStops = Array.isArray(stops) && stops.length > 0 ? stops : [['rgba(255, 255, 255, 1)', 0, 0], ['rgba(0, 0, 0, 1)', 1, 1]];
7908
+ var safeLastStop = rgbaToArray(safeStops[safeStops.length - 1][0]);
7909
+ var safeParsedLastStop = Array.isArray(safeLastStop) && safeLastStop.length >= 4 ? safeLastStop : [255, 255, 255, 1];
7910
+ var activeStopIndex = safeStops.length - 1;
7911
+ var activeStop = rgbaToHex([safeParsedLastStop[0], safeParsedLastStop[1], safeParsedLastStop[2]]);
7912
+ var activeAlpha = Math.round(safeParsedLastStop[3] * 100);
7746
7913
  // Responsive width for IroColorPicker - match solid picker logic
7747
7914
  useEffect(function () {
7748
7915
  if (!containerRef.current)
@@ -7785,12 +7952,12 @@ var IroGradient = function (_a) {
7785
7952
  gradient: value,
7786
7953
  type: type,
7787
7954
  modifier: modifier,
7788
- stops: stops
7955
+ stops: safeStops
7789
7956
  }), 2), color = _u[0], setColor = _u[1];
7790
7957
  var _v = __read(useState({
7791
7958
  hex: activeStop,
7792
7959
  alpha: activeAlpha,
7793
- loc: stops[activeStopIndex][1],
7960
+ loc: safeStops[activeStopIndex][1],
7794
7961
  index: activeStopIndex
7795
7962
  }), 2), activeColor = _v[0], setActiveColor = _v[1];
7796
7963
  var debounceColor = useDebounce(color, debounceMS);
@@ -8023,11 +8190,11 @@ var IroGradient = function (_a) {
8023
8190
  var handleColorFromPanel = function (newColor) {
8024
8191
  setColor(newColor);
8025
8192
  if (newColor === null || newColor === void 0 ? void 0 : newColor.stops) {
8026
- var lastStop_1 = rgbaToArray(newColor.stops[newColor.stops.length - 1][0]);
8027
- var activeStop_1 = rgbaToHex([lastStop_1[0], lastStop_1[1], lastStop_1[2]]);
8193
+ var lastStop = rgbaToArray(newColor.stops[newColor.stops.length - 1][0]);
8194
+ var activeStop_1 = rgbaToHex([lastStop[0], lastStop[1], lastStop[2]]);
8028
8195
  var newActiveColor = {
8029
8196
  hex: activeStop_1,
8030
- alpha: Math.round(lastStop_1[3] * 100),
8197
+ alpha: Math.round(lastStop[3] * 100),
8031
8198
  loc: newColor.stops[newColor.stops.length - 1][1],
8032
8199
  index: newColor.stops.length - 1
8033
8200
  };
@@ -8472,5 +8639,5 @@ var ColorPicker = function (_a) {
8472
8639
  gradient ? (React.createElement(IroGradient, { onChange: onChangeGradient, value: cssValue, format: format, defaultColors: defaultColors, debounceMS: debounceMS, debounce: debounce, showAlpha: showAlpha, showInputs: showInputs, showGradientResult: showGradientResult, showGradientStops: showGradientStops, showGradientMode: showGradientMode, showGradientAngle: showGradientAngle, showGradientPosition: showGradientPosition, allowAddGradientStops: allowAddGradientStops, colorBoardHeight: colorBoardHeight, showReset: showReset, onReset: onReset })) : (React.createElement(Fragment, null))))) : null)));
8473
8640
  };
8474
8641
 
8475
- export { ColorPicker, DEFAULT_COLORS, InputRgba, PopupTabs, PopupTabsBody, PopupTabsBodyItem, PopupTabsHeader, PopupTabsHeaderLabel, RADIALS_POS, ThemeProvider, ThemeToggle, TinyColor, checkFormat, cn, cssToGradientObject, ColorPicker as default, getGradient, getHexAlpha, gradientObjectToCss, hexToRgba, isGradientObject, isValidHex, isValidRgba, normalizeGradientValue, parseGradient, rgbaToArray, rgbaToHex, useDebounce, validGradient };
8642
+ export { ColorPicker, DEFAULT_COLORS, InputRgba, PopupTabs, PopupTabsBody, PopupTabsBodyItem, PopupTabsHeader, PopupTabsHeaderLabel, RADIALS_POS, ThemeProvider, ThemeToggle, TinyColor, checkFormat, cn, cssToGradientObject, ColorPicker as default, flexibleGradientToCss, getGradient, getHexAlpha, gradientObjectToCss, hexToRgba, isGradientObject, isValidHex, isValidRgba, normalizeGradientValue, parseGradient, rgbaToArray, rgbaToHex, useDebounce, validGradient };
8476
8643
  //# sourceMappingURL=index.es.js.map