react-iro-gradient-picker 1.1.6 → 1.2.1

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
@@ -6582,6 +6582,94 @@ var parseGradient = (function (str) {
6582
6582
  }
6583
6583
  });
6584
6584
 
6585
+ /**
6586
+ * Convert gradient object to CSS gradient string
6587
+ */
6588
+ function gradientObjectToCss(gradientData) {
6589
+ var type = gradientData.type, _a = gradientData.angle, angle = _a === void 0 ? 90 : _a, stops = gradientData.stops;
6590
+ // Convert stops to CSS format
6591
+ var cssStops = stops
6592
+ .sort(function (a, b) { return a.position - b.position; }) // Ensure stops are in order
6593
+ .map(function (stop) {
6594
+ var color = tinycolor(stop.color);
6595
+ return "".concat(color.toRgbString(), " ").concat(stop.position, "%");
6596
+ })
6597
+ .join(', ');
6598
+ if (type === 'linear') {
6599
+ return "linear-gradient(".concat(angle, "deg, ").concat(cssStops, ")");
6600
+ }
6601
+ else {
6602
+ return "radial-gradient(circle, ".concat(cssStops, ")");
6603
+ }
6604
+ }
6605
+ /**
6606
+ * Convert CSS gradient string to gradient object
6607
+ */
6608
+ function cssToGradientObject(cssGradient) {
6609
+ try {
6610
+ var parsed = parseGradient(cssGradient);
6611
+ if (!parsed) {
6612
+ return null;
6613
+ }
6614
+ var type = parsed.type, modifier = parsed.modifier, stops = parsed.stops;
6615
+ // Convert stops to object format
6616
+ var gradientStops = stops.map(function (stop) { return ({
6617
+ color: String(stop[0]), // Ensure it's a string
6618
+ position: Math.round(stop[1] * 100) // Convert to percentage
6619
+ }); });
6620
+ // Extract angle from modifier (for linear gradients)
6621
+ var angle = 90; // Default angle
6622
+ if (type === 'linear' && modifier && typeof modifier === 'string') {
6623
+ var angleMatch = modifier.match(/(\d+)deg/);
6624
+ if (angleMatch) {
6625
+ angle = parseInt(angleMatch[1], 10);
6626
+ }
6627
+ }
6628
+ return {
6629
+ type: type,
6630
+ angle: type === 'linear' ? angle : undefined,
6631
+ stops: gradientStops,
6632
+ defaultActiveTab: 'gradient'
6633
+ };
6634
+ }
6635
+ catch (error) {
6636
+ console.warn('Failed to parse CSS gradient:', error);
6637
+ return null;
6638
+ }
6639
+ }
6640
+ /**
6641
+ * Check if a value is a gradient object
6642
+ */
6643
+ function isGradientObject(value) {
6644
+ return (value &&
6645
+ typeof value === 'object' &&
6646
+ 'type' in value &&
6647
+ 'stops' in value &&
6648
+ Array.isArray(value.stops) &&
6649
+ value.stops.length > 0 &&
6650
+ value.stops.every(function (stop) {
6651
+ return stop &&
6652
+ typeof stop === 'object' &&
6653
+ 'color' in stop &&
6654
+ 'position' in stop &&
6655
+ typeof stop.position === 'number';
6656
+ }));
6657
+ }
6658
+ /**
6659
+ * Normalize value to always return a CSS gradient string
6660
+ */
6661
+ function normalizeGradientValue(value) {
6662
+ if (typeof value === 'string') {
6663
+ return value;
6664
+ }
6665
+ if (isGradientObject(value)) {
6666
+ return gradientObjectToCss(value);
6667
+ }
6668
+ // Fallback
6669
+ return 'linear-gradient(90deg, #ffffff 0%, #000000 100%)';
6670
+ }
6671
+ // End of file
6672
+
6585
6673
  var getAlphaValue = function (value) {
6586
6674
  value.replace(/%/i, '');
6587
6675
  if (value[0] === '0' && value.length > 1) {
@@ -6988,28 +7076,35 @@ IroColorPicker.displayName = 'IroColorPicker';
6988
7076
 
6989
7077
  var getIndexActiveTag = function (value) {
6990
7078
  var tab = 'solid';
6991
- var validValue = tinycolor(value).isValid();
6992
- if (value) {
6993
- if (value === 'transparent') {
6994
- tab = 'solid';
6995
- return tab;
6996
- }
6997
- if (validValue &&
6998
- !value.trim().startsWith('radial-gradient') &&
6999
- !value.trim().startsWith('linear-gradient')) {
7000
- tab = 'solid';
7001
- return tab;
7002
- }
7003
- var rgba = rgbaToArray(value);
7004
- if (rgba) {
7005
- if (isValidRgba([rgba[0], rgba[1], rgba[2]])) {
7079
+ // Handle gradient object
7080
+ if (isGradientObject(value)) {
7081
+ return 'gradient';
7082
+ }
7083
+ // Handle string value
7084
+ if (typeof value === 'string') {
7085
+ var validValue = tinycolor(value).isValid();
7086
+ if (value) {
7087
+ if (value === 'transparent') {
7006
7088
  tab = 'solid';
7007
7089
  return tab;
7008
7090
  }
7009
- }
7010
- else {
7011
- tab = 'gradient';
7012
- return tab;
7091
+ if (validValue &&
7092
+ !value.trim().startsWith('radial-gradient') &&
7093
+ !value.trim().startsWith('linear-gradient')) {
7094
+ tab = 'solid';
7095
+ return tab;
7096
+ }
7097
+ var rgba = rgbaToArray(value);
7098
+ if (rgba) {
7099
+ if (isValidRgba([rgba[0], rgba[1], rgba[2]])) {
7100
+ tab = 'solid';
7101
+ return tab;
7102
+ }
7103
+ }
7104
+ else {
7105
+ tab = 'gradient';
7106
+ return tab;
7107
+ }
7013
7108
  }
7014
7109
  }
7015
7110
  return tab;
@@ -7792,7 +7887,9 @@ var IroGradient = function (_a) {
7792
7887
  React.useEffect(function () {
7793
7888
  var initializeIroPicker = function () {
7794
7889
  var _a, _b;
7795
- if (((_b = (_a = iroPickerRef.current) === null || _a === void 0 ? void 0 : _a.colorPicker) === null || _b === void 0 ? void 0 : _b.color) && activeColor.hex) {
7890
+ if (((_b = (_a = iroPickerRef.current) === null || _a === void 0 ? void 0 : _a.colorPicker) === null || _b === void 0 ? void 0 : _b.color) &&
7891
+ activeColor.hex &&
7892
+ typeof activeColor.alpha === 'number') {
7796
7893
  console.log('🚀 Initializing iro picker with activeColor:', activeColor);
7797
7894
  // Wait a bit for the picker to be fully ready, then update
7798
7895
  setTimeout(function () {
@@ -7813,13 +7910,19 @@ var IroGradient = function (_a) {
7813
7910
  var handleSetActiveColor = React.useCallback(function (newActiveColor) {
7814
7911
  console.log('🎯 Gradient stop clicked, setting active color:', newActiveColor);
7815
7912
  setActiveColor(newActiveColor);
7816
- // Force immediate update of iro picker with longer delay for first-time reliability
7817
- setTimeout(function () {
7818
- updateIroPickerColor({
7819
- hex: newActiveColor.hex,
7820
- alpha: newActiveColor.alpha
7821
- });
7822
- }, 50); // Increased from 5ms to 50ms for better first-time success
7913
+ // Validate before updating iro picker
7914
+ if (newActiveColor.hex && typeof newActiveColor.alpha === 'number') {
7915
+ // Force immediate update of iro picker with longer delay for first-time reliability
7916
+ setTimeout(function () {
7917
+ updateIroPickerColor({
7918
+ hex: newActiveColor.hex,
7919
+ alpha: newActiveColor.alpha
7920
+ });
7921
+ }, 50); // Increased from 5ms to 50ms for better first-time success
7922
+ }
7923
+ else {
7924
+ console.log('⚠️ Skipping iro picker update in handleSetActiveColor - invalid data:', newActiveColor);
7925
+ }
7823
7926
  }, [updateIroPickerColor]);
7824
7927
  // Update iro picker when activeColor changes (e.g., clicking gradient stops)
7825
7928
  React.useEffect(function () {
@@ -7829,18 +7932,17 @@ var IroGradient = function (_a) {
7829
7932
  index: activeColor.index,
7830
7933
  loc: activeColor.loc
7831
7934
  });
7935
+ // Validate activeColor before proceeding
7936
+ if (!activeColor.hex || typeof activeColor.alpha !== 'number') {
7937
+ console.log('⚠️ Skipping iro picker update - invalid activeColor:', activeColor);
7938
+ return;
7939
+ }
7832
7940
  // Add a small delay to ensure the activeColor state has fully updated
7833
7941
  var timeoutId = setTimeout(function () {
7834
7942
  updateIroPickerColor({ hex: activeColor.hex, alpha: activeColor.alpha });
7835
7943
  }, 10);
7836
7944
  return function () { return clearTimeout(timeoutId); };
7837
- }, [
7838
- activeColor.hex,
7839
- activeColor.alpha,
7840
- activeColor.index,
7841
- activeColor.loc,
7842
- updateIroPickerColor
7843
- ]);
7945
+ }, [activeColor, updateIroPickerColor]);
7844
7946
  var updateGradient = React.useCallback(function (newColor) {
7845
7947
  if (Array.isArray(newColor)) {
7846
7948
  // Handle the case where it's called with stops array
@@ -8327,7 +8429,22 @@ var PopupTabsBodyItem = function (_a) {
8327
8429
 
8328
8430
  var ColorPicker = function (_a) {
8329
8431
  var _b = _a.value, value = _b === void 0 ? '#ffffff' : _b, _c = _a.format, format = _c === void 0 ? 'rgb' : _c, _d = _a.gradient, gradient = _d === void 0 ? false : _d, _e = _a.solid, solid = _e === void 0 ? true : _e, _f = _a.debounceMS, debounceMS = _f === void 0 ? 300 : _f, _g = _a.debounce, debounce = _g === void 0 ? true : _g, _h = _a.showAlpha, showAlpha = _h === void 0 ? true : _h, _j = _a.showInputs, showInputs = _j === void 0 ? true : _j, _k = _a.showGradientResult, showGradientResult = _k === void 0 ? true : _k, _l = _a.showGradientStops, showGradientStops = _l === void 0 ? true : _l, _m = _a.showGradientMode, showGradientMode = _m === void 0 ? true : _m, _o = _a.showGradientAngle, showGradientAngle = _o === void 0 ? true : _o, _p = _a.showGradientPosition, showGradientPosition = _p === void 0 ? true : _p, _q = _a.allowAddGradientStops, allowAddGradientStops = _q === void 0 ? true : _q, _r = _a.popupWidth, popupWidth = _r === void 0 ? 267 : _r, _s = _a.colorBoardHeight, colorBoardHeight = _s === void 0 ? 120 : _s, _t = _a.defaultColors, defaultColors = _t === void 0 ? DEFAULT_COLORS : _t, defaultActiveTab = _a.defaultActiveTab, onChangeTabs = _a.onChangeTabs, _u = _a.onChange, onChange = _u === void 0 ? function () { return ({}); } : _u, _v = _a.showReset, showReset = _v === void 0 ? false : _v, onReset = _a.onReset;
8330
- var _w = __read(React.useState(defaultActiveTab || getIndexActiveTag(value)), 2), activeTab = _w[0], setActiveTab = _w[1];
8432
+ // Convert object value to CSS string for internal use
8433
+ var cssValue = normalizeGradientValue(value);
8434
+ // Auto-switch to gradient tab if receiving gradient object
8435
+ var initialTab = isGradientObject(value)
8436
+ ? 'gradient'
8437
+ : defaultActiveTab || getIndexActiveTag(value);
8438
+ var _w = __read(React.useState(initialTab), 2), activeTab = _w[0], setActiveTab = _w[1];
8439
+ // Auto-switch tab when value changes from object to string or vice versa
8440
+ React__default["default"].useEffect(function () {
8441
+ if (isGradientObject(value) && activeTab !== 'gradient') {
8442
+ setActiveTab('gradient');
8443
+ if (typeof onChangeTabs === 'function') {
8444
+ onChangeTabs('gradient');
8445
+ }
8446
+ }
8447
+ }, [value, activeTab, onChangeTabs]);
8331
8448
  var onChangeSolid = function (value) {
8332
8449
  onChange(value);
8333
8450
  };
@@ -8350,17 +8467,17 @@ var ColorPicker = function (_a) {
8350
8467
  React__default["default"].createElement(PopupTabsHeaderLabel, { tabName: 'gradient', onClick: function () { return onChangeTab('gradient'); } }, "Gradient")),
8351
8468
  React__default["default"].createElement(PopupTabsBody, null,
8352
8469
  React__default["default"].createElement(PopupTabsBodyItem, { tabName: 'solid' },
8353
- React__default["default"].createElement(IroSolidColorPicker, { onChange: onChangeSolid, value: value, format: format, defaultColors: defaultColors, debounceMS: debounceMS, debounce: debounce, showAlpha: showAlpha, showInputs: showInputs, colorBoardHeight: colorBoardHeight, showReset: showReset, onReset: onReset })),
8470
+ React__default["default"].createElement(IroSolidColorPicker, { onChange: onChangeSolid, value: cssValue, format: format, defaultColors: defaultColors, debounceMS: debounceMS, debounce: debounce, showAlpha: showAlpha, showInputs: showInputs, colorBoardHeight: colorBoardHeight, showReset: showReset, onReset: onReset })),
8354
8471
  React__default["default"].createElement(PopupTabsBodyItem, { tabName: 'gradient' },
8355
- React__default["default"].createElement(IroGradient, { onChange: onChangeGradient, value: value, 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 })))))));
8472
+ React__default["default"].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 })))))));
8356
8473
  }
8357
8474
  return (React__default["default"].createElement(ThemeProvider, null,
8358
8475
  React__default["default"].createElement("div", { className: 'relative dark iro-gradient-picker', "data-color-picker-theme": true },
8359
8476
  React__default["default"].createElement(ThemeToggle, null),
8360
8477
  solid || gradient ? (React__default["default"].createElement(PopupTabs, { popupWidth: popupWidth },
8361
8478
  React__default["default"].createElement(PopupTabsBody, null,
8362
- solid ? (React__default["default"].createElement(IroSolidColorPicker, { onChange: onChangeSolid, value: value, format: format, defaultColors: defaultColors, debounceMS: debounceMS, debounce: debounce, showAlpha: showAlpha, showInputs: showInputs, colorBoardHeight: colorBoardHeight, showReset: showReset, onReset: onReset })) : (React__default["default"].createElement(React.Fragment, null)),
8363
- gradient ? (React__default["default"].createElement(IroGradient, { onChange: onChangeGradient, value: value, 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__default["default"].createElement(React.Fragment, null))))) : null)));
8479
+ solid ? (React__default["default"].createElement(IroSolidColorPicker, { onChange: onChangeSolid, value: cssValue, format: format, defaultColors: defaultColors, debounceMS: debounceMS, debounce: debounce, showAlpha: showAlpha, showInputs: showInputs, colorBoardHeight: colorBoardHeight, showReset: showReset, onReset: onReset })) : (React__default["default"].createElement(React.Fragment, null)),
8480
+ gradient ? (React__default["default"].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__default["default"].createElement(React.Fragment, null))))) : null)));
8364
8481
  };
8365
8482
 
8366
8483
  exports.ColorPicker = ColorPicker;
@@ -8377,12 +8494,16 @@ exports.ThemeToggle = ThemeToggle;
8377
8494
  exports.TinyColor = TinyColor;
8378
8495
  exports.checkFormat = checkFormat;
8379
8496
  exports.cn = cn;
8497
+ exports.cssToGradientObject = cssToGradientObject;
8380
8498
  exports["default"] = ColorPicker;
8381
8499
  exports.getGradient = getGradient;
8382
8500
  exports.getHexAlpha = getHexAlpha;
8501
+ exports.gradientObjectToCss = gradientObjectToCss;
8383
8502
  exports.hexToRgba = hexToRgba;
8503
+ exports.isGradientObject = isGradientObject;
8384
8504
  exports.isValidHex = isValidHex;
8385
8505
  exports.isValidRgba = isValidRgba;
8506
+ exports.normalizeGradientValue = normalizeGradientValue;
8386
8507
  exports.parseGradient = parseGradient;
8387
8508
  exports.rgbaToArray = rgbaToArray;
8388
8509
  exports.rgbaToHex = rgbaToHex;