@arbisoft/react-design-tool 1.0.27 → 1.0.29

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
@@ -40,13 +40,13 @@ yarn add @arbisoft/react-design-tool
40
40
  #### ⚠️ Important: Installation Guide for React 18 and Below
41
41
 
42
42
  ```bash
43
- npm install @arbisoft/react-design-tool@1.0.27
43
+ npm install @arbisoft/react-design-tool@1.0.29
44
44
  ```
45
45
 
46
46
  OR
47
47
 
48
48
  ```bash
49
- yarn add @arbisoft/react-design-tool@1.0.27
49
+ yarn add @arbisoft/react-design-tool@1.0.29
50
50
 
51
51
  ```
52
52
 
@@ -345,7 +345,6 @@ onCreateNewTemplate={(elements) => {
345
345
  A callback function triggered whenever a user selects a template (default or custom) from the template sidebar.
346
346
  It receives the backend `id` of the selected template (if available), or `null` if the canvas was reset (e.g., for a new template).
347
347
 
348
-
349
348
  **Example:**
350
349
 
351
350
  ```jsx
@@ -354,3 +353,54 @@ onTemplateSelect={(templateId) => {
354
353
  setSelectedTemplateId(templateId);
355
354
  }}
356
355
  ```
356
+
357
+ #### 19. `zoomLevel` (Number)
358
+
359
+ Sets the initial and externally controlled zoom level of the canvas.
360
+
361
+ - Accepts a number (percentage value, e.g., 100 for 100%)
362
+ - Dynamically updates canvas zoom level when the value changes
363
+
364
+ **Example:**
365
+
366
+ ```jsx
367
+ <Studio zoomLevel={80} />
368
+ ```
369
+
370
+ #### 20. `uploadQRLogoImage` (Async Function)
371
+ A separate callback for uploading QR code logos. This is useful when your QR logos follow a different upload flow than general images.
372
+
373
+ - Accepts a `File`
374
+ - Should return a URL string or an object with `{ url: string }`
375
+
376
+ **Example:**
377
+
378
+ ```jsx
379
+ <Studio
380
+ uploadQRLogoImage={async (file) => {
381
+ const formData = new FormData();
382
+ formData.append('file', file);
383
+ const res = await axios.post('/upload/logo', formData);
384
+ return res.data.url;
385
+ }}
386
+ />
387
+ ```
388
+ #### 21. showBackgroundImagePicker (Boolean)
389
+
390
+ Used to set background image on entire canvas
391
+
392
+ **Example:**
393
+
394
+ ```jsx
395
+ <Studio showBackgroundImagePicker={true} />
396
+ ```
397
+
398
+ #### 22. showOpacityPicker (Boolean)
399
+
400
+ Related to `showBackgroundImagePicker` and it's opacity value
401
+
402
+ **Example:**
403
+
404
+ ```jsx
405
+ <Studio showOpacityPicker={true} />
406
+ ```
package/dist/cjs/index.js CHANGED
@@ -569,6 +569,8 @@ var IconUnlock = "data:image/svg+xml,%3Csvg%20width%3D%2217%22%20height%3D%2216%
569
569
 
570
570
  var IconCross = "data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%2024%2024%22%20xml%3Aspace%3D%22preserve%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20enable-background%3D%22new%200%200%2024%2024%22%3E%3Cpath%20d%3D%22M5.3%2018.7c.2.2.4.3.7.3s.5-.1.7-.3l5.3-5.3%205.3%205.3c.2.2.5.3.7.3s.5-.1.7-.3c.4-.4.4-1%200-1.4L13.4%2012l5.3-5.3c.4-.4.4-1%200-1.4s-1-.4-1.4%200L12%2010.6%206.7%205.3c-.4-.4-1-.4-1.4%200s-.4%201%200%201.4l5.3%205.3-5.3%205.3c-.4.4-.4%201%200%201.4z%22%20id%3D%22_icons%22%20fill%3D%22%23ffffff%22%20class%3D%22fill-000000%22%3E%3C%2Fpath%3E%3C%2Fsvg%3E";
571
571
 
572
+ var IconRoundedCorner = "data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20enable-background%3D%22new%200%200%2024%2024%22%20height%3D%2224px%22%20viewBox%3D%220%200%2024%2024%22%20width%3D%2224px%22%20fill%3D%22%234D6277%22%3E%3Cg%3E%3Crect%20fill%3D%22none%22%20height%3D%2224%22%20width%3D%2224%22%2F%3E%3C%2Fg%3E%3Cg%3E%3Cg%3E%3Cg%3E%3Cpath%20d%3D%22M19%2C19h2v2h-2V19z%20M19%2C17h2v-2h-2V17z%20M3%2C13h2v-2H3V13z%20M3%2C17h2v-2H3V17z%20M3%2C9h2V7H3V9z%20M3%2C5h2V3H3V5z%20M7%2C5h2V3H7V5z%20M15%2C21h2v-2h-2V21z%20M11%2C21h2v-2h-2V21z%20M15%2C21h2v-2h-2V21z%20M7%2C21h2v-2H7V21z%20M3%2C21h2v-2H3V21z%20M21%2C8c0-2.76-2.24-5-5-5h-5v2h5%20c1.65%2C0%2C3%2C1.35%2C3%2C3v5h2V8z%22%2F%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E";
573
+
572
574
  var EditorBg = "/images/small-dots.png";
573
575
 
574
576
  var topTabBarpadding = '11.51px 14.16px';
@@ -2536,7 +2538,8 @@ var OpacityPicker = function OpacityPicker(_ref) {
2536
2538
  _ref$tooltip = _ref.tooltip,
2537
2539
  tooltip = _ref$tooltip === void 0 ? TEXT_DICTIONARY === null || TEXT_DICTIONARY === void 0 || (_TEXT_DICTIONARY$lang = TEXT_DICTIONARY[languageLocale]) === null || _TEXT_DICTIONARY$lang === void 0 ? void 0 : _TEXT_DICTIONARY$lang.OPACITY : _ref$tooltip,
2538
2540
  _ref$tooltipPosition = _ref.tooltipPosition,
2539
- tooltipPosition = _ref$tooltipPosition === void 0 ? 'bottom' : _ref$tooltipPosition;
2541
+ tooltipPosition = _ref$tooltipPosition === void 0 ? 'bottom' : _ref$tooltipPosition,
2542
+ toolBarIcon = _ref.toolBarIcon;
2540
2543
  var pickerRef = React.useRef(null);
2541
2544
  var _useState = React.useState(false),
2542
2545
  _useState2 = _slicedToArray(_useState, 2),
@@ -2566,10 +2569,10 @@ var OpacityPicker = function OpacityPicker(_ref) {
2566
2569
  tooltip: tooltip,
2567
2570
  tooltipPosition: tooltipPosition
2568
2571
  }, showLeftChild && (leftChild ? leftChild : /*#__PURE__*/React.createElement(StyledImage, {
2569
- src: IconOpacity
2572
+ src: varient === 'opacity' ? IconOpacity : toolBarIcon
2570
2573
  })), /*#__PURE__*/React.createElement(StyledText, {
2571
2574
  fontFamily: fontFamily
2572
- }, varient === 'opacity' ? "".concat(value * 100, "%") : Math.round(value)), rightChild && rightChild), opacityPickerVisible && /*#__PURE__*/React.createElement("div", {
2575
+ }, varient === 'opacity' ? "".concat(value * 100, "%") : "".concat(Math.round(value), "px")), rightChild && rightChild), opacityPickerVisible && /*#__PURE__*/React.createElement("div", {
2573
2576
  style: {
2574
2577
  position: 'absolute',
2575
2578
  bottom: -50,
@@ -2755,7 +2758,11 @@ var TemplateToolBar = function TemplateToolBar(_ref) {
2755
2758
  cuttingGuideStrokeColor = _ref.cuttingGuideStrokeColor,
2756
2759
  onChangeCuttingGuideProp = _ref.onChangeCuttingGuideProp,
2757
2760
  canvasBackgroundImage = _ref.canvasBackgroundImage,
2758
- onRemoveBackgroundImage = _ref.onRemoveBackgroundImage;
2761
+ onRemoveBackgroundImage = _ref.onRemoveBackgroundImage,
2762
+ _ref$showBackgroundIm = _ref.showBackgroundImagePicker,
2763
+ showBackgroundImagePicker = _ref$showBackgroundIm === void 0 ? true : _ref$showBackgroundIm,
2764
+ _ref$showOpacityPicke = _ref.showOpacityPicker,
2765
+ showOpacityPicker = _ref$showOpacityPicke === void 0 ? true : _ref$showOpacityPicke;
2759
2766
  var selectBackgroundColor = function selectBackgroundColor(e) {
2760
2767
  onSetBackgroundColor(e);
2761
2768
  };
@@ -2820,7 +2827,7 @@ var TemplateToolBar = function TemplateToolBar(_ref) {
2820
2827
  }), /*#__PURE__*/React.createElement(ColorBox, {
2821
2828
  backgroundColor: canvasBackgroundColor || theme.color.white,
2822
2829
  onChange: selectBackgroundColor
2823
- })), /*#__PURE__*/React.createElement(ToolBarButtonWrapper, {
2830
+ })), showBackgroundImagePicker && /*#__PURE__*/React.createElement(ToolBarButtonWrapper, {
2824
2831
  paddingRight: 17,
2825
2832
  paddingLeft: 17,
2826
2833
  onClick: handleBackgroundUpload,
@@ -2839,7 +2846,7 @@ var TemplateToolBar = function TemplateToolBar(_ref) {
2839
2846
  src: (canvasBackgroundImage === null || canvasBackgroundImage === void 0 ? void 0 : canvasBackgroundImage.src) || IconBackgroundImage,
2840
2847
  height: 24,
2841
2848
  width: 24
2842
- })), /*#__PURE__*/React.createElement(OpacityPicker, {
2849
+ })), showOpacityPicker && /*#__PURE__*/React.createElement(OpacityPicker, {
2843
2850
  tooltip: TEXT_DICTIONARY === null || TEXT_DICTIONARY === void 0 || (_TEXT_DICTIONARY$lang4 = TEXT_DICTIONARY[languageLocale]) === null || _TEXT_DICTIONARY$lang4 === void 0 ? void 0 : _TEXT_DICTIONARY$lang4.BACKGROUND_IMAGE_OPACITY,
2844
2851
  gap: 10,
2845
2852
  value: backgroundImageOpacity,
@@ -3216,7 +3223,8 @@ var propTypes$l = {
3216
3223
  onChangeShapeFill: PropTypes.func,
3217
3224
  onChangeShapeOpacity: PropTypes.func,
3218
3225
  selectedElement: PropTypes.object,
3219
- languageLocale: PropTypes.string
3226
+ languageLocale: PropTypes.string,
3227
+ onChangeCornerRadius: PropTypes.func
3220
3228
  };
3221
3229
 
3222
3230
  var _templateObject$g, _templateObject2$c;
@@ -3224,7 +3232,7 @@ styled.p(_templateObject$g || (_templateObject$g = _taggedTemplateLiteral(["\n
3224
3232
  var RowContainer$1 = styled.div(_templateObject2$c || (_templateObject2$c = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: row;\n align-items: center;\n flex-wrap: wrap;\n gap: 2px;\n"])));
3225
3233
 
3226
3234
  var ShapeToolBar = function ShapeToolBar(_ref) {
3227
- var _TEXT_DICTIONARY$lang, _TEXT_DICTIONARY$lang2;
3235
+ var _TEXT_DICTIONARY$lang, _TEXT_DICTIONARY$lang2, _TEXT_DICTIONARY$lang3;
3228
3236
  var shapeStrokeColor = _ref.shapeStrokeColor,
3229
3237
  shapeStrokeWidth = _ref.shapeStrokeWidth,
3230
3238
  shapeFillColor = _ref.shapeFillColor,
@@ -3234,7 +3242,8 @@ var ShapeToolBar = function ShapeToolBar(_ref) {
3234
3242
  onChangeShapeFill = _ref.onChangeShapeFill,
3235
3243
  onChangeShapeOpacity = _ref.onChangeShapeOpacity,
3236
3244
  selectedElement = _ref.selectedElement,
3237
- languageLocale = _ref.languageLocale;
3245
+ languageLocale = _ref.languageLocale,
3246
+ onChangeCornerRadius = _ref.onChangeCornerRadius;
3238
3247
  return /*#__PURE__*/React.createElement(RowContainer$1, null, /*#__PURE__*/React.createElement(ToolBarButtonWrapper, {
3239
3248
  gap: 11,
3240
3249
  tooltip: TEXT_DICTIONARY === null || TEXT_DICTIONARY === void 0 || (_TEXT_DICTIONARY$lang = TEXT_DICTIONARY[languageLocale]) === null || _TEXT_DICTIONARY$lang === void 0 ? void 0 : _TEXT_DICTIONARY$lang.SHAPE_FILL,
@@ -3255,6 +3264,16 @@ var ShapeToolBar = function ShapeToolBar(_ref) {
3255
3264
  value: isElementShape(selectedElement) ? selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.opacity : shapeOpacity,
3256
3265
  onChangeOpacity: onChangeShapeOpacity,
3257
3266
  languageLocale: languageLocale
3267
+ }), (selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.type) === 'square' && /*#__PURE__*/React.createElement(OpacityPicker, {
3268
+ tooltip: (TEXT_DICTIONARY === null || TEXT_DICTIONARY === void 0 || (_TEXT_DICTIONARY$lang3 = TEXT_DICTIONARY[languageLocale]) === null || _TEXT_DICTIONARY$lang3 === void 0 ? void 0 : _TEXT_DICTIONARY$lang3.CORNER_RADIUS) || 'Corner Radius',
3269
+ value: selectedElement.cornerRadius || 0,
3270
+ min: 0,
3271
+ max: 50,
3272
+ step: 1,
3273
+ varient: "radius",
3274
+ onChangeOpacity: onChangeCornerRadius,
3275
+ languageLocale: languageLocale,
3276
+ toolBarIcon: IconRoundedCorner
3258
3277
  }));
3259
3278
  };
3260
3279
  ShapeToolBar.propTypes = propTypes$l;
@@ -3338,7 +3357,10 @@ var TopToolBar = function TopToolBar(_ref) {
3338
3357
  cuttingGuideStroke = _ref.cuttingGuideStroke,
3339
3358
  cuttingGuideStrokeColor = _ref.cuttingGuideStrokeColor,
3340
3359
  onChangeCuttingGuideProp = _ref.onChangeCuttingGuideProp,
3341
- onRemoveBackgroundImage = _ref.onRemoveBackgroundImage;
3360
+ onRemoveBackgroundImage = _ref.onRemoveBackgroundImage,
3361
+ showBackgroundImagePicker = _ref.showBackgroundImagePicker,
3362
+ showOpacityPicker = _ref.showOpacityPicker,
3363
+ changeSelectedElementProperty = _ref.changeSelectedElementProperty;
3342
3364
  return /*#__PURE__*/React.createElement(ToolBarWrapper, {
3343
3365
  disabled: selectedElement && !(selectedElement !== null && selectedElement !== void 0 && selectedElement.draggable)
3344
3366
  }, selectedElement && !(selectedElement !== null && selectedElement !== void 0 && selectedElement.draggable) && /*#__PURE__*/React.createElement(OverlayBlocker, {
@@ -3360,7 +3382,9 @@ var TopToolBar = function TopToolBar(_ref) {
3360
3382
  cuttingGuideStroke: cuttingGuideStroke,
3361
3383
  cuttingGuideStrokeColor: cuttingGuideStrokeColor,
3362
3384
  onChangeCuttingGuideProp: onChangeCuttingGuideProp,
3363
- onRemoveBackgroundImage: onRemoveBackgroundImage
3385
+ onRemoveBackgroundImage: onRemoveBackgroundImage,
3386
+ showBackgroundImagePicker: showBackgroundImagePicker,
3387
+ showOpacityPicker: showOpacityPicker
3364
3388
  }) : selectedTab === (sideBarpillsList === null || sideBarpillsList === void 0 ? void 0 : sideBarpillsList.text) ? /*#__PURE__*/React.createElement(TextToolBar, {
3365
3389
  fontFamily: isElementOfSameType(selectedElement, elementTypes.text) ? selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.fontFamily : defaultTextProps === null || defaultTextProps === void 0 ? void 0 : defaultTextProps.fontFamily,
3366
3390
  fontSize: isElementOfSameType(selectedElement, elementTypes.text) ? selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.fontSize : defaultTextProps === null || defaultTextProps === void 0 ? void 0 : defaultTextProps.fontSize,
@@ -3393,7 +3417,10 @@ var TopToolBar = function TopToolBar(_ref) {
3393
3417
  shapeOpacity: shapeOpacity,
3394
3418
  onChangeShapeOpacity: onChangeShapeOpacity,
3395
3419
  selectedElement: selectedElement,
3396
- languageLocale: languageLocale
3420
+ languageLocale: languageLocale,
3421
+ onChangeCornerRadius: function onChangeCornerRadius(val) {
3422
+ changeSelectedElementProperty('cornerRadius', Number(val));
3423
+ }
3397
3424
  }) : selectedTab === (sideBarpillsList === null || sideBarpillsList === void 0 ? void 0 : sideBarpillsList.qr) ? /*#__PURE__*/React.createElement(QrToolBar, {
3398
3425
  qrStrokeWidth: qrStrokeWidth,
3399
3426
  qrStrokeColor: qrStrokeColor,
@@ -4533,7 +4560,10 @@ var Editor = function Editor(_ref) {
4533
4560
  showSaveButton = _ref.showSaveButton,
4534
4561
  onSetSelectedTab = _ref.onSetSelectedTab,
4535
4562
  saveButtonText = _ref.saveButtonText,
4536
- onRemoveBackgroundImage = _ref.onRemoveBackgroundImage;
4563
+ onRemoveBackgroundImage = _ref.onRemoveBackgroundImage,
4564
+ showBackgroundImagePicker = _ref.showBackgroundImagePicker,
4565
+ showOpacityPicker = _ref.showOpacityPicker,
4566
+ changeSelectedElementProperty = _ref.changeSelectedElementProperty;
4537
4567
  var transformerRef = React.useRef(null);
4538
4568
  React.useEffect(function () {
4539
4569
  if (transformerRef !== null && transformerRef !== void 0 && transformerRef.current) {
@@ -4637,6 +4667,7 @@ var Editor = function Editor(_ref) {
4637
4667
  key: el.id
4638
4668
  }, el, {
4639
4669
  id: el.id,
4670
+ cornerRadius: el.cornerRadius || 0,
4640
4671
  onClick: function onClick() {
4641
4672
  return handleSelect(el);
4642
4673
  },
@@ -4858,7 +4889,10 @@ var Editor = function Editor(_ref) {
4858
4889
  cuttingGuideStroke: cuttingGuideStroke,
4859
4890
  cuttingGuideStrokeColor: cuttingGuideStrokeColor,
4860
4891
  onChangeCuttingGuideProp: onChangeCuttingGuideProp,
4861
- onRemoveBackgroundImage: onRemoveBackgroundImage
4892
+ onRemoveBackgroundImage: onRemoveBackgroundImage,
4893
+ showBackgroundImagePicker: showBackgroundImagePicker,
4894
+ showOpacityPicker: showOpacityPicker,
4895
+ changeSelectedElementProperty: changeSelectedElementProperty
4862
4896
  }), /*#__PURE__*/React.createElement(InnerContainer, null, /*#__PURE__*/React.createElement(InnerContainerWrapper, {
4863
4897
  editorHeight: editorHeight + 50,
4864
4898
  editorWidth: editorWidth
@@ -5712,13 +5746,17 @@ var isPropValid = /* #__PURE__ */memoize(function (prop) {
5712
5746
  * @property {'en'|'ru'|'pl'|'de'|'es'|'fr'|'it'} [locale]
5713
5747
  * @property {Function} [onCreateNewTemplate] - called when user creates a new template, passes new canvas elements
5714
5748
  * @property {Function} [onTemplateSelect] - called when a template is selected, passes template id
5749
+ * @property {Function} [uploadQRLogoImage] - Optional callback to upload the QR logo image. Should return a string or an object with `{ url }`
5750
+ * @property {number} [zoomLevel] - Optional zoom level (e.g. 100 for 100%)
5751
+ * @property {boolean} [showBackgroundImagePicker] - Used to set background image on entire canvas
5752
+ * @property {boolean} [showOpacityPicker] - Related to showBackgroundImagePicker and it's opacity
5715
5753
  */
5716
5754
 
5717
5755
  /**
5718
5756
  * @type {React.ForwardRefExoticComponent<StudioProps & React.RefAttributes<HTMLDivElement>>}
5719
5757
  */
5720
5758
  var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
5721
- var _elements$elements$fi, _elements$find4, _elements$find5, _elements$find6;
5759
+ var _elements$elements$fi, _elements$find5, _elements$find6, _elements$find7;
5722
5760
  var _ref$title = _ref.title,
5723
5761
  title = _ref$title === void 0 ? '' : _ref$title,
5724
5762
  _ref$defaultQrLogo = _ref.defaultQrLogo,
@@ -5746,7 +5784,11 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
5746
5784
  _ref$locale = _ref.locale,
5747
5785
  locale = _ref$locale === void 0 ? 'en' : _ref$locale,
5748
5786
  onCreateNewTemplate = _ref.onCreateNewTemplate,
5749
- onTemplateSelect = _ref.onTemplateSelect;
5787
+ onTemplateSelect = _ref.onTemplateSelect,
5788
+ showBackgroundImagePicker = _ref.showBackgroundImagePicker,
5789
+ showOpacityPicker = _ref.showOpacityPicker,
5790
+ uploadQRLogoImage = _ref.uploadQRLogoImage,
5791
+ zoomLevel = _ref.zoomLevel;
5750
5792
  var stageRef = React.useRef(null);
5751
5793
  var _useState = React.useState(null),
5752
5794
  _useState2 = _slicedToArray(_useState, 2),
@@ -5780,7 +5822,7 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
5780
5822
  _useState14 = _slicedToArray(_useState13, 2),
5781
5823
  helperSideBarVisible = _useState14[0],
5782
5824
  setHelperSideBarVisible = _useState14[1];
5783
- var _useState15 = React.useState(100),
5825
+ var _useState15 = React.useState(zoomLevel !== null && zoomLevel !== void 0 ? zoomLevel : 100),
5784
5826
  _useState16 = _slicedToArray(_useState15, 2),
5785
5827
  zoomPercentage = _useState16[0],
5786
5828
  setZoomPercentage = _useState16[1];
@@ -5910,9 +5952,17 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
5910
5952
  return onSave;
5911
5953
  }(),
5912
5954
  loading: overallLoading,
5913
- setLoading: setLoading
5955
+ setLoading: setLoading,
5956
+ undoCount: history.length,
5957
+ hasChanges: history.length > 0,
5958
+ redoCount: redoStack.length
5914
5959
  };
5915
5960
  });
5961
+ React.useEffect(function () {
5962
+ if (typeof zoomLevel === 'number') {
5963
+ setZoomPercentage(zoomLevel);
5964
+ }
5965
+ }, [zoomLevel]);
5916
5966
  React.useEffect(function () {
5917
5967
  var handleKeyDown = function handleKeyDown(e) {
5918
5968
  var isMac = navigator.platform.toUpperCase().includes('MAC');
@@ -6065,25 +6115,41 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
6065
6115
  };
6066
6116
  saveHistory([].concat(_toConsumableArray(elemClone), [newElement]));
6067
6117
  };
6068
- var onSetPageSize = function onSetPageSize(size) {
6069
- if (!size) {
6070
- return;
6071
- }
6072
- var elemClone = JSON.parse(JSON.stringify(elements));
6073
- var sizeIndex = elemClone.findIndex(function (e) {
6118
+ var onSetPageSize = function onSetPageSize(newSize) {
6119
+ var _elements$find4;
6120
+ if (!newSize) return;
6121
+ var oldSize = (elements === null || elements === void 0 || (_elements$find4 = elements.find(function (e) {
6074
6122
  return (e === null || e === void 0 ? void 0 : e.type) === (elementTypes === null || elementTypes === void 0 ? void 0 : elementTypes.pageSize);
6123
+ })) === null || _elements$find4 === void 0 ? void 0 : _elements$find4.size) || pageSizes.A4;
6124
+ var oldDims = pageSizesDimensions[oldSize];
6125
+ var newDims = pageSizesDimensions[newSize];
6126
+ var scaleX = newDims.width / oldDims.width;
6127
+ var scaleY = newDims.height / oldDims.height;
6128
+ var scaledElements = elements.map(function (elem) {
6129
+ if (elem.type === elementTypes.pageSize) {
6130
+ return _objectSpread2(_objectSpread2({}, elem), {}, {
6131
+ size: newSize
6132
+ }); // Just update the size
6133
+ }
6134
+ var scaled = _objectSpread2({}, elem);
6135
+
6136
+ // Scale common position and size props
6137
+ if (typeof scaled.x === 'number') scaled.x *= scaleX;
6138
+ if (typeof scaled.y === 'number') scaled.y *= scaleY;
6139
+ if (typeof scaled.width === 'number') scaled.width *= scaleX;
6140
+ if (typeof scaled.height === 'number') scaled.height *= scaleY;
6141
+ if (typeof scaled.radius === 'number') scaled.radius *= Math.min(scaleX, scaleY); // for circles, stars
6142
+ if (typeof scaled.fontSize === 'number') scaled.fontSize *= Math.min(scaleX, scaleY);
6143
+
6144
+ // Special case: QR codes or icons that have scale or size props
6145
+ if (scaled.points && Array.isArray(scaled.points)) {
6146
+ scaled.points = scaled.points.map(function (val, idx) {
6147
+ return idx % 2 === 0 ? val * scaleX : val * scaleY;
6148
+ });
6149
+ }
6150
+ return scaled;
6075
6151
  });
6076
- if (sizeIndex > -1) {
6077
- elemClone[sizeIndex]['size'] = size;
6078
- } else {
6079
- var sizeElement = {
6080
- type: elementTypes === null || elementTypes === void 0 ? void 0 : elementTypes.pageSize,
6081
- id: "element".concat(Date.now()),
6082
- size: size
6083
- };
6084
- elemClone.push(sizeElement);
6085
- }
6086
- saveHistory(removeImageProperty(elemClone));
6152
+ saveHistory(removeImageProperty(scaledElements));
6087
6153
  };
6088
6154
  var _onChangeCuttingGuideProp = function onChangeCuttingGuideProp(type, value) {
6089
6155
  var elemClone = JSON.parse(JSON.stringify(elements));
@@ -6127,6 +6193,7 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
6127
6193
  shapeProps['height'] = 100;
6128
6194
  shapeProps['width'] = 100;
6129
6195
  shapeProps['name'] = elementTypes.square;
6196
+ shapeProps['cornerRadius'] = 0;
6130
6197
  addElement(shapeProps);
6131
6198
  } else if (type === elementTypes.arrowRight) {
6132
6199
  shapeProps['points'] = [0, 0, 100, 0];
@@ -6510,7 +6577,7 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
6510
6577
  };
6511
6578
  var addQrLogo = /*#__PURE__*/function () {
6512
6579
  var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
6513
- var file, imageUrl, reader;
6580
+ var file, result, imageUrl, reader, _t;
6514
6581
  return _regenerator().w(function (_context2) {
6515
6582
  while (1) switch (_context2.n) {
6516
6583
  case 0:
@@ -6524,29 +6591,45 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
6524
6591
  }
6525
6592
  return _context2.a(2);
6526
6593
  case 2:
6527
- if (!uploadImageCallBack) {
6528
- _context2.n = 4;
6594
+ if (!uploadQRLogoImage) {
6595
+ _context2.n = 8;
6529
6596
  break;
6530
6597
  }
6598
+ _context2.p = 3;
6531
6599
  setLoadingUploadImage(true);
6532
- _context2.n = 3;
6533
- return uploadImageCallBack(file);
6534
- case 3:
6535
- imageUrl = _context2.v;
6536
- addLogo(imageUrl);
6600
+ _context2.n = 4;
6601
+ return uploadQRLogoImage(file);
6602
+ case 4:
6603
+ result = _context2.v;
6604
+ imageUrl = typeof result === 'string' ? result : result === null || result === void 0 ? void 0 : result.url;
6605
+ if (imageUrl) {
6606
+ addLogo(imageUrl);
6607
+ } else {
6608
+ console.warn('uploadQRLogoImage did not return a valid image URL');
6609
+ }
6610
+ _context2.n = 6;
6611
+ break;
6612
+ case 5:
6613
+ _context2.p = 5;
6614
+ _t = _context2.v;
6615
+ console.error('Error uploading QR logo image:', _t);
6616
+ case 6:
6617
+ _context2.p = 6;
6537
6618
  setLoadingUploadImage(false);
6538
- _context2.n = 5;
6619
+ return _context2.f(6);
6620
+ case 7:
6621
+ _context2.n = 9;
6539
6622
  break;
6540
- case 4:
6623
+ case 8:
6541
6624
  reader = new FileReader();
6542
6625
  reader.onload = function () {
6543
6626
  addLogo(reader.result);
6544
6627
  };
6545
6628
  reader.readAsDataURL(file);
6546
- case 5:
6629
+ case 9:
6547
6630
  return _context2.a(2);
6548
6631
  }
6549
- }, _callee2);
6632
+ }, _callee2, null, [[3, 5, 6, 7]]);
6550
6633
  }));
6551
6634
  return function addQrLogo() {
6552
6635
  return _ref3.apply(this, arguments);
@@ -6657,12 +6740,12 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
6657
6740
  }), loadingFonts ? null : /*#__PURE__*/React.createElement(Editor
6658
6741
  // canvasSize={canvasSize}
6659
6742
  , {
6660
- cuttingGuideStroke: (elements === null || elements === void 0 || (_elements$find4 = elements.find(function (e) {
6743
+ cuttingGuideStroke: (elements === null || elements === void 0 || (_elements$find5 = elements.find(function (e) {
6661
6744
  return (e === null || e === void 0 ? void 0 : e.type) === (elementTypes === null || elementTypes === void 0 ? void 0 : elementTypes.pageSize);
6662
- })) === null || _elements$find4 === void 0 ? void 0 : _elements$find4.cuttingGuideStroke) || 0,
6663
- cuttingGuideStrokeColor: (elements === null || elements === void 0 || (_elements$find5 = elements.find(function (e) {
6745
+ })) === null || _elements$find5 === void 0 ? void 0 : _elements$find5.cuttingGuideStroke) || 0,
6746
+ cuttingGuideStrokeColor: (elements === null || elements === void 0 || (_elements$find6 = elements.find(function (e) {
6664
6747
  return (e === null || e === void 0 ? void 0 : e.type) === (elementTypes === null || elementTypes === void 0 ? void 0 : elementTypes.pageSize);
6665
- })) === null || _elements$find5 === void 0 ? void 0 : _elements$find5.cuttingGuideStrokeColor) || (theme === null || theme === void 0 ? void 0 : theme.color.black),
6748
+ })) === null || _elements$find6 === void 0 ? void 0 : _elements$find6.cuttingGuideStrokeColor) || (theme === null || theme === void 0 ? void 0 : theme.color.black),
6666
6749
  onChangeCuttingGuideProp: function onChangeCuttingGuideProp(type, value) {
6667
6750
  _onChangeCuttingGuideProp(type, value);
6668
6751
  },
@@ -6704,9 +6787,9 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
6704
6787
  stageRef: stageRef,
6705
6788
  saveHistory: saveHistory,
6706
6789
  onChangeBackgroundImageOpacity: onChangeBackgroundImageOpacity,
6707
- backgroundImageOpacity: (elements === null || elements === void 0 || (_elements$find6 = elements.find(function (e) {
6790
+ backgroundImageOpacity: (elements === null || elements === void 0 || (_elements$find7 = elements.find(function (e) {
6708
6791
  return (e === null || e === void 0 ? void 0 : e.type) === (elementTypes === null || elementTypes === void 0 ? void 0 : elementTypes.backgroundImage);
6709
- })) === null || _elements$find6 === void 0 ? void 0 : _elements$find6.opacity) || backgroundImageOpacity,
6792
+ })) === null || _elements$find7 === void 0 ? void 0 : _elements$find7.opacity) || backgroundImageOpacity,
6710
6793
  onDeleteSelectedElement: onDeleteSelectedElement,
6711
6794
  onCopySelectedElement: onCopySelectedElement,
6712
6795
  onToggleLockElement: onToggleLockElement,
@@ -6725,7 +6808,10 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
6725
6808
  onSetSelectedTab: onSelectedTab,
6726
6809
  saveButtonText: saveButtonText,
6727
6810
  languageLocale: languageLocale,
6728
- onRemoveBackgroundImage: onRemoveBackgroundImage
6811
+ onRemoveBackgroundImage: onRemoveBackgroundImage,
6812
+ showBackgroundImagePicker: showBackgroundImagePicker,
6813
+ showOpacityPicker: showOpacityPicker,
6814
+ changeSelectedElementProperty: changeSelectedElementProperty
6729
6815
  }), overallLoading && /*#__PURE__*/React.createElement(Overlay, null, /*#__PURE__*/React.createElement(LoadingSpinner, {
6730
6816
  size: "60px",
6731
6817
  color: theme.color.secondary