@yorab/react-paint 0.2.2 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/Changelog.md +44 -0
  2. package/LICENSE.txt +21 -0
  3. package/README.md +9 -90
  4. package/dist/components/App.js +233 -113
  5. package/dist/components/Canvas.js +45 -21
  6. package/dist/components/settings/ColorField.js +3 -7
  7. package/dist/components/settings/LayoutButton.js +3 -3
  8. package/dist/components/settings/Layouts.js +6 -19
  9. package/dist/components/settings/SettingsBar.js +3 -3
  10. package/dist/components/toolbox/EditTextBox.js +20 -13
  11. package/dist/components/toolbox/MenuGroup.js +48 -5
  12. package/dist/components/toolbox/PictureUrlInput.js +8 -7
  13. package/dist/components/toolbox/Toolbar.js +56 -33
  14. package/dist/components/toolbox/ToolbarGroup.js +3 -3
  15. package/dist/constants/shapes.js +7 -3
  16. package/dist/hooks/useDrawableCanvas.js +23 -20
  17. package/dist/hooks/useResizeObserver.js +40 -0
  18. package/dist/hooks/useShapes.js +14 -9
  19. package/dist/styles.css +32 -35
  20. package/dist/types/utils.js +5 -0
  21. package/dist/utils/data.js +71 -19
  22. package/dist/utils/draw.js +90 -51
  23. package/dist/utils/file.js +26 -60
  24. package/dist/utils/intersect.js +22 -18
  25. package/dist/utils/selection.js +6 -6
  26. package/dist/utils/shapeData.js +49 -54
  27. package/dist/utils/transform.js +48 -34
  28. package/package.json +6 -7
  29. package/dist/components/App.d.ts +0 -20
  30. package/dist/components/Canvas.d.ts +0 -28
  31. package/dist/components/common/Button.d.ts +0 -14
  32. package/dist/components/common/Loading.d.ts +0 -6
  33. package/dist/components/common/Modal.d.ts +0 -8
  34. package/dist/components/common/Panel.d.ts +0 -10
  35. package/dist/components/common/Snackbar.d.ts +0 -7
  36. package/dist/components/settings/ColorField.d.ts +0 -12
  37. package/dist/components/settings/DeleteButton.d.ts +0 -9
  38. package/dist/components/settings/FontFamilyField.d.ts +0 -10
  39. package/dist/components/settings/LayoutButton.d.ts +0 -8
  40. package/dist/components/settings/Layouts.d.ts +0 -18
  41. package/dist/components/settings/LineArrowField.d.ts +0 -10
  42. package/dist/components/settings/LineTypeField.d.ts +0 -14
  43. package/dist/components/settings/PointsNumberField.d.ts +0 -11
  44. package/dist/components/settings/RangeField.d.ts +0 -16
  45. package/dist/components/settings/SelectField.d.ts +0 -16
  46. package/dist/components/settings/SettingsBar.d.ts +0 -16
  47. package/dist/components/toolbox/EditTextBox.d.ts +0 -10
  48. package/dist/components/toolbox/LoadFileTool.d.ts +0 -11
  49. package/dist/components/toolbox/MenuGroup.d.ts +0 -23
  50. package/dist/components/toolbox/PictureUrlInput.d.ts +0 -7
  51. package/dist/components/toolbox/Tool.d.ts +0 -13
  52. package/dist/components/toolbox/Toolbar.d.ts +0 -20
  53. package/dist/components/toolbox/ToolbarGroup.d.ts +0 -18
  54. package/dist/constants/draw.d.ts +0 -2
  55. package/dist/constants/draw.js +0 -10
  56. package/dist/constants/icons.d.ts +0 -36
  57. package/dist/constants/shapes.d.ts +0 -5
  58. package/dist/constants/snackbar.d.ts +0 -11
  59. package/dist/constants/style.d.ts +0 -12
  60. package/dist/hooks/useComponent.d.ts +0 -9
  61. package/dist/hooks/useDrag.d.ts +0 -15
  62. package/dist/hooks/useDrawableCanvas.d.ts +0 -30
  63. package/dist/hooks/useKeyboard.d.ts +0 -15
  64. package/dist/hooks/useShapes.d.ts +0 -22
  65. package/dist/hooks/useSnackbar.d.ts +0 -16
  66. package/dist/schemas/drawableShape.json +0 -1021
  67. package/dist/types/Mode.d.ts +0 -51
  68. package/dist/types/Shapes.d.ts +0 -122
  69. package/dist/types/keyboard.d.ts +0 -15
  70. package/dist/utils/data.d.ts +0 -4
  71. package/dist/utils/draw.d.ts +0 -18
  72. package/dist/utils/file.d.ts +0 -33
  73. package/dist/utils/intersect.d.ts +0 -8
  74. package/dist/utils/selection.d.ts +0 -7
  75. package/dist/utils/shapeData.d.ts +0 -5
  76. package/dist/utils/string.d.ts +0 -3
  77. package/dist/utils/style.d.ts +0 -2
  78. package/dist/utils/toolbar.d.ts +0 -12
  79. package/dist/utils/transform.d.ts +0 -271
@@ -25,8 +25,6 @@ var _Mode = require("../types/Mode");
25
25
 
26
26
  var _transform = require("../utils/transform");
27
27
 
28
- var _draw2 = require("../constants/draw");
29
-
30
28
  var _EditTextBox = _interopRequireDefault(require("./toolbox/EditTextBox"));
31
29
 
32
30
  var _useDrawableCanvas2 = _interopRequireDefault(require("../hooks/useDrawableCanvas"));
