@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 +53 -3
- package/dist/cjs/index.js +140 -54
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js +140 -54
- package/dist/esm/index.js.map +1 -1
- package/package.json +1 -1
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.
|
|
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.
|
|
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$
|
|
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(
|
|
6069
|
-
|
|
6070
|
-
|
|
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
|
-
|
|
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 (!
|
|
6528
|
-
_context2.n =
|
|
6594
|
+
if (!uploadQRLogoImage) {
|
|
6595
|
+
_context2.n = 8;
|
|
6529
6596
|
break;
|
|
6530
6597
|
}
|
|
6598
|
+
_context2.p = 3;
|
|
6531
6599
|
setLoadingUploadImage(true);
|
|
6532
|
-
_context2.n =
|
|
6533
|
-
return
|
|
6534
|
-
case
|
|
6535
|
-
|
|
6536
|
-
|
|
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.
|
|
6619
|
+
return _context2.f(6);
|
|
6620
|
+
case 7:
|
|
6621
|
+
_context2.n = 9;
|
|
6539
6622
|
break;
|
|
6540
|
-
case
|
|
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
|
|
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$
|
|
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$
|
|
6663
|
-
cuttingGuideStrokeColor: (elements === null || elements === void 0 || (_elements$
|
|
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$
|
|
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$
|
|
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$
|
|
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
|