@arbisoft/react-design-tool 1.0.70 → 1.0.72

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/cjs/index.js CHANGED
@@ -350,7 +350,14 @@ var propTypes$z = {
350
350
  defaultText: PropTypes.string,
351
351
  onSave: PropTypes.func,
352
352
  saveButtonText: PropTypes.string,
353
- locale: PropTypes.oneOf(['en', 'ru', 'pl', 'de', 'es', 'fr', 'it'])
353
+ locale: PropTypes.oneOf(['en', 'ru', 'pl', 'de', 'es', 'fr', 'it']),
354
+ canvasSize: PropTypes.shape({
355
+ mode: PropTypes.oneOf(['preset', 'custom']),
356
+ preset: PropTypes.string,
357
+ widthMm: PropTypes.number,
358
+ heightMm: PropTypes.number
359
+ }),
360
+ onCanvasSizeChange: PropTypes.func
354
361
  };
355
362
 
356
363
  /**
@@ -615,6 +622,125 @@ var pageSizesDimensions = _defineProperty(_defineProperty(_defineProperty(_defin
615
622
  width: 460,
616
623
  height: 648
617
624
  });
625
+ var STANDARD_PAPER_SIZES_MM = {
626
+ A3: {
627
+ width: 297,
628
+ height: 420
629
+ },
630
+ A4: {
631
+ width: 210,
632
+ height: 297
633
+ },
634
+ A5: {
635
+ width: 148,
636
+ height: 210
637
+ },
638
+ Letter: {
639
+ width: 215.9,
640
+ height: 279.4
641
+ },
642
+ Legal: {
643
+ width: 215.9,
644
+ height: 355.6
645
+ },
646
+ Ledger: {
647
+ width: 431.8,
648
+ height: 279.4
649
+ },
650
+ B5: {
651
+ width: 176,
652
+ height: 250
653
+ },
654
+ C5: {
655
+ width: 162,
656
+ height: 229
657
+ }
658
+ };
659
+ var CANVAS_SIZE_MODES = {
660
+ preset: 'preset',
661
+ custom: 'custom'
662
+ };
663
+ var CUSTOM_CANVAS_PRESET_KEY = 'Custom';
664
+ var MM_TO_PX_RATIO = pageSizesDimensions[pageSizes.A4].width / STANDARD_PAPER_SIZES_MM.A4.width;
665
+ var MIN_CUSTOM_MM = 10;
666
+ var MAX_CUSTOM_MM = 2000;
667
+ var isValidPresetSize = function isValidPresetSize(size) {
668
+ return Boolean(size && pageSizesDimensions[size]);
669
+ };
670
+ var clampMm = function clampMm(value) {
671
+ var parsed = Number(value);
672
+ if (!Number.isFinite(parsed)) return null;
673
+ var clamped = Math.max(MIN_CUSTOM_MM, Math.min(MAX_CUSTOM_MM, parsed));
674
+ return Number(clamped.toFixed(2));
675
+ };
676
+ var mmToPx = function mmToPx(mm) {
677
+ var safeMm = clampMm(mm);
678
+ if (!safeMm) return null;
679
+ return Math.round(safeMm * MM_TO_PX_RATIO);
680
+ };
681
+ var getPresetMmDimensions = function getPresetMmDimensions(preset) {
682
+ return STANDARD_PAPER_SIZES_MM[preset] || null;
683
+ };
684
+ var getCanvasSizeLabel = function getCanvasSizeLabel(canvasSize) {
685
+ if (!canvasSize) return pageSizes.A4;
686
+ if (canvasSize.mode === CANVAS_SIZE_MODES.custom) {
687
+ return "".concat(canvasSize.widthMm, " x ").concat(canvasSize.heightMm, " mm");
688
+ }
689
+ return canvasSize.preset || pageSizes.A4;
690
+ };
691
+ var normalizeCanvasSize = function normalizeCanvasSize() {
692
+ var _pageSizesDimensions$, _pageSizesDimensions$2, _getPresetMmDimension, _getPresetMmDimension2;
693
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
694
+ var fallbackPreset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : pageSizes.A4;
695
+ var fallback = {
696
+ mode: CANVAS_SIZE_MODES.preset,
697
+ preset: fallbackPreset,
698
+ widthPx: ((_pageSizesDimensions$ = pageSizesDimensions[fallbackPreset]) === null || _pageSizesDimensions$ === void 0 ? void 0 : _pageSizesDimensions$.width) || pageSizesDimensions[pageSizes.A4].width,
699
+ heightPx: ((_pageSizesDimensions$2 = pageSizesDimensions[fallbackPreset]) === null || _pageSizesDimensions$2 === void 0 ? void 0 : _pageSizesDimensions$2.height) || pageSizesDimensions[pageSizes.A4].height,
700
+ widthMm: ((_getPresetMmDimension = getPresetMmDimensions(fallbackPreset)) === null || _getPresetMmDimension === void 0 ? void 0 : _getPresetMmDimension.width) || STANDARD_PAPER_SIZES_MM.A4.width,
701
+ heightMm: ((_getPresetMmDimension2 = getPresetMmDimensions(fallbackPreset)) === null || _getPresetMmDimension2 === void 0 ? void 0 : _getPresetMmDimension2.height) || STANDARD_PAPER_SIZES_MM.A4.height
702
+ };
703
+ if (!input) return fallback;
704
+ if (typeof input === 'string' && isValidPresetSize(input)) {
705
+ var mmDims = getPresetMmDimensions(input) || getPresetMmDimensions(fallbackPreset);
706
+ return {
707
+ mode: CANVAS_SIZE_MODES.preset,
708
+ preset: input,
709
+ widthPx: pageSizesDimensions[input].width,
710
+ heightPx: pageSizesDimensions[input].height,
711
+ widthMm: mmDims === null || mmDims === void 0 ? void 0 : mmDims.width,
712
+ heightMm: mmDims === null || mmDims === void 0 ? void 0 : mmDims.height
713
+ };
714
+ }
715
+ var mode = input.mode || (isValidPresetSize(input.size) ? CANVAS_SIZE_MODES.preset : null);
716
+ var preset = input.preset || input.size;
717
+ if (mode === CANVAS_SIZE_MODES.preset && isValidPresetSize(preset)) {
718
+ var _mmDims = getPresetMmDimensions(preset) || getPresetMmDimensions(fallbackPreset);
719
+ return {
720
+ mode: CANVAS_SIZE_MODES.preset,
721
+ preset: preset,
722
+ widthPx: pageSizesDimensions[preset].width,
723
+ heightPx: pageSizesDimensions[preset].height,
724
+ widthMm: _mmDims === null || _mmDims === void 0 ? void 0 : _mmDims.width,
725
+ heightMm: _mmDims === null || _mmDims === void 0 ? void 0 : _mmDims.height
726
+ };
727
+ }
728
+ var widthMm = clampMm(input.widthMm);
729
+ var heightMm = clampMm(input.heightMm);
730
+ var widthPx = mmToPx(widthMm);
731
+ var heightPx = mmToPx(heightMm);
732
+ if (mode === CANVAS_SIZE_MODES.custom && widthPx && heightPx) {
733
+ return {
734
+ mode: CANVAS_SIZE_MODES.custom,
735
+ preset: CUSTOM_CANVAS_PRESET_KEY,
736
+ widthMm: widthMm,
737
+ heightMm: heightMm,
738
+ widthPx: widthPx,
739
+ heightPx: heightPx
740
+ };
741
+ }
742
+ return fallback;
743
+ };
618
744
 
619
745
  var sideBarpillsList = {
620
746
  template: 'Template',
@@ -658,24 +784,6 @@ var textList = [{
658
784
  fontStyle: 'normal',
659
785
  textAlign: 'left',
660
786
  width: 220
661
- }, {
662
- text: 'LOCATION_BREADCRUMB',
663
- fontFamily: 'Open Sans',
664
- fontSize: 12,
665
- color: '#6D737B',
666
- fontWeight: theme.fontWeights[400],
667
- textDecoration: 'normal',
668
- fontStyle: 'normal',
669
- textAlign: 'left'
670
- }, {
671
- text: 'DOMAIN',
672
- fontFamily: 'Plus Jakarta Sans',
673
- fontSize: 10,
674
- color: '#333333',
675
- fontWeight: theme.fontWeights[400],
676
- textDecoration: 'normal',
677
- fontStyle: 'normal',
678
- textAlign: 'left'
679
787
  }];
680
788
  var elementTypes = {
681
789
  pageSize: 'pageSize',
@@ -812,7 +920,7 @@ var LOCATION_BREADCRUMB$8 = "property > building > room";
812
920
  var DOMAIN$8 = "www.domain.com";
813
921
  var SHOW_PROPERTY_LOCATION$8 = "Show Property Label";
814
922
  var LOCATION_HELPER$8 = "Enable this to show the property’s location label on the canvas, or disable it to hide it.";
815
- var SHOW_QR_ID$8 = "Show QR Id";
923
+ var SHOW_QR_ID$8 = "Show QR ID";
816
924
  var QR_ID_HELPER$8 = "Enable this to display the unique QR Code ID on the canvas, or disable it to remove it.";
817
925
  var MONOCHROME_COLOR$8 = "Tint Color";
818
926
  var MONOCHROME_STRENGTH$8 = "Tint Strength";
@@ -2266,6 +2374,7 @@ var propTypes$w = {
2266
2374
  onChangeTextProperty: PropTypes.func,
2267
2375
  onSetPageSize: PropTypes.func,
2268
2376
  selectedPageSize: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
2377
+ selectedPageSizeLabel: PropTypes.string,
2269
2378
  loadingImages: PropTypes.bool,
2270
2379
  loadingFonts: PropTypes.bool,
2271
2380
  uploadImageCallBack: PropTypes.func,
@@ -2277,7 +2386,7 @@ var propTypes$w = {
2277
2386
  outsideBoundaryPreviewPadding: PropTypes.number
2278
2387
  };
2279
2388
 
2280
- var _templateObject$r, _templateObject2$l, _templateObject3$b, _templateObject4$7, _templateObject5$4;
2389
+ var _templateObject$r, _templateObject2$l, _templateObject3$b, _templateObject4$8, _templateObject5$5;
2281
2390
  var Container$4 = styled.div(_templateObject$r || (_templateObject$r = _taggedTemplateLiteral(["\n flex: 1;\n display: flex;\n background-color: ", ";\n background-image: ", ";\n position: relative;\n flex-direction: column;\n overflow: hidden;\n"])), theme.color.white_F7F7F7, function (_ref) {
2282
2391
  var selectedTab = _ref.selectedTab;
2283
2392
  return selectedTab ? 'none' : "url(".concat(EditorBg, ")");
@@ -2296,8 +2405,8 @@ var InnerContainerWrapper = styled.div(_templateObject3$b || (_templateObject3$b
2296
2405
  var editorWidth = _ref5.editorWidth;
2297
2406
  return editorWidth || 400;
2298
2407
  });
2299
- var Title = styled.p(_templateObject4$7 || (_templateObject4$7 = _taggedTemplateLiteral(["\n border: 1px solid ", ";\n align-self: flex-start;\n font-size: 14px;\n font-family: ", ";\n font-weight: ", ";\n color: ", ";\n padding: 0 6px;\n border-bottom-width: 0;\n"])), theme.color.gray_E8E8E8, theme.fonts.primary, theme.fontWeights[300], theme.color.gray_7A7979);
2300
- var EditorBox = styled.div(_templateObject5$4 || (_templateObject5$4 = _taggedTemplateLiteral(["\n height: ", "px;\n width: ", "px;\n min-height: ", "px;\n min-width: ", "px;\n background: ", ";\n box-shadow: 1.317px 1.317px 1.317px 0px rgba(0, 0, 0, 0.08);\n // transition: all 0.1s ease-in-out;\n overflow: hidden;\n"])), function (_ref6) {
2408
+ var Title = styled.p(_templateObject4$8 || (_templateObject4$8 = _taggedTemplateLiteral(["\n border: 1px solid ", ";\n align-self: flex-start;\n font-size: 14px;\n font-family: ", ";\n font-weight: ", ";\n color: ", ";\n padding: 0 6px;\n border-bottom-width: 0;\n"])), theme.color.gray_E8E8E8, theme.fonts.primary, theme.fontWeights[300], theme.color.gray_7A7979);
2409
+ var EditorBox = styled.div(_templateObject5$5 || (_templateObject5$5 = _taggedTemplateLiteral(["\n height: ", "px;\n width: ", "px;\n min-height: ", "px;\n min-width: ", "px;\n background: ", ";\n box-shadow: 1.317px 1.317px 1.317px 0px rgba(0, 0, 0, 0.08);\n // transition: all 0.1s ease-in-out;\n overflow: hidden;\n"])), function (_ref6) {
2301
2410
  var editorHeight = _ref6.editorHeight;
2302
2411
  return editorHeight || 470;
2303
2412
  }, function (_ref7) {
@@ -2349,6 +2458,7 @@ var propTypes$v = {
2349
2458
  onChangeTextProperty: PropTypes.func,
2350
2459
  onSetPageSize: PropTypes.func,
2351
2460
  selectedPageSize: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
2461
+ selectedPageSizeLabel: PropTypes.string,
2352
2462
  translation: PropTypes.object,
2353
2463
  uploadImageCallBack: PropTypes.func,
2354
2464
  setLoadingUploadImage: PropTypes.func,
@@ -2375,6 +2485,7 @@ var propTypes$u = {
2375
2485
  onChangeBackgroundImageOpacity: PropTypes.func,
2376
2486
  onSetPageSize: PropTypes.func,
2377
2487
  selectedPageSize: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
2488
+ selectedPageSizeLabel: PropTypes.string,
2378
2489
  languageLocale: PropTypes.string,
2379
2490
  uploadImageCallBack: PropTypes.func,
2380
2491
  setLoadingUploadImage: PropTypes.func,
@@ -2448,7 +2559,7 @@ var StyledContainer$6 = styled.div(_templateObject$p || (_templateObject$p = _ta
2448
2559
  return disabled ? 'none' : 'all';
2449
2560
  });
2450
2561
 
2451
- var _templateObject$o, _templateObject2$j, _templateObject3$a, _templateObject4$6, _templateObject5$3, _templateObject6$1, _templateObject7$1;
2562
+ var _templateObject$o, _templateObject2$j, _templateObject3$a, _templateObject4$7, _templateObject5$4, _templateObject6$2, _templateObject7$2;
2452
2563
  var Wrapper = styled.span(_templateObject$o || (_templateObject$o = _taggedTemplateLiteral(["\n position: relative;\n display: inline-flex;\n cursor: ", ";\n"])), function (_ref) {
2453
2564
  var disabled = _ref.disabled;
2454
2565
  return disabled ? 'not-allowed' : 'pointer';
@@ -2456,16 +2567,16 @@ var Wrapper = styled.span(_templateObject$o || (_templateObject$o = _taggedTempl
2456
2567
  var Floating = styled.div(_templateObject2$j || (_templateObject2$j = _taggedTemplateLiteral(["\n background-color: rgba(0, 0, 0, 0.75);\n color: #fff;\n border-radius: 6px;\n /* wrapping */\n white-space: normal;\n word-break: break-word;\n overflow-wrap: anywhere;\n /* defaults (can be overridden via inline style in component) */\n font-family: ", ";\n font-weight: ", ";\n pointer-events: none;\n box-shadow: 0 4px 14px rgba(0, 0, 0, 0.2);\n"])), theme.fonts.primary, theme.fontWeights[400]);