@@ -41,20 +39,32 @@ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (O
41
39
 
42
40
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
43
41
 
44
- var drawCanvas = function drawCanvas(drawCtx, selectionCtx, selectionMode, width, height, activeTool, canvasOffset, shapes, selectedShape) {
42
+ var renderDrawCanvas = function renderDrawCanvas(drawCtx, selectionMode, canvasSize, canvasOffset, shapes, selectionPadding, selectedShape) {
43
+ var width = canvasSize.width,
44
+ height = canvasSize.height,
45
+ scaleRatio = canvasSize.scaleRatio;
45
46
  drawCtx.clearRect(0, 0, width, height);
46
- selectionCtx.clearRect(0, 0, width, height);
47
47
 
48
48
  for (var i = shapes.length - 1; i >= 0; i--) {
49
49
  if (selectionMode.mode !== _Mode.SelectionModeLib.textedition || shapes[i] !== selectedShape) {
50
- (0, _draw.drawShape)(drawCtx, shapes[i], canvasOffset);
50
+ (0, _draw.drawShape)(drawCtx, shapes[i], scaleRatio, canvasOffset, selectionPadding);
51
51
  }
52
52
  }
53
+ };
53
54
 
55
+ var renderSelectionCanvas = function renderSelectionCanvas(selectionCtx, selectionMode, canvasSize, activeTool, canvasOffset, selectionPadding, selectionWidth, selectionColor, selectedShape) {
56
+ var width = canvasSize.width,
57
+ height = canvasSize.height,
58
+ scaleRatio = canvasSize.scaleRatio;
59
+ selectionCtx.clearRect(0, 0, width, height);
54
60
  selectedShape && activeTool !== _Shapes.ShapeEnum.brush && (0, _draw.drawSelection)({
55
61
  ctx: selectionCtx,
56
62
  shape: selectedShape,
63
+ scaleRatio: scaleRatio,
57
64
  canvasOffset: canvasOffset,
65
+ selectionPadding: selectionPadding,
66
+ selectionWidth: selectionWidth,
67
+ selectionColor: selectionColor,
58
68
  withAnchors: selectionMode.mode !== _Mode.SelectionModeLib.textedition
59
69
  });
60
70
  };
@@ -87,8 +97,7 @@ var Canvas = /*#__PURE__*/_react["default"].forwardRef(function (_ref2, ref) {
87
97
  canGrow = _ref2.canGrow,
88
98
  _ref2$disabled = _ref2.disabled,
89
99
  disabled = _ref2$disabled === void 0 ? false : _ref2$disabled,
90
- width = _ref2.width,
91
- height = _ref2.height,
100
+ canvasSize = _ref2.canvasSize,
92
101
  shapes = _ref2.shapes,
93
102
  addShape = _ref2.addShape,
94
103
  updateSingleShape = _ref2.updateSingleShape,
@@ -104,7 +113,11 @@ var Canvas = /*#__PURE__*/_react["default"].forwardRef(function (_ref2, ref) {
104
113
  defaultConf = _ref2.defaultConf,
105
114
  isInsideComponent = _ref2.isInsideComponent,
106
115
  selectionMode = _ref2.selectionMode,
107
- setSelectionMode = _ref2.setSelectionMode;
116
+ setSelectionMode = _ref2.setSelectionMode,
117
+ selectionWidth = _ref2.selectionWidth,
118
+ selectionColor = _ref2.selectionColor,
119
+ selectionPadding = _ref2.selectionPadding,
120
+ isEditMode = _ref2.isEditMode;
108
121
  var drawCanvasRef = (0, _react.useRef)(null);
109
122
  var selectionCanvasRef = (0, _react.useRef)(null); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
110
123
 
@@ -115,13 +128,12 @@ var Canvas = /*#__PURE__*/_react["default"].forwardRef(function (_ref2, ref) {
115
128
  var _useDrawableCanvas = (0, _useDrawableCanvas2["default"])({
116
129
  disabled: disabled,
117
130
  addShape: addShape,
131
+ canvasSize: canvasSize,
118
132
  drawCanvasRef: drawCanvasRef,
119
133
  setActiveTool: setActiveTool,
120
134
  shapes: shapes,
121
135
  defaultConf: defaultConf,
122
136
  selectionMode: selectionMode,
123
- width: width,
124
- height: height,
125
137
  activeTool: activeTool,
126
138
  isInsideComponent: isInsideComponent,
127
139
  setCanvasOffset: setCanvasOffset,
@@ -133,7 +145,8 @@ var Canvas = /*#__PURE__*/_react["default"].forwardRef(function (_ref2, ref) {
133
145
  updateSingleShape: updateSingleShape,
134
146
  canvasOffset: canvasOffset,
135
147
  saveShapes: saveShapes,
136
- setSelectionMode: setSelectionMode
148
+ setSelectionMode: setSelectionMode,
149
+ selectionPadding: selectionPadding
137
150
  }),
138
151
  hoverMode = _useDrawableCanvas.hoverMode;
139
152
 
@@ -156,31 +169,42 @@ var Canvas = /*#__PURE__*/_react["default"].forwardRef(function (_ref2, ref) {
156
169
  updateSingleShape(resizedShape);
157
170
  }, [updateSingleShape, selectedShape]);
158
171
  (0, _react.useEffect)(function () {
159
- var _drawCanvasRef$curren2, _selectionCanvasRef$c;
172
+ var _drawCanvasRef$curren2;
160
173
 
161
174
  var drawCtx = (_drawCanvasRef$curren2 = drawCanvasRef.current) === null || _drawCanvasRef$curren2 === void 0 ? void 0 : _drawCanvasRef$curren2.getContext('2d');
175
+ drawCtx && window.requestAnimationFrame(function () {
176
+ return renderDrawCanvas(drawCtx, selectionMode, canvasSize, canvasOffset, shapes, selectionPadding, selectedShape);
177
+ });
178
+ }, [shapes, selectionMode, selectedShape, canvasOffset, canvasSize, selectionPadding]);
179
+ (0, _react.useEffect)(function () {
180
+ var _selectionCanvasRef$c;
181
+
162
182
  var selectionCtx = (_selectionCanvasRef$c = selectionCanvasRef.current) === null || _selectionCanvasRef$c === void 0 ? void 0 : _selectionCanvasRef$c.getContext('2d');
163
- drawCtx && selectionCtx && _fp["default"].throttle(_draw2.FRAMERATE_DRAW, drawCanvas)(drawCtx, selectionCtx, selectionMode, width, height, activeTool, canvasOffset, shapes, selectedShape);
164
- }, [shapes, selectionMode, selectedShape, activeTool, canvasOffset, width, height]);
183
+ selectionCtx && window.requestAnimationFrame(function () {
184
+ return renderSelectionCanvas(selectionCtx, selectionMode, canvasSize, activeTool, canvasOffset, selectionPadding, selectionWidth, selectionColor, selectedShape);
185
+ });
186
+ }, [selectionMode, selectedShape, activeTool, canvasOffset, canvasSize, selectionPadding, selectionWidth, selectionColor]);
165
187
  return /*#__PURE__*/_react["default"].createElement(StyledCanvasBox, null, /*#__PURE__*/_react["default"].createElement(StyledCanvasContainer, {
166
188
  "data-grid": withGrid,
167
189
  "data-grow": canGrow
168
190
  }, /*#__PURE__*/_react["default"].createElement(StyledDrawCanvas, {
169
191
  ref: drawCanvasRef,
170
192
  "data-grow": canGrow,
171
- width: width,
172
- height: height
173
- }), /*#__PURE__*/_react["default"].createElement(StyledSelectionCanvas, {
193
+ width: canvasSize.width,
194
+ height: canvasSize.height
195
+ }), isEditMode && /*#__PURE__*/_react["default"].createElement(StyledSelectionCanvas, {
174
196
  ref: selectionCanvasRef,
175
- width: width,
176
- height: height,
197
+ width: canvasSize.width,
198
+ height: canvasSize.height,
177
199
  "data-grow": canGrow,
178
200
  cursor: activeTool !== _Shapes.ToolEnum.selection && activeTool !== _Shapes.ToolEnum.move || hoverMode.mode === _Mode.SelectionModeLib.resize ? 'crosshair' : activeTool === _Shapes.ToolEnum.move || hoverMode.mode === _Mode.SelectionModeLib.translate ? 'move' : hoverMode.mode === _Mode.SelectionModeLib.rotate ? 'grab' : 'default'
179
- }), selectionMode.mode === _Mode.SelectionModeLib.textedition && (selectedShape === null || selectedShape === void 0 ? void 0 : selectedShape.type) === _Shapes.ShapeEnum.text && /*#__PURE__*/_react["default"].createElement(_EditTextBox["default"], {
201
+ }), isEditMode && selectionMode.mode === _Mode.SelectionModeLib.textedition && (selectedShape === null || selectedShape === void 0 ? void 0 : selectedShape.type) === _Shapes.ShapeEnum.text && /*#__PURE__*/_react["default"].createElement(_EditTextBox["default"], {
202
+ scaleRatio: canvasSize.scaleRatio,
180
203
  disabled: disabled,
181
204
  shape: selectedShape,
182
205
  defaultValue: selectionMode.defaultValue,
183
- updateValue: updateSelectedShapeText
206
+ updateValue: updateSelectedShapeText,
207
+ selectionPadding: selectionPadding
184
208
  })));
185
209
  });
186
210
 
@@ -49,10 +49,6 @@ var StyledCustomColor = /*#__PURE__*/(0, _react2.styled)("div")({
49
49
  }]
50
50
  }
51
51
  });
52
- var StyledColorButton = /*#__PURE__*/(0, _react2.styled)(_Button["default"])({
53
- name: "StyledColorButton",
54
- "class": "sttf061"
55
- });
56
52
 
57
53
  var ColorField = function ColorField(_ref3) {
58
54
  var selectedSettings = _ref3.selectedSettings,
@@ -98,7 +94,7 @@ var ColorField = function ColorField(_ref3) {
98
94
  title: title,
99
95
  alignment: "left"
100
96
  }, /*#__PURE__*/_react["default"].createElement("div", null, _style.STYLE_COLORS.map(function (color, index) {
101
- return /*#__PURE__*/_react["default"].createElement(StyledColorButton, {
97
+ return /*#__PURE__*/_react["default"].createElement(_Button["default"], {
102
98
  title: color,
103
99
  key: index,
104
100
  selected: color === value,
@@ -109,14 +105,14 @@ var ColorField = function ColorField(_ref3) {
109
105
  }, /*#__PURE__*/_react["default"].createElement(StyledColor, {
110
106
  color: color === 'transparent' ? "url('data:image/svg+xml,".concat(_icons.encodedTransparentIcon, "')") : color
111
107
  }));
112
- }), /*#__PURE__*/_react["default"].createElement(StyledColorButton, {
108
+ }), /*#__PURE__*/_react["default"].createElement(_Button["default"], {
113
109
  type: "color",
114
110
  title: "Custom color",
115
111
  selected: !_fp["default"].includes(value, _style.STYLE_COLORS),
116
112
  value: value,
117
113
  onChange: handleChange
118
114
  }, /*#__PURE__*/_react["default"].createElement(StyledCustomColor, {
119
- color: _fp["default"].includes(value, _style.STYLE_COLORS) ? 'black' : value
115
+ color: _fp["default"].includes(value, _style.STYLE_COLORS) ? 'var(--font-color)' : value
120
116
  }, /*#__PURE__*/_react["default"].createElement("span", {
121
117
  dangerouslySetInnerHTML: {
122
118
  __html: _icons.paletteIcon
@@ -21,12 +21,12 @@ var StyleToggleLayoutButton = /*#__PURE__*/(0, _react2.styled)(_Button["default"
21
21
  });
22
22
 
23
23
  var LayoutButton = function LayoutButton(_ref) {
24
- var withLayouts = _ref.withLayouts,
24
+ var layersManipulation = _ref.layersManipulation,
25
25
  disabled = _ref.disabled,
26
26
  toggleLayoutPanel = _ref.toggleLayoutPanel;
27
27
  return /*#__PURE__*/_react["default"].createElement(StyleToggleLayoutButton, {
28
- title: "Toggle layout",
29
- "data-hidden": +(withLayouts === 'always' || withLayouts === 'never'),
28
+ title: "Toggle layers panel",
29
+ "data-hidden": !layersManipulation,
30
30
  disabled: disabled,
31
31
  onClick: toggleLayoutPanel,
32
32
  icon: _icons.layersIcon
@@ -133,16 +133,18 @@ var Layout = function Layout(_ref) {
133
133
  dangerouslySetInnerHTML: {
134
134
  __html: (0, _style.getShapePicture)(shape.type)
135
135
  }
136
- }), /*#__PURE__*/_react["default"].createElement(StyledSeparator, null), /*#__PURE__*/_react["default"].createElement(StyledVisibleButton, {
136
+ }), /*#__PURE__*/_react["default"].createElement("span", null, shape.id), /*#__PURE__*/_react["default"].createElement(StyledSeparator, null), /*#__PURE__*/_react["default"].createElement(StyledVisibleButton, {
137
137
  title: shape.visible ? 'Hide' : 'Show',
138
138
  "data-visible": shape.visible !== false,
139
139
  disabled: disabled,
140
+ selected: selected,
140
141
  onClick: onToggleShapeVisibility,
141
142
  icon: shape.visible === false ? _icons.visibilityOffIcon : _icons.visibilityIcon
142
143
  }), /*#__PURE__*/_react["default"].createElement(StyledLockedButton, {
143
144
  title: shape.locked ? 'Locked' : 'Unlocked',
144
145
  "data-locked": !!shape.locked,
145
146
  disabled: disabled,
147
+ selected: selected,
146
148
  onClick: onToggleShapeLock,
147
149
  icon: shape.locked ? _icons.lockedIcon : _icons.unlockedIcon
148
150
  }));
@@ -160,7 +162,6 @@ var Layouts = function Layouts(_ref2) {
160
162
  selectedShape = _ref2.selectedShape,
161
163
  moveShapes = _ref2.moveShapes,
162
164
  selectShape = _ref2.selectShape,
163
- withLayouts = _ref2.withLayouts,
164
165
  isLayoutPanelShown = _ref2.isLayoutPanelShown;
165
166
 
166
167
  var _useState = (0, _react.useState)(undefined),
@@ -174,22 +175,8 @@ var Layouts = function Layouts(_ref2) {
174
175
  });
175
176
  };
176
177
 
177
- return isLayoutPanelShown ? withLayouts === 'always' ? /*#__PURE__*/_react["default"].createElement(StyledLayouts, null, _fp["default"].map(function (shape) {
178
- return /*#__PURE__*/_react["default"].createElement(Layout, {
179
- key: shape.id,
180
- shape: shape,
181
- disabled: disabled,
182
- layoutDragging: layoutDragging,
183
- setLayoutDragging: setLayoutDragging,
184
- selected: (selectedShape === null || selectedShape === void 0 ? void 0 : selectedShape.id) === shape.id,
185
- handleSelect: selectShape,
186
- handleRemove: removeShape,
187
- onMoveShapes: moveShapes,
188
- toggleShapeVisibility: toggleShapeVisibility,
189
- toggleShapeLock: toggleShapeLock
190
- });
191
- }, shapes)) : /*#__PURE__*/_react["default"].createElement(StyledPanelLayouts, {
192
- title: "Layouts",
178
+ return isLayoutPanelShown ? /*#__PURE__*/_react["default"].createElement(StyledPanelLayouts, {
179
+ title: "Layers",
193
180
  alignment: "right"
194
181
  }, /*#__PURE__*/_react["default"].createElement(StyledScrollingContent, null, /*#__PURE__*/_react["default"].createElement(StyledGridButton, {
195
182
  title: withGrid ? 'Grid on' : 'Grid off',
@@ -197,7 +184,7 @@ var Layouts = function Layouts(_ref2) {
197
184
  disabled: disabled,
198
185
  onClick: onToggleGrid,
199
186
  icon: withGrid ? _icons.gridOnIcon : _icons.gridOffIcon
200
- }, "Toggle grid"), /*#__PURE__*/_react["default"].createElement("hr", null), /*#__PURE__*/_react["default"].createElement(StyledLayouts, null, shapes.length === 0 ? /*#__PURE__*/_react["default"].createElement(StyledPlaceholder, null, "No layout yet") : _fp["default"].map(function (shape) {
187
+ }, "Toggle grid"), /*#__PURE__*/_react["default"].createElement("hr", null), /*#__PURE__*/_react["default"].createElement(StyledLayouts, null, shapes.length === 0 ? /*#__PURE__*/_react["default"].createElement(StyledPlaceholder, null, "No layer yet") : _fp["default"].map(function (shape) {
201
188
  return /*#__PURE__*/_react["default"].createElement(Layout, {
202
189
  key: shape.id,
203
190
  shape: shape,
@@ -63,7 +63,7 @@ var SettingsBar = function SettingsBar(_ref) {
63
63
 
64
64
  var _ref$disabled = _ref.disabled,
65
65
  disabled = _ref$disabled === void 0 ? false : _ref$disabled,
66
- withLayouts = _ref.withLayouts,
66
+ layersManipulation = _ref.layersManipulation,
67
67
  toggleLayoutPanel = _ref.toggleLayoutPanel,
68
68
  activeTool = _ref.activeTool,
69
69
  selectedShape = _ref.selectedShape,
@@ -251,8 +251,8 @@ var SettingsBar = function SettingsBar(_ref) {
251
251
  field: "style.globalAlpha",
252
252
  value: (_defaultConf$style7 = defaultConf.style) === null || _defaultConf$style7 === void 0 ? void 0 : _defaultConf$style7.globalAlpha,
253
253
  valueChanged: handleShapeStyleChange
254
- })), /*#__PURE__*/_react["default"].createElement(StyledSeparator, null), /*#__PURE__*/_react["default"].createElement(_LayoutButton["default"], {
255
- withLayouts: withLayouts,
254
+ })), /*#__PURE__*/_react["default"].createElement(StyledSeparator, null), layersManipulation && /*#__PURE__*/_react["default"].createElement(_LayoutButton["default"], {
255
+ layersManipulation: layersManipulation,
256
256
  disabled: disabled,
257
257
  toggleLayoutPanel: toggleLayoutPanel
258
258
  }));
@@ -38,24 +38,30 @@ var StyledEditBox = /*#__PURE__*/(0, _react2.styled)("div")({
38
38
  return color;
39
39
  }],
40
40
  "s1unz6yq-2": [function (_ref3) {
41
- var fontsize = _ref3.fontsize;
41
+ var padding = _ref3.padding;
42
+ return padding;
43
+ }, "px"],
44
+ "s1unz6yq-3": [function (_ref4) {
45
+ var fontsize = _ref4.fontsize;
42
46
  return fontsize;
43
47
  }, "px"],
44
- "s1unz6yq-4": [function (_ref4) {
45
- var fontfamily = _ref4.fontfamily;
48
+ "s1unz6yq-5": [function (_ref5) {
49
+ var fontfamily = _ref5.fontfamily;
46
50
  return fontfamily;
47
51
  }]
48
52
  }
49
53
  });
50
54
 
51
- var EditTextBox = function EditTextBox(_ref5) {
55
+ var EditTextBox = function EditTextBox(_ref6) {
52
56
  var _shape$style$strokeCo, _shape$style, _shape$style$fontFami, _shape$style2;
53
57
 
54
- var _ref5$disabled = _ref5.disabled,
55
- disabled = _ref5$disabled === void 0 ? false : _ref5$disabled,
56
- shape = _ref5.shape,
57
- defaultValue = _ref5.defaultValue,
58
- updateValue = _ref5.updateValue;
58
+ var _ref6$disabled = _ref6.disabled,
59
+ disabled = _ref6$disabled === void 0 ? false : _ref6$disabled,
60
+ scaleRatio = _ref6.scaleRatio,
61
+ shape = _ref6.shape,
62
+ defaultValue = _ref6.defaultValue,
63
+ updateValue = _ref6.updateValue,
64
+ selectionPadding = _ref6.selectionPadding;
59
65
  var ref = (0, _react.useRef)(null);
60
66
 
61
67
  var updateContentEditable = function updateContentEditable(e) {
@@ -68,16 +74,17 @@ var EditTextBox = function EditTextBox(_ref5) {
68
74
  ref.current.focus();
69
75
  }, [defaultValue]);
70
76
  var position = (0, _react.useMemo)(function () {
71
- var _getShapeInfos = (0, _shapeData.getShapeInfos)(shape),
77
+ var _getShapeInfos = (0, _shapeData.getShapeInfos)(shape, selectionPadding),
72
78
  borders = _getShapeInfos.borders,
73
79
  center = _getShapeInfos.center;
74
80
 
75
81
  return (0, _intersect.getPointPositionBeforeCanvasTransformation)([borders.x, borders.y], [-shape.translation[0], -shape.translation[1]], shape.rotation, center);
76
- }, [shape]);
82
+ }, [shape, selectionPadding]);
77
83
  return /*#__PURE__*/_react["default"].createElement(StyledEditBox, {
78
84
  ref: ref,
79
- transform: "translate3D(".concat(position[0], "px, ").concat(position[1], "px, 0) rotate(").concat((0, _transform.radiansToDegrees)(shape.rotation), "deg)"),
80
- fontsize: shape.fontSize,
85
+ transform: "translate3D(".concat(position[0] * scaleRatio, "px, ").concat(position[1] * scaleRatio, "px, 0) rotate(").concat((0, _transform.radiansToDegrees)(shape.rotation), "deg)"),
86
+ fontsize: shape.fontSize * scaleRatio,
87
+ padding: selectionPadding * scaleRatio,
81
88
  color: (_shape$style$strokeCo = (_shape$style = shape.style) === null || _shape$style === void 0 ? void 0 : _shape$style.strokeColor) !== null && _shape$style$strokeCo !== void 0 ? _shape$style$strokeCo : 'inherit',
82
89
  fontfamily: (_shape$style$fontFami = (_shape$style2 = shape.style) === null || _shape$style2 === void 0 ? void 0 : _shape$style2.fontFamily) !== null && _shape$style$fontFami !== void 0 ? _shape$style$fontFami : _style.STYLE_FONT_DEFAULT,
83
90
  contentEditable: !disabled,
@@ -52,12 +52,24 @@ var MenuGroup = function MenuGroup(_ref) {
52
52
  var _ref3;
53
53
 
54
54
  var activeTool = _ref.activeTool,
55
+ withActionsInMenu = _ref.withActionsInMenu,
56
+ _ref$hasActionToUndo = _ref.hasActionToUndo,
57
+ hasActionToUndo = _ref$hasActionToUndo === void 0 ? false : _ref$hasActionToUndo,
58
+ _ref$hasActionToRedo = _ref.hasActionToRedo,
59
+ hasActionToRedo = _ref$hasActionToRedo === void 0 ? false : _ref$hasActionToRedo,
60
+ _ref$hasActionToClear = _ref.hasActionToClear,
61
+ hasActionToClear = _ref$hasActionToClear === void 0 ? false : _ref$hasActionToClear,
62
+ undoAction = _ref.undoAction,
63
+ redoAction = _ref.redoAction,
64
+ clearCanvas = _ref.clearCanvas,
55
65
  alignment = _ref.alignment,
56
66
  group = _ref.group,
57
67
  _ref$vertical = _ref.vertical,
58
68
  vertical = _ref$vertical === void 0 ? false : _ref$vertical,
59
69
  _ref$disabled = _ref.disabled,
60
70
  disabled = _ref$disabled === void 0 ? false : _ref$disabled,
71
+ withLoadAndSave = _ref.withLoadAndSave,
72
+ withExport = _ref.withExport,
61
73
  addPictureFromProps = _ref.addPicture,
62
74
  loadFileFromProps = _ref.loadFile,
63
75
  togglePictureUrlModal = _ref.togglePictureUrlModal,
@@ -117,10 +129,15 @@ var MenuGroup = function MenuGroup(_ref) {
117
129
  document.addEventListener('click', closePanel);
118
130
  }, 0);
119
131
  return function () {
132
+ clearTimeout(timeoutId);
120
133
  document.removeEventListener('click', closePanel);
121
134
  };
122
135
  }, [isOpen]);
123
- return /*#__PURE__*/_react["default"].createElement(StyledRelative, null, /*#__PURE__*/_react["default"].createElement(_Button["default"], {
136
+
137
+ var withPicture = _fp["default"].includes(_Shapes.ShapeEnum.picture, availableTools);
138
+
139
+ var withMenu = withActionsInMenu || withPicture || withLoadAndSave || withExport;
140
+ return withMenu ? /*#__PURE__*/_react["default"].createElement(StyledRelative, null, /*#__PURE__*/_react["default"].createElement(_Button["default"], {
124
141
  selected: isActive,
125
142
  title: group.title,
126
143
  disabled: disabled,
@@ -129,7 +146,33 @@ var MenuGroup = function MenuGroup(_ref) {
129
146
  }), isOpen && /*#__PURE__*/_react["default"].createElement(StyledPanel, {
130
147
  vertical: vertical,
131
148
  alignment: alignment
132
- }, _fp["default"].includes(_Shapes.ShapeEnum.picture, availableTools) && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_LoadFileTool["default"], {
149
+ }, withActionsInMenu && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_Tool["default"], {
150
+ withText: true,
151
+ type: _Shapes.ToolEnum.undo,
152
+ disabled: disabled || !hasActionToUndo,
153
+ lib: "Undo",
154
+ img: _icons.undoIcon,
155
+ isActive: activeTool === _Shapes.ToolEnum.undo,
156
+ setActive: undoAction
157
+ }), /*#__PURE__*/_react["default"].createElement(_Tool["default"], {
158
+ withText: true,
159
+ type: _Shapes.ToolEnum.redo,
160
+ disabled: disabled || !hasActionToRedo,
161
+ lib: "Redo",
162
+ img: _icons.redoIcon,
163
+ isActive: activeTool === _Shapes.ToolEnum.redo,
164
+ setActive: redoAction
165
+ }), /*#__PURE__*/_react["default"].createElement(_Tool["default"], {
166
+ withText: true,
167
+ type: _Shapes.ToolEnum.clear,
168
+ disabled: disabled || !hasActionToClear,
169
+ lib: "Clear",
170
+ img: _icons.clearIcon,
171
+ isActive: activeTool === _Shapes.ToolEnum.clear,
172
+ setActive: function setActive() {
173
+ return clearCanvas();
174
+ }
175
+ }), (withPicture || withLoadAndSave) && /*#__PURE__*/_react["default"].createElement("hr", null)), withPicture && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_LoadFileTool["default"], {
133
176
  withText: true,
134
177
  disabled: disabled,
135
178
  loadFile: addPicture,
@@ -143,7 +186,7 @@ var MenuGroup = function MenuGroup(_ref) {
143
186
  title: "Add picture from URL",
144
187
  icon: _icons.publicIcon,
145
188
  children: "Add picture from URL"
146
- }), /*#__PURE__*/_react["default"].createElement("hr", null)), /*#__PURE__*/_react["default"].createElement(_LoadFileTool["default"], {
189
+ }), withLoadAndSave && /*#__PURE__*/_react["default"].createElement("hr", null)), withLoadAndSave && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_LoadFileTool["default"], {
147
190
  withText: true,
148
191
  disabled: disabled,
149
192
  loadFile: loadFile,
@@ -158,7 +201,7 @@ var MenuGroup = function MenuGroup(_ref) {
158
201
  img: _icons.saveIcon,
159
202
  isActive: activeTool === _Shapes.ToolEnum.saveFile,
160
203
  setActive: saveFile
161
- }), /*#__PURE__*/_react["default"].createElement(_Tool["default"], {
204
+ })), withExport && /*#__PURE__*/_react["default"].createElement(_Tool["default"], {
162
205
  withText: true,
163
206
  disabled: disabled,
164
207
  type: _Shapes.ToolEnum["export"],
@@ -166,7 +209,7 @@ var MenuGroup = function MenuGroup(_ref) {
166
209
  img: _icons.exportFileIcon,
167
210
  isActive: activeTool === _Shapes.ToolEnum["export"],
168
211
  setActive: exportCanvasInFile
169
- })));
212
+ }))) : null;
170
213
  };
171
214
 
172
215
  var _default = MenuGroup;
@@ -36,7 +36,7 @@ var PictureUrlModal = function PictureUrlModal(_ref) {
36
36
  var pictureUrlInputRef = (0, _react.useRef)(null);
37
37
 
38
38
  var addPictureFromUrl = /*#__PURE__*/function () {
39
- var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
39
+ var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(e) {
40
40
  var _pictureUrlInputRef$c;
41
41
 
42
42
  var url;
@@ -44,23 +44,24 @@ var PictureUrlModal = function PictureUrlModal(_ref) {
44
44
  while (1) {
45
45
  switch (_context.prev = _context.next) {
46
46
  case 0:
47
+ e.preventDefault();
47
48
  url = (_pictureUrlInputRef$c = pictureUrlInputRef.current) === null || _pictureUrlInputRef$c === void 0 ? void 0 : _pictureUrlInputRef$c.value;
48
49
 
49
50
  if (!url) {
50
- _context.next = 5;
51
+ _context.next = 6;
51
52
  break;
52
53
  }
53
54
 
54
- _context.next = 4;
55
+ _context.next = 5;
55
56
  return addPicture(url);
56
57
 
57
- case 4:
58
+ case 5:
58
59
  togglePictureUrlModal();
59
60
 
60
- case 5:
61
+ case 6:
61
62
  return _context.abrupt("return");
62
63
 
63
- case 6:
64
+ case 7:
64
65
  case "end":
65
66
  return _context.stop();
66
67
  }
@@ -68,7 +69,7 @@ var PictureUrlModal = function PictureUrlModal(_ref) {
68
69
  }, _callee);
69
70
  }));
70
71
 
71
- return function addPictureFromUrl() {
72
+ return function addPictureFromUrl(_x) {
72
73
  return _ref2.apply(this, arguments);
73
74
  };
74
75
  }();
@@ -39,6 +39,8 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
39
39
 
40
40
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
41
41
 
42
+ var ACTIONS_MENU_BREAKPOINT = 400;
43
+ var TOOLS_MENU_BREAKPOINT = 280;
42
44
  var StyledShrinkableTools = /*#__PURE__*/(0, _react2.styled)("div")({
43
45
  name: "StyledShrinkableTools",
44
46
  "class": "so6hnjf"
@@ -47,33 +49,27 @@ var StyledToolbox = /*#__PURE__*/(0, _react2.styled)("div")({
47
49
  name: "StyledToolbox",
48
50
  "class": "s1c1dllr"
49
51
  });
50
- var StyledShrinkableToolsInner = /*#__PURE__*/(0, _react2.styled)("div")({
51
- name: "StyledShrinkableToolsInner",
52
- "class": "s1g032mh"
53
- });
54
52
  var StyledToolsModal = /*#__PURE__*/(0, _react2.styled)(_Modal["default"])({
55
53
  name: "StyledToolsModal",
56
- "class": "s4owjrv"
54
+ "class": "s1g032mh"
57
55
  });
58
56
  var TOOLBAR_STRUCTURE = [{
59
57
  title: 'brush',
60
- img: _icons.gestureIcon,
61
58
  tools: [_Shapes.ShapeEnum.brush],
62
59
  vertical: false
63
60
  }, {
64
61
  title: 'lines',
65
- img: _icons.arrowIcon,
66
62
  tools: [_Shapes.ShapeEnum.line, _Shapes.ShapeEnum.curve, _Shapes.ShapeEnum.polygon],
67
63
  vertical: false
68
64
  }, {
69
65
  title: 'shapes',
70
- img: _icons.shapesIcon,
71
66
  tools: [_Shapes.ShapeEnum.rect, _Shapes.ShapeEnum.square, _Shapes.ShapeEnum.circle, _Shapes.ShapeEnum.ellipse],
72
67
  vertical: false
73
68
  }, _Shapes.ShapeEnum.text];
74
69
 
75
70
  var Toolbar = function Toolbar(_ref) {
76
- var _ref$disabled = _ref.disabled,
71
+ var width = _ref.width,
72
+ _ref$disabled = _ref.disabled,
77
73
  disabled = _ref$disabled === void 0 ? false : _ref$disabled,
78
74
  activeTool = _ref.activeTool,
79
75
  _ref$hasActionToUndo = _ref.hasActionToUndo,
@@ -82,6 +78,8 @@ var Toolbar = function Toolbar(_ref) {
82
78
  hasActionToRedo = _ref$hasActionToRedo === void 0 ? false : _ref$hasActionToRedo,
83
79
  _ref$hasActionToClear = _ref.hasActionToClear,
84
80
  hasActionToClear = _ref$hasActionToClear === void 0 ? false : _ref$hasActionToClear,
81
+ withLoadAndSave = _ref.withLoadAndSave,
82
+ withExport = _ref.withExport,
85
83
  clearCanvas = _ref.clearCanvas,
86
84
  setActiveToolFromProps = _ref.setActiveTool,
87
85
  undoAction = _ref.undoAction,
@@ -102,6 +100,16 @@ var Toolbar = function Toolbar(_ref) {
102
100
  isPictureUrlModalOpen = _useState4[0],
103
101
  setIsPictureUrlModalOpen = _useState4[1];
104
102
 
103
+ var _useState5 = (0, _react.useState)(width < ACTIONS_MENU_BREAKPOINT),
104
+ _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
105
+ actionsInMenu = _useState6[0],
106
+ setActionsInMenu = _useState6[1];
107
+
108
+ var _useState7 = (0, _react.useState)(width < TOOLS_MENU_BREAKPOINT),
109
+ _useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
110
+ toolsInMenu = _useState8[0],
111
+ setToolsInMenu = _useState8[1];
112
+
105
113
  var toggleTools = function toggleTools() {
106
114
  setIsMenuOpen(function (prev) {
107
115
  return !prev;
@@ -123,15 +131,44 @@ var Toolbar = function Toolbar(_ref) {
123
131
  setIsMenuOpen(false);
124
132
  };
125
133
 
134
+ (0, _react.useEffect)(function () {
135
+ setActionsInMenu(width < ACTIONS_MENU_BREAKPOINT);
136
+ setToolsInMenu(width < TOOLS_MENU_BREAKPOINT);
137
+ }, [width]);
126
138
  var currentStructure = (0, _toolbar.getCurrentStructure)(availableTools, TOOLBAR_STRUCTURE);
127
- return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(StyledToolbox, null, /*#__PURE__*/_react["default"].createElement(_Tool["default"], {
139
+ var isAnyToolSelected = availableTools.includes(activeTool);
140
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(StyledToolbox, null, /*#__PURE__*/_react["default"].createElement(_MenuGroup["default"], {
141
+ withActionsInMenu: actionsInMenu,
142
+ disabled: disabled,
143
+ vertical: true,
144
+ alignment: "left",
145
+ group: {
146
+ title: 'Menu',
147
+ img: _icons.menuIcon
148
+ },
149
+ activeTool: activeTool,
150
+ addPicture: addPicture,
151
+ loadFile: loadFile,
152
+ saveFile: saveFile,
153
+ togglePictureUrlModal: openPictureUrlModal,
154
+ exportCanvasInFile: exportCanvasInFile,
155
+ availableTools: availableTools,
156
+ withLoadAndSave: withLoadAndSave,
157
+ withExport: withExport,
158
+ hasActionToUndo: hasActionToUndo,
159
+ hasActionToRedo: hasActionToRedo,
160
+ hasActionToClear: hasActionToClear,
161
+ undoAction: undoAction,
162
+ redoAction: redoAction,
163
+ clearCanvas: clearCanvas
164
+ }), /*#__PURE__*/_react["default"].createElement(_Tool["default"], {
128
165
  type: _Shapes.ToolEnum.selection,
129
166
  disabled: disabled,
130
167
  lib: "selection",
131
168
  img: _icons.selectIcon,
132
169
  isActive: activeTool === _Shapes.ToolEnum.selection,
133
170
  setActive: setActiveTool
134
- }), /*#__PURE__*/_react["default"].createElement(_Tool["default"], {
171
+ }), !actionsInMenu && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_Tool["default"], {
135
172
  type: _Shapes.ToolEnum.undo,
136
173
  disabled: disabled || !hasActionToUndo,
137
174
  lib: "Undo",
@@ -154,7 +191,13 @@ var Toolbar = function Toolbar(_ref) {
154
191
  setActive: function setActive() {
155
192
  return clearCanvas();
156
193
  }
157
- }), /*#__PURE__*/_react["default"].createElement(StyledShrinkableTools, null, /*#__PURE__*/_react["default"].createElement(StyledShrinkableToolsInner, null, currentStructure.map(function (group, i) {
194
+ })), /*#__PURE__*/_react["default"].createElement(StyledShrinkableTools, null, toolsInMenu ? /*#__PURE__*/_react["default"].createElement(_Button["default"], {
195
+ disabled: disabled,
196
+ onClick: toggleTools,
197
+ title: "Toggle tools",
198
+ icon: _icons.shapesIcon,
199
+ selected: isAnyToolSelected
200
+ }) : currentStructure.map(function (group, i) {
158
201
  return /*#__PURE__*/_react["default"].createElement(_ToolbarGroup["default"], {
159
202
  disabled: disabled,
160
203
  key: i,
@@ -162,27 +205,7 @@ var Toolbar = function Toolbar(_ref) {
162
205
  group: group,
163
206
  setActiveTool: setActiveTool
164
207
  });
165
- })), /*#__PURE__*/_react["default"].createElement(_Button["default"], {
166
- disabled: disabled,
167
- onClick: toggleTools,
168
- title: "Toggle tools",
169
- icon: _icons.dotsIcon
170
- })), /*#__PURE__*/_react["default"].createElement(_MenuGroup["default"], {
171
- disabled: disabled,
172
- vertical: true,
173
- alignment: "right",
174
- group: {
175
- title: 'Menu',
176
- img: _icons.menuIcon
177
- },
178
- activeTool: activeTool,
179
- addPicture: addPicture,
180
- loadFile: loadFile,
181
- saveFile: saveFile,
182
- togglePictureUrlModal: openPictureUrlModal,
183
- exportCanvasInFile: exportCanvasInFile,
184
- availableTools: availableTools
185
- })), isMenuOpen && /*#__PURE__*/_react["default"].createElement(StyledToolsModal, {
208
+ }))), isMenuOpen && /*#__PURE__*/_react["default"].createElement(StyledToolsModal, {
186
209
  onClose: toggleTools
187
210
  }, availableTools.map(function (toolType) {
188
211
  return toolType === _Shapes.ShapeEnum.picture ? null : /*#__PURE__*/_react["default"].createElement(_Tool["default"], {