2457
2568
  styled.div(_templateObject3$a || (_templateObject3$a = _taggedTemplateLiteral(["\n visibility: hidden;\n background-color: rgba(0, 0, 0, 0.7);\n color: white;\n text-align: center;\n padding: 4px 10px;\n border-radius: 4px;\n position: absolute;\n z-index: 9999;\n white-space: nowrap;\n opacity: 0;\n transition: all 0.1s;\n font-size: 13px;\n font-family: ", ";\n font-weight: ", ";\n\n ", "\n ", "\n ", "\n ", "\n\n ", ":hover & {\n visibility: visible;\n opacity: 1;\n }\n"])), theme.fonts.primary, theme.fontWeights[400], function (_ref2) {
2458
2569
  var position = _ref2.position;
2459
- return position === 'top' && styled.css(_templateObject4$6 || (_templateObject4$6 = _taggedTemplateLiteral(["\n bottom: 110%;\n left: 50%;\n transform: translateX(-50%);\n "])));
2570
+ return position === 'top' && styled.css(_templateObject4$7 || (_templateObject4$7 = _taggedTemplateLiteral(["\n bottom: 110%;\n left: 50%;\n transform: translateX(-50%);\n "])));
2460
2571
  }, function (_ref3) {
2461
2572
  var position = _ref3.position;
2462
- return position === 'right' && styled.css(_templateObject5$3 || (_templateObject5$3 = _taggedTemplateLiteral(["\n top: 50%;\n left: 105%;\n transform: translateY(-50%);\n "])));
2573
+ return position === 'right' && styled.css(_templateObject5$4 || (_templateObject5$4 = _taggedTemplateLiteral(["\n top: 50%;\n left: 105%;\n transform: translateY(-50%);\n "])));
2463
2574
  }, function (_ref4) {
2464
2575
  var position = _ref4.position;
2465
- return position === 'bottom' && styled.css(_templateObject6$1 || (_templateObject6$1 = _taggedTemplateLiteral(["\n top: 110%;\n left: 50%;\n transform: translateX(-50%);\n "])));
2576
+ return position === 'bottom' && styled.css(_templateObject6$2 || (_templateObject6$2 = _taggedTemplateLiteral(["\n top: 110%;\n left: 50%;\n transform: translateX(-50%);\n "])));
2466
2577
  }, function (_ref5) {
2467
2578
  var position = _ref5.position;
2468
- return position === 'left' && styled.css(_templateObject7$1 || (_templateObject7$1 = _taggedTemplateLiteral(["\n top: 50%;\n right: 105%;\n transform: translateY(-50%);\n "])));
2579
+ return position === 'left' && styled.css(_templateObject7$2 || (_templateObject7$2 = _taggedTemplateLiteral(["\n top: 50%;\n right: 105%;\n transform: translateY(-50%);\n "])));
2469
2580
  }, Wrapper);
2470
2581
 
2471
2582
  var Tooltip = function Tooltip(_ref) {
@@ -2625,13 +2736,13 @@ var propTypes$s = {
2625
2736
  tooltip: PropTypes.string
2626
2737
  };
2627
2738
 
2628
- var _templateObject$n, _templateObject2$i, _templateObject3$9, _templateObject4$5;
2739
+ var _templateObject$n, _templateObject2$i, _templateObject3$9, _templateObject4$6;
2629
2740
  var DropDownItem = styled.div(_templateObject$n || (_templateObject$n = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n justify-content: center;\n"])));
2630
2741
  var IconWrapper$3 = styled.img(_templateObject2$i || (_templateObject2$i = _taggedTemplateLiteral(["\n object-fit: contain;\n"])));
2631
2742
  var DropDownList = styled.div(_templateObject3$9 || (_templateObject3$9 = _taggedTemplateLiteral(["\n position: absolute;\n left: 0;\n top: 50;\n background-color: white;\n box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);\n border-radius: 4px;\n margin-top: 5px;\n z-index: 10;\n width: 100%;\n max-height: 200px;\n overflow-y: auto;\n z-index: 9999;\n"])));
2632
2743
 
2633
2744
  // Individual option in the dropdown
2634
- var DropDownOption = styled.div(_templateObject4$5 || (_templateObject4$5 = _taggedTemplateLiteral(["\n padding: 8px 16px;\n cursor: pointer;\n font-size: 14px;\n color: #333333;\n &:hover {\n background-color: #f0f0f0;\n }\n &:active {\n background-color: #e0e0e0;\n }\n"])));
2745
+ var DropDownOption = styled.div(_templateObject4$6 || (_templateObject4$6 = _taggedTemplateLiteral(["\n padding: 8px 16px;\n cursor: pointer;\n font-size: 14px;\n color: #333333;\n &:hover {\n background-color: #f0f0f0;\n }\n &:active {\n background-color: #e0e0e0;\n }\n"])));
2635
2746
 
2636
2747
  var DropDown = function DropDown(_ref) {
2637
2748
  var left = _ref.left,
@@ -2699,10 +2810,18 @@ var DropDown = function DropDown(_ref) {
2699
2810
  };
2700
2811
  DropDown.propTypes = propTypes$s;
2701
2812
 
2702
- var _templateObject$m, _templateObject2$h, _templateObject3$8;
2703
- var Label$1 = styled.p(_templateObject$m || (_templateObject$m = _taggedTemplateLiteral(["\n color: ", ";\n font-size: 14px;\n font-weight: ", ";\n font-family: ", ";\n"])), theme.color.gray_700, theme.fontWeights[400], theme.fonts.primary);
2704
- var RowContainer$4 = styled.div(_templateObject2$h || (_templateObject2$h = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: row;\n align-items: center;\n flex-wrap: wrap;\n gap: 2px;\n"])));
2705
- var RemoveButton = styled.div(_templateObject3$8 || (_templateObject3$8 = _taggedTemplateLiteral(["\n height: 20px;\n width: 20px;\n border-radius: 20px;\n position: absolute;\n right: -7px;\n top: -7px;\n background: #ff4d4d;\n display: flex;\n align-items: center;\n justify-content: center;\n"])));
2813
+ var _templateObject$m, _templateObject2$h, _templateObject3$8, _templateObject4$5, _templateObject5$3, _templateObject6$1, _templateObject7$1, _templateObject8, _templateObject9, _templateObject0, _templateObject1;
2814
+ var Label$1 = styled.p(_templateObject$m || (_templateObject$m = _taggedTemplateLiteral(["\n color: ", ";\n font-size: 14px;\n font-weight: ", ";\n font-family: ", ";\n"])), theme.color.gray_700, theme.fontWeights[400], theme.fonts.primary);
2815
+ var RowContainer$4 = styled.div(_templateObject2$h || (_templateObject2$h = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n flex-wrap: wrap;\n gap: 2px;\n"])));
2816
+ var RemoveButton = styled.div(_templateObject3$8 || (_templateObject3$8 = _taggedTemplateLiteral(["\n height: 20px;\n width: 20px;\n border-radius: 20px;\n position: absolute;\n right: -7px;\n top: -7px;\n background: #ff4d4d;\n display: flex;\n align-items: center;\n justify-content: center;\n"])));
2817
+ var CustomSizeRow = styled.div(_templateObject4$5 || (_templateObject4$5 = _taggedTemplateLiteral(["\n display: flex;\n align-items: flex-end;\n gap: 10px;\n margin-left: 8px;\n margin-right: 12px;\n"])));
2818
+ var CustomSizeField = styled.div(_templateObject5$3 || (_templateObject5$3 = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n gap: 3px;\n"])));
2819
+ var CustomSizeFieldLabel = styled.span(_templateObject6$1 || (_templateObject6$1 = _taggedTemplateLiteral(["\n color: ", ";\n font-size: 9px;\n line-height: 11px;\n font-weight: ", ";\n font-family: ", ";\n"])), theme.color.gray_545454, theme.fontWeights[500], theme.fonts.primary);
2820
+ var CustomSizeInputWrap = styled.div(_templateObject7$1 || (_templateObject7$1 = _taggedTemplateLiteral(["\n position: relative;\n width: 108px;\n height: 40px;\n border: 1px solid ", ";\n border-radius: 8px;\n background-color: ", ";\n box-sizing: border-box;\n transition: border-color 0.15s ease;\n\n &:focus-within {\n border-color: ", ";\n }\n"])), theme.color.gray_200, theme.color.white, theme.color.primary);
2821
+ var CustomSizeInput = styled.input(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["\n width: 100%;\n height: 100%;\n border: none;\n border-radius: 8px;\n padding: 6px 32px 6px 10px;\n box-sizing: border-box;\n background: transparent;\n color: ", ";\n font-size: 14px;\n line-height: 20px;\n font-family: ", ";\n color-scheme: light;\n appearance: textfield;\n\n &:focus {\n outline: none;\n }\n\n &::-webkit-outer-spin-button,\n &::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n }\n"])), theme.color.gray_700, theme.fonts.primary);
2822
+ var CustomSizeUnit = styled.span(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["\n position: absolute;\n top: 50%;\n right: 10px;\n transform: translateY(-50%);\n color: ", ";\n font-size: 12px;\n line-height: 16px;\n font-family: ", ";\n pointer-events: none;\n"])), theme.color.gray_545454, theme.fonts.primary);
2823
+ var CustomSizeSeparator = styled.span(_templateObject0 || (_templateObject0 = _taggedTemplateLiteral(["\n color: ", ";\n font-size: 20px;\n line-height: 20px;\n font-weight: ", ";\n padding-bottom: 8px;\n font-family: ", ";\n"])), theme.color.gray_700, theme.fontWeights[400], theme.fonts.primary);
2824
+ var CustomSizeError = styled.span(_templateObject1 || (_templateObject1 = _taggedTemplateLiteral(["\n color: #d32f2f;\n font-size: 11px;\n margin-left: 4px;\n"])));
2706
2825
 
2707
2826
  var propTypes$r = {
2708
2827
  backgroundColor: PropTypes.string,
@@ -3351,6 +3470,7 @@ var TemplateToolBar = function TemplateToolBar(_ref) {
3351
3470
  onChangeBackgroundImageOpacity = _ref.onChangeBackgroundImageOpacity,
3352
3471
  onSetPageSize = _ref.onSetPageSize,
3353
3472
  selectedPageSize = _ref.selectedPageSize,
3473
+ selectedPageSizeLabel = _ref.selectedPageSizeLabel,
3354
3474
  languageLocale = _ref.languageLocale,
3355
3475
  uploadImageCallBack = _ref.uploadImageCallBack,
3356
3476
  setLoadingUploadImage = _ref.setLoadingUploadImage,
@@ -3363,6 +3483,62 @@ var TemplateToolBar = function TemplateToolBar(_ref) {
3363
3483
  showBackgroundImagePicker = _ref$showBackgroundIm === void 0 ? true : _ref$showBackgroundIm,
3364
3484
  _ref$showOpacityPicke = _ref.showOpacityPicker,
3365
3485
  showOpacityPicker = _ref$showOpacityPicke === void 0 ? true : _ref$showOpacityPicke;
3486
+ var DEFAULT_CUSTOM_MM = 100;
3487
+ var _useState = React.useState(DEFAULT_CUSTOM_MM),
3488
+ _useState2 = _slicedToArray(_useState, 2),
3489
+ customWidthMm = _useState2[0],
3490
+ setCustomWidthMm = _useState2[1];
3491
+ var _useState3 = React.useState(DEFAULT_CUSTOM_MM),
3492
+ _useState4 = _slicedToArray(_useState3, 2),
3493
+ customHeightMm = _useState4[0],
3494
+ setCustomHeightMm = _useState4[1];
3495
+ var _useState5 = React.useState(false),
3496
+ _useState6 = _slicedToArray(_useState5, 2),
3497
+ showCustomSizeInputs = _useState6[0],
3498
+ setShowCustomSizeInputs = _useState6[1];
3499
+ var _useState7 = React.useState(''),
3500
+ _useState8 = _slicedToArray(_useState7, 2),
3501
+ customSizeError = _useState8[0],
3502
+ setCustomSizeError = _useState8[1];
3503
+ var selectedLabel = selectedPageSizeLabel || (selectedPageSize === null || selectedPageSize === void 0 ? void 0 : selectedPageSize.preset) || selectedPageSize;
3504
+ var sizeOptions = React.useMemo(function () {
3505
+ return [].concat(_toConsumableArray(Object.keys(pageSizes)), [CUSTOM_CANVAS_PRESET_KEY]);
3506
+ }, []);
3507
+ React.useEffect(function () {
3508
+ var isCustom = (selectedPageSize === null || selectedPageSize === void 0 ? void 0 : selectedPageSize.mode) === CANVAS_SIZE_MODES.custom;
3509
+ setShowCustomSizeInputs(Boolean(isCustom));
3510
+ if (isCustom) {
3511
+ setCustomWidthMm((selectedPageSize === null || selectedPageSize === void 0 ? void 0 : selectedPageSize.widthMm) || DEFAULT_CUSTOM_MM);
3512
+ setCustomHeightMm((selectedPageSize === null || selectedPageSize === void 0 ? void 0 : selectedPageSize.heightMm) || DEFAULT_CUSTOM_MM);
3513
+ }
3514
+ }, [selectedPageSize]);
3515
+ var applyCustomSize = function applyCustomSize() {
3516
+ var widthValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : customWidthMm;
3517
+ var heightValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : customHeightMm;
3518
+ var showError = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
3519
+ var widthMm = Number(widthValue);
3520
+ var heightMm = Number(heightValue);
3521
+ var isValidRange = widthMm >= 10 && widthMm <= 2000 && heightMm >= 10 && heightMm <= 2000;
3522
+ if (!Number.isFinite(widthMm) || !Number.isFinite(heightMm) || !isValidRange) {
3523
+ if (showError) setCustomSizeError('10-2000 mm');
3524
+ return;
3525
+ }
3526
+ setCustomSizeError('');
3527
+ onSetPageSize === null || onSetPageSize === void 0 || onSetPageSize({
3528
+ mode: CANVAS_SIZE_MODES.custom,
3529
+ widthMm: widthMm,
3530
+ heightMm: heightMm
3531
+ });
3532
+ };
3533
+ var handleCustomInputKeyDown = function handleCustomInputKeyDown(e) {
3534
+ if (e.key !== 'Enter') return;
3535
+ e.preventDefault();
3536
+ applyCustomSize(customWidthMm, customHeightMm, true);
3537
+ };
3538
+ var handleCustomRowBlur = function handleCustomRowBlur(e) {
3539
+ if (e.currentTarget.contains(e.relatedTarget)) return;
3540
+ applyCustomSize(customWidthMm, customHeightMm, true);
3541
+ };
3366
3542
  var selectBackgroundColor = function selectBackgroundColor(e) {
3367
3543
  onSetBackgroundColor(e);
3368
3544
  };
@@ -3412,13 +3588,43 @@ var TemplateToolBar = function TemplateToolBar(_ref) {
3412
3588
  }();
3413
3589
  return /*#__PURE__*/React.createElement(RowContainer$4, null, /*#__PURE__*/React.createElement(DropDown, {
3414
3590
  gap: 20,
3415
- left: /*#__PURE__*/React.createElement(Label$1, null, selectedPageSize),
3416
- list: Object.keys(pageSizes),
3591
+ left: /*#__PURE__*/React.createElement(Label$1, null, selectedLabel),
3592
+ list: sizeOptions,
3417
3593
  onSelect: function onSelect(e) {
3594
+ if (e === CUSTOM_CANVAS_PRESET_KEY) {
3595
+ setShowCustomSizeInputs(true);
3596
+ return;
3597
+ }
3598
+ setCustomSizeError('');
3599
+ setShowCustomSizeInputs(false);
3418
3600
  onSetPageSize && onSetPageSize(e);
3419
3601
  },
3420
3602
  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.PAGE_SIZE
3421
- }), /*#__PURE__*/React.createElement(ToolBarButtonWrapper, {
3603
+ }), showCustomSizeInputs ? /*#__PURE__*/React.createElement(CustomSizeRow, {
3604
+ onBlur: handleCustomRowBlur
3605
+ }, /*#__PURE__*/React.createElement(CustomSizeField, null, /*#__PURE__*/React.createElement(CustomSizeFieldLabel, null, "Width"), /*#__PURE__*/React.createElement(CustomSizeInputWrap, null, /*#__PURE__*/React.createElement(CustomSizeInput, {
3606
+ value: customWidthMm,
3607
+ onChange: function onChange(e) {
3608
+ var nextWidth = e.target.value;
3609
+ setCustomWidthMm(nextWidth);
3610
+ applyCustomSize(nextWidth, customHeightMm, false);
3611
+ },
3612
+ onKeyDown: handleCustomInputKeyDown,
3613
+ type: "number",
3614
+ min: 10,
3615
+ max: 2000
3616
+ }), /*#__PURE__*/React.createElement(CustomSizeUnit, null, "mm"))), /*#__PURE__*/React.createElement(CustomSizeSeparator, null, "x"), /*#__PURE__*/React.createElement(CustomSizeField, null, /*#__PURE__*/React.createElement(CustomSizeFieldLabel, null, "Height"), /*#__PURE__*/React.createElement(CustomSizeInputWrap, null, /*#__PURE__*/React.createElement(CustomSizeInput, {
3617
+ value: customHeightMm,
3618
+ onChange: function onChange(e) {
3619
+ var nextHeight = e.target.value;
3620
+ setCustomHeightMm(nextHeight);
3621
+ applyCustomSize(customWidthMm, nextHeight, false);
3622
+ },
3623
+ onKeyDown: handleCustomInputKeyDown,
3624
+ type: "number",
3625
+ min: 10,
3626
+ max: 2000
3627
+ }), /*#__PURE__*/React.createElement(CustomSizeUnit, null, "mm"))), customSizeError ? /*#__PURE__*/React.createElement(CustomSizeError, null, customSizeError) : null) : null, /*#__PURE__*/React.createElement(ToolBarButtonWrapper, {
3422
3628
  gap: 11,
3423
3629
  tooltip: TEXT_DICTIONARY === null || TEXT_DICTIONARY === void 0 || (_TEXT_DICTIONARY$lang2 = TEXT_DICTIONARY[languageLocale]) === null || _TEXT_DICTIONARY$lang2 === void 0 ? void 0 : _TEXT_DICTIONARY$lang2.BACKGROUND_COLOR,
3424
3630
  tooltipPosition: 'bottom'
@@ -3995,6 +4201,7 @@ var TopToolBar = function TopToolBar(_ref) {
3995
4201
  onChangeTextProperty = _ref.onChangeTextProperty,
3996
4202
  onSetPageSize = _ref.onSetPageSize,
3997
4203
  selectedPageSize = _ref.selectedPageSize,
4204
+ selectedPageSizeLabel = _ref.selectedPageSizeLabel,
3998
4205
  languageLocale = _ref.languageLocale,
3999
4206
  uploadImageCallBack = _ref.uploadImageCallBack,
4000
4207
  setLoadingUploadImage = _ref.setLoadingUploadImage,
@@ -4020,6 +4227,7 @@ var TopToolBar = function TopToolBar(_ref) {
4020
4227
  backgroundImageOpacity: backgroundImageOpacity,
4021
4228
  onSetPageSize: onSetPageSize,
4022
4229
  selectedPageSize: selectedPageSize,
4230
+ selectedPageSizeLabel: selectedPageSizeLabel,
4023
4231
  languageLocale: languageLocale,
4024
4232
  uploadImageCallBack: uploadImageCallBack,
4025
4233
  setLoadingUploadImage: setLoadingUploadImage,
@@ -5366,6 +5574,7 @@ var Editor = function Editor(_ref) {
5366
5574
  onChangeTextProperty = _ref.onChangeTextProperty,
5367
5575
  onSetPageSize = _ref.onSetPageSize,
5368
5576
  selectedPageSize = _ref.selectedPageSize,
5577
+ selectedPageSizeLabel = _ref.selectedPageSizeLabel,
5369
5578
  loadingImages = _ref.loadingImages,
5370
5579
  loadingFonts = _ref.loadingFonts,
5371
5580
  uploadImageCallBack = _ref.uploadImageCallBack,
@@ -5384,7 +5593,7 @@ var Editor = function Editor(_ref) {
5384
5593
  _ref$showOutsideBound = _ref.showOutsideBoundaryPreview,
5385
5594
  showOutsideBoundaryPreview = _ref$showOutsideBound === void 0 ? false : _ref$showOutsideBound,
5386
5595
  _ref$outsideBoundaryP = _ref.outsideBoundaryPreviewPadding,
5387
- outsideBoundaryPreviewPadding = _ref$outsideBoundaryP === void 0 ? 120 : _ref$outsideBoundaryP;
5596
+ outsideBoundaryPreviewPadding = _ref$outsideBoundaryP === void 0 ? 80 : _ref$outsideBoundaryP;
5388
5597
  var transformerRef = React.useRef(null);
5389
5598
  var previewPadding = React.useMemo(function () {
5390
5599
  return showOutsideBoundaryPreview ? Math.max(0, Number(outsideBoundaryPreviewPadding) || 0) : 0;
@@ -5721,6 +5930,7 @@ var Editor = function Editor(_ref) {
5721
5930
  onChangeTextProperty: onChangeTextProperty,
5722
5931
  onSetPageSize: onSetPageSize,
5723
5932
  selectedPageSize: selectedPageSize,
5933
+ selectedPageSizeLabel: selectedPageSizeLabel,
5724
5934
  languageLocale: languageLocale,
5725
5935
  uploadImageCallBack: uploadImageCallBack,
5726
5936
  setLoadingUploadImage: setLoadingUploadImage,
@@ -6712,13 +6922,15 @@ var isPropValid = /* #__PURE__ */memoize(function (prop) {
6712
6922
  * @property {Array} [allowedFormats] - Allowed formats for image uploading functions
6713
6923
  * @property {boolean} showQrIdToggle (boolean, default false) → controls visibility of the QR ID toggle
6714
6924
  * @property {string | number} qrId (string | number | null, default null) → the value to render when toggled on
6925
+ * @property {{ mode: 'preset' | 'custom', preset?: string, widthMm?: number, heightMm?: number }} [canvasSize]
6926
+ * @property {Function} [onCanvasSizeChange]
6715
6927
  */
6716
6928
 
6717
6929
  /**
6718
6930
  * @type {React.ForwardRefExoticComponent<StudioProps & React.RefAttributes<HTMLDivElement>>}
6719
6931
  */
6720
6932
  var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
6721
- var _elements$elements$fi, _elements$find5, _elements$find6, _elements$find7;
6933
+ var _elements$elements$fi, _elements$find, _elements$find2, _elements$find3;
6722
6934
  var _ref$title = _ref.title,
6723
6935
  title = _ref$title === void 0 ? '' : _ref$title,
6724
6936
  _ref$defaultQrLogo = _ref.defaultQrLogo,
@@ -6739,7 +6951,7 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
6739
6951
  _ref$showOutsideBound = _ref.showOutsideBoundaryPreview,
6740
6952
  showOutsideBoundaryPreview = _ref$showOutsideBound === void 0 ? false : _ref$showOutsideBound,
6741
6953
  _ref$outsideBoundaryP = _ref.outsideBoundaryPreviewPadding,
6742
- outsideBoundaryPreviewPadding = _ref$outsideBoundaryP === void 0 ? 120 : _ref$outsideBoundaryP,
6954
+ outsideBoundaryPreviewPadding = _ref$outsideBoundaryP === void 0 ? 80 : _ref$outsideBoundaryP,
6743
6955
  onDeleteCustomTemplate = _ref.onDeleteCustomTemplate,
6744
6956
  _ref$qrLink = _ref.qrLink,
6745
6957
  qrLink = _ref$qrLink === void 0 ? 'www.google.com' : _ref$qrLink,
@@ -6762,7 +6974,9 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
6762
6974
  _ref$showQrIdToggle = _ref.showQrIdToggle,
6763
6975
  showQrIdToggle = _ref$showQrIdToggle === void 0 ? false : _ref$showQrIdToggle,
6764
6976
  _ref$qrId = _ref.qrId,
6765
- qrId = _ref$qrId === void 0 ? null : _ref$qrId;
6977
+ qrId = _ref$qrId === void 0 ? null : _ref$qrId,
6978
+ canvasSize = _ref.canvasSize,
6979
+ onCanvasSizeChange = _ref.onCanvasSizeChange;
6766
6980
  var stageRef = React.useRef(null);
6767
6981
  var elementCacheRef = React.useRef({});
6768
6982
  var qrIdActiveRef = React.useRef(false);
@@ -6888,14 +7102,31 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
6888
7102
  currentQrId = _useState58[0],
6889
7103
  setCurrentQrId = _useState58[1];
6890
7104
  var overallLoading = loadingFonts || loadingImages || loadingUploadImage || loading;
6891
- var getPageDims = React.useCallback(function () {
6892
- var _base$find;
7105
+ var getPageSizeElement = React.useCallback(function () {
6893
7106
  var base = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : elements;
6894
- var sizeKey = (base === null || base === void 0 || (_base$find = base.find(function (e) {
7107
+ return base === null || base === void 0 ? void 0 : base.find(function (e) {
6895
7108
  return (e === null || e === void 0 ? void 0 : e.type) === (elementTypes === null || elementTypes === void 0 ? void 0 : elementTypes.pageSize);
6896
- })) === null || _base$find === void 0 ? void 0 : _base$find.size) || pageSizes.A4;
6897
- return pageSizesDimensions[sizeKey] || pageSizesDimensions[pageSizes.A4];
7109
+ });
6898
7110
  }, [elements]);
7111
+ var getNormalizedCanvasSize = React.useCallback(function () {
7112
+ var base = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : elements;
7113
+ var canvasSizeInput = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : canvasSize;
7114
+ if (canvasSizeInput) {
7115
+ return normalizeCanvasSize(canvasSizeInput, pageSizes.A4);
7116
+ }
7117
+ var pageSizeElem = base === null || base === void 0 ? void 0 : base.find(function (e) {
7118
+ return (e === null || e === void 0 ? void 0 : e.type) === (elementTypes === null || elementTypes === void 0 ? void 0 : elementTypes.pageSize);
7119
+ });
7120
+ return normalizeCanvasSize(pageSizeElem, pageSizes.A4);
7121
+ }, [elements, canvasSize]);
7122
+ var getPageDims = React.useCallback(function () {
7123
+ var base = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : elements;
7124
+ var normalized = getNormalizedCanvasSize(base);
7125
+ return {
7126
+ width: normalized.widthPx,
7127
+ height: normalized.heightPx
7128
+ };
7129
+ }, [elements, getNormalizedCanvasSize]);
6899
7130
  var findById = React.useCallback(function (id) {
6900
7131
  var base = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : elements;
6901
7132
  return base.find(function (e) {
@@ -7111,9 +7342,47 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
7111
7342
  });
7112
7343
  }, []);
7113
7344
  React.useEffect(function () {
7114
- LoadImages(elementsList);
7115
- setElements(elementsList);
7116
- var foundLoc = elementsList === null || elementsList === void 0 ? void 0 : elementsList.find(function (e) {
7345
+ var incomingPageSizeElem = elementsList === null || elementsList === void 0 ? void 0 : elementsList.find(function (e) {
7346
+ return (e === null || e === void 0 ? void 0 : e.type) === (elementTypes === null || elementTypes === void 0 ? void 0 : elementTypes.pageSize);
7347
+ });
7348
+ var nextCanvasSize = canvasSize ? normalizeCanvasSize(canvasSize, pageSizes.A4) : normalizeCanvasSize(incomingPageSizeElem, pageSizes.A4);
7349
+ var nextElements = elementsList.map(function (elem) {
7350
+ if (elem.type !== elementTypes.pageSize) return elem;
7351
+ var nextPageSize = _objectSpread2({}, elem);
7352
+ if (nextCanvasSize.mode === CANVAS_SIZE_MODES.custom) {
7353
+ delete nextPageSize.size;
7354
+ nextPageSize.mode = CANVAS_SIZE_MODES.custom;
7355
+ nextPageSize.widthMm = nextCanvasSize.widthMm;
7356
+ nextPageSize.heightMm = nextCanvasSize.heightMm;
7357
+ } else {
7358
+ delete nextPageSize.mode;
7359
+ delete nextPageSize.widthMm;
7360
+ delete nextPageSize.heightMm;
7361
+ nextPageSize.size = nextCanvasSize.preset;
7362
+ }
7363
+ return nextPageSize;
7364
+ });
7365
+ if (!nextElements.some(function (elem) {
7366
+ return elem.type === elementTypes.pageSize;
7367
+ })) {
7368
+ var injectedPageSize = {
7369
+ type: elementTypes.pageSize,
7370
+ id: "element".concat(Date.now()),
7371
+ size: nextCanvasSize.preset || pageSizes.A4,
7372
+ cuttingGuideStroke: 0,
7373
+ cuttingGuideStrokeColor: theme.color.black
7374
+ };
7375
+ if (nextCanvasSize.mode === CANVAS_SIZE_MODES.custom) {
7376
+ delete injectedPageSize.size;
7377
+ injectedPageSize.mode = CANVAS_SIZE_MODES.custom;
7378
+ injectedPageSize.widthMm = nextCanvasSize.widthMm;
7379
+ injectedPageSize.heightMm = nextCanvasSize.heightMm;
7380
+ }
7381
+ nextElements.unshift(injectedPageSize);
7382
+ }
7383
+ LoadImages(nextElements);
7384
+ setElements(nextElements);
7385
+ var foundLoc = nextElements === null || nextElements === void 0 ? void 0 : nextElements.find(function (e) {
7117
7386
  return e.id === LOCATION_ELEMENT_ID && e.type === elementTypes.text;
7118
7387
  });
7119
7388
  if (foundLoc) {
@@ -7122,7 +7391,7 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
7122
7391
  rest = _extends({}, (_objectDestructuringEmpty(_ref4), _ref4));
7123
7392
  elementCacheRef.current[LOCATION_ELEMENT_ID] = _objectSpread2({}, rest);
7124
7393
  }
7125
- }, _toConsumableArray(elementsList));
7394
+ }, [canvasSize].concat(_toConsumableArray(elementsList)));
7126
7395
  var LoadImages = function LoadImages(elems) {
7127
7396
  setLoadingImages(true);
7128
7397
  preloadRelevantImages(elems).then(function (_ref5) {
@@ -7138,17 +7407,15 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
7138
7407
  });
7139
7408
  };
7140
7409
  var editorHeight = React.useMemo(function () {
7141
- var _pageSizesDimensions, _elements$find;
7142
- return calculatePercentageValue((_pageSizesDimensions = pageSizesDimensions[(elements === null || elements === void 0 || (_elements$find = elements.find(function (e) {
7143
- return (e === null || e === void 0 ? void 0 : e.type) === (elementTypes === null || elementTypes === void 0 ? void 0 : elementTypes.pageSize);
7144
- })) === null || _elements$find === void 0 ? void 0 : _elements$find.size) || (pageSizes === null || pageSizes === void 0 ? void 0 : pageSizes.A4)]) === null || _pageSizesDimensions === void 0 ? void 0 : _pageSizesDimensions.height, zoomPercentage);
7145
- }, [zoomPercentage, elements]);
7410
+ var _getPageDims2 = getPageDims(elements),
7411
+ height = _getPageDims2.height;
7412
+ return calculatePercentageValue(height, zoomPercentage);
7413
+ }, [zoomPercentage, elements, getPageDims]);
7146
7414
  var editorWidth = React.useMemo(function () {
7147
- var _pageSizesDimensions2, _elements$find2;
7148
- return calculatePercentageValue((_pageSizesDimensions2 = pageSizesDimensions[(elements === null || elements === void 0 || (_elements$find2 = elements.find(function (e) {
7149
- return (e === null || e === void 0 ? void 0 : e.type) === (elementTypes === null || elementTypes === void 0 ? void 0 : elementTypes.pageSize);
7150
- })) === null || _elements$find2 === void 0 ? void 0 : _elements$find2.size) || (pageSizes === null || pageSizes === void 0 ? void 0 : pageSizes.A4)]) === null || _pageSizesDimensions2 === void 0 ? void 0 : _pageSizesDimensions2.width, zoomPercentage);
7151
- }, [zoomPercentage, elements]);
7415
+ var _getPageDims3 = getPageDims(elements),
7416
+ width = _getPageDims3.width;
7417
+ return calculatePercentageValue(width, zoomPercentage);
7418
+ }, [zoomPercentage, elements, getPageDims]);
7152
7419
  var normalizedOutsidePreviewPadding = React.useMemo(function () {
7153
7420
  return Math.max(0, Number(outsideBoundaryPreviewPadding) || 0);
7154
7421
  }, [outsideBoundaryPreviewPadding]);
@@ -7162,11 +7429,11 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
7162
7429
  };
7163
7430
  }, [showOutsideBoundaryPreview, normalizedOutsidePreviewPadding, editorWidth, editorHeight]);
7164
7431
  var selectedPageSize = React.useMemo(function () {
7165
- var _elements$find3;
7166
- return (elements === null || elements === void 0 || (_elements$find3 = elements.find(function (e) {
7167
- return (e === null || e === void 0 ? void 0 : e.type) === (elementTypes === null || elementTypes === void 0 ? void 0 : elementTypes.pageSize);
7168
- })) === null || _elements$find3 === void 0 ? void 0 : _elements$find3.size) || (pageSizes === null || pageSizes === void 0 ? void 0 : pageSizes.A4);
7169
- }, [elements]);
7432
+ return getNormalizedCanvasSize(elements);
7433
+ }, [elements, getNormalizedCanvasSize]);
7434
+ var selectedPageSizeLabel = React.useMemo(function () {
7435
+ return getCanvasSizeLabel(selectedPageSize);
7436
+ }, [selectedPageSize]);
7170
7437
  var hasLocationText = React.useMemo(function () {
7171
7438
  return elements.some(function (e) {
7172
7439
  return e.type === elementTypes.text && e.id === LOCATION_ELEMENT_ID;
@@ -7295,20 +7562,30 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
7295
7562
  saveHistory([].concat(_toConsumableArray(elemClone), [newElement]));
7296
7563
  };
7297
7564
  var onSetPageSize = function onSetPageSize(newSize) {
7298
- var _elements$find4;
7299
7565
  if (!newSize) return;
7300
- var oldSize = (elements === null || elements === void 0 || (_elements$find4 = elements.find(function (e) {
7301
- return (e === null || e === void 0 ? void 0 : e.type) === (elementTypes === null || elementTypes === void 0 ? void 0 : elementTypes.pageSize);
7302
- })) === null || _elements$find4 === void 0 ? void 0 : _elements$find4.size) || pageSizes.A4;
7303
- var oldDims = pageSizesDimensions[oldSize];
7304
- var newDims = pageSizesDimensions[newSize];
7305
- var scaleX = newDims.width / oldDims.width;
7306
- var scaleY = newDims.height / oldDims.height;
7566
+ var oldDims = getNormalizedCanvasSize(elements);
7567
+ var newDims = normalizeCanvasSize(newSize, pageSizes.A4);
7568
+ var scaleX = newDims.widthPx / oldDims.widthPx;
7569
+ var scaleY = newDims.heightPx / oldDims.heightPx;
7570
+ var pageSizeElem = getPageSizeElement(elements);
7571
+ var pageSizeId = (pageSizeElem === null || pageSizeElem === void 0 ? void 0 : pageSizeElem.id) || "element".concat(Date.now());
7307
7572
  var scaledElements = elements.map(function (elem) {
7308
7573
  if (elem.type === elementTypes.pageSize) {
7309
- return _objectSpread2(_objectSpread2({}, elem), {}, {
7310
- size: newSize
7311
- }); // Just update the size
7574
+ var nextPageElem = _objectSpread2(_objectSpread2({}, elem), {}, {
7575
+ id: pageSizeId
7576
+ });
7577
+ if (newDims.mode === CANVAS_SIZE_MODES.custom) {
7578
+ delete nextPageElem.size;
7579
+ nextPageElem.mode = CANVAS_SIZE_MODES.custom;
7580
+ nextPageElem.widthMm = newDims.widthMm;
7581
+ nextPageElem.heightMm = newDims.heightMm;
7582
+ } else {
7583
+ delete nextPageElem.mode;
7584
+ delete nextPageElem.widthMm;
7585
+ delete nextPageElem.heightMm;
7586
+ nextPageElem.size = newDims.preset;
7587
+ }
7588
+ return nextPageElem;
7312
7589
  }
7313
7590
  var scaled = _objectSpread2({}, elem);
7314
7591
 
@@ -7328,7 +7605,39 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
7328
7605
  }
7329
7606
  return scaled;
7330
7607
  });
7608
+ if (!scaledElements.some(function (elem) {
7609
+ return elem.type === elementTypes.pageSize;
7610
+ })) {
7611
+ var newPageElement = {
7612
+ type: elementTypes.pageSize,
7613
+ id: pageSizeId,
7614
+ size: newDims.preset || pageSizes.A4,
7615
+ cuttingGuideStroke: 0,
7616
+ cuttingGuideStrokeColor: theme.color.black
7617
+ };
7618
+ if (newDims.mode === CANVAS_SIZE_MODES.custom) {
7619
+ delete newPageElement.size;
7620
+ newPageElement.mode = CANVAS_SIZE_MODES.custom;
7621
+ newPageElement.widthMm = newDims.widthMm;
7622
+ newPageElement.heightMm = newDims.heightMm;
7623
+ }
7624
+ scaledElements.unshift(newPageElement);
7625
+ }
7331
7626
  saveHistory(removeImageProperty(scaledElements));
7627
+ if (typeof onCanvasSizeChange === 'function') {
7628
+ if (newDims.mode === CANVAS_SIZE_MODES.custom) {
7629
+ onCanvasSizeChange({
7630
+ mode: CANVAS_SIZE_MODES.custom,
7631
+ widthMm: newDims.widthMm,
7632
+ heightMm: newDims.heightMm
7633
+ });
7634
+ } else {
7635
+ onCanvasSizeChange({
7636
+ mode: CANVAS_SIZE_MODES.preset,
7637
+ preset: newDims.preset
7638
+ });
7639
+ }
7640
+ }
7332
7641
  };
7333
7642
  var _onChangeCuttingGuideProp = function onChangeCuttingGuideProp(type, value) {
7334
7643
  var elemClone = JSON.parse(JSON.stringify(elements));
@@ -7967,12 +8276,12 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
7967
8276
  onToggleQrIdText: toggleQrIdText
7968
8277
  }), loadingFonts ? null : /*#__PURE__*/React.createElement(Editor, {
7969
8278
  setLoading: setLoading,
7970
- cuttingGuideStroke: (elements === null || elements === void 0 || (_elements$find5 = elements.find(function (e) {
8279
+ cuttingGuideStroke: (elements === null || elements === void 0 || (_elements$find = elements.find(function (e) {
7971
8280
  return (e === null || e === void 0 ? void 0 : e.type) === (elementTypes === null || elementTypes === void 0 ? void 0 : elementTypes.pageSize);
7972
- })) === null || _elements$find5 === void 0 ? void 0 : _elements$find5.cuttingGuideStroke) || 0,
7973
- cuttingGuideStrokeColor: (elements === null || elements === void 0 || (_elements$find6 = elements.find(function (e) {
8281
+ })) === null || _elements$find === void 0 ? void 0 : _elements$find.cuttingGuideStroke) || 0,
8282
+ cuttingGuideStrokeColor: (elements === null || elements === void 0 || (_elements$find2 = elements.find(function (e) {
7974
8283
  return (e === null || e === void 0 ? void 0 : e.type) === (elementTypes === null || elementTypes === void 0 ? void 0 : elementTypes.pageSize);
7975
- })) === null || _elements$find6 === void 0 ? void 0 : _elements$find6.cuttingGuideStrokeColor) || (theme === null || theme === void 0 ? void 0 : theme.color.black),
8284
+ })) === null || _elements$find2 === void 0 ? void 0 : _elements$find2.cuttingGuideStrokeColor) || (theme === null || theme === void 0 ? void 0 : theme.color.black),
7976
8285
  onChangeCuttingGuideProp: function onChangeCuttingGuideProp(type, value) {
7977
8286
  _onChangeCuttingGuideProp(type, value);
7978
8287
  },
@@ -8019,9 +8328,9 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
8019
8328
  stageRef: stageRef,
8020
8329
  saveHistory: saveHistory,
8021
8330
  onChangeBackgroundImageOpacity: onChangeBackgroundImageOpacity,
8022
- backgroundImageOpacity: (elements === null || elements === void 0 || (_elements$find7 = elements.find(function (e) {
8331
+ backgroundImageOpacity: (elements === null || elements === void 0 || (_elements$find3 = elements.find(function (e) {
8023
8332
  return (e === null || e === void 0 ? void 0 : e.type) === (elementTypes === null || elementTypes === void 0 ? void 0 : elementTypes.backgroundImage);
8024
- })) === null || _elements$find7 === void 0 ? void 0 : _elements$find7.opacity) || backgroundImageOpacity,
8333
+ })) === null || _elements$find3 === void 0 ? void 0 : _elements$find3.opacity) || backgroundImageOpacity,
8025
8334
  onDeleteSelectedElement: onDeleteSelectedElement,
8026
8335
  onCopySelectedElement: onCopySelectedElement,
8027
8336
  onToggleLockElement: onToggleLockElement,
@@ -8031,6 +8340,7 @@ var Studio = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
8031
8340
  onChangeTextProperty: onChangeTextProperty,
8032
8341
  onSetPageSize: onSetPageSize,
8033
8342
  selectedPageSize: selectedPageSize,
8343
+ selectedPageSizeLabel: selectedPageSizeLabel,
8034
8344
  loadingImages: loadingImages,
8035
8345
  loadingFonts: loadingFonts,
8036
8346
  uploadImageCallBack: uploadImageCallBack,