@yorab/react-paint 0.2.2 → 0.3.0

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 (73) hide show
  1. package/Changelog.md +24 -0
  2. package/LICENSE.txt +21 -0
  3. package/README.md +6 -89
  4. package/dist/components/App.js +125 -102
  5. package/dist/components/Canvas.js +17 -14
  6. package/dist/components/settings/LayoutButton.js +3 -3
  7. package/dist/components/settings/Layouts.js +6 -19
  8. package/dist/components/settings/SettingsBar.js +3 -3
  9. package/dist/components/toolbox/EditTextBox.js +3 -2
  10. package/dist/components/toolbox/MenuGroup.js +1 -0
  11. package/dist/components/toolbox/PictureUrlInput.js +8 -7
  12. package/dist/hooks/useDrawableCanvas.js +19 -17
  13. package/dist/hooks/useResizeObserver.js +40 -0
  14. package/dist/hooks/useShapes.js +12 -8
  15. package/dist/styles.css +16 -17
  16. package/dist/utils/data.js +71 -19
  17. package/dist/utils/draw.js +53 -44
  18. package/dist/utils/file.js +26 -60
  19. package/dist/utils/intersect.js +18 -14
  20. package/dist/utils/selection.js +3 -3
  21. package/dist/utils/transform.js +18 -2
  22. package/package.json +6 -7
  23. package/dist/components/App.d.ts +0 -20
  24. package/dist/components/Canvas.d.ts +0 -28
  25. package/dist/components/common/Button.d.ts +0 -14
  26. package/dist/components/common/Loading.d.ts +0 -6
  27. package/dist/components/common/Modal.d.ts +0 -8
  28. package/dist/components/common/Panel.d.ts +0 -10
  29. package/dist/components/common/Snackbar.d.ts +0 -7
  30. package/dist/components/settings/ColorField.d.ts +0 -12
  31. package/dist/components/settings/DeleteButton.d.ts +0 -9
  32. package/dist/components/settings/FontFamilyField.d.ts +0 -10
  33. package/dist/components/settings/LayoutButton.d.ts +0 -8
  34. package/dist/components/settings/Layouts.d.ts +0 -18
  35. package/dist/components/settings/LineArrowField.d.ts +0 -10
  36. package/dist/components/settings/LineTypeField.d.ts +0 -14
  37. package/dist/components/settings/PointsNumberField.d.ts +0 -11
  38. package/dist/components/settings/RangeField.d.ts +0 -16
  39. package/dist/components/settings/SelectField.d.ts +0 -16
  40. package/dist/components/settings/SettingsBar.d.ts +0 -16
  41. package/dist/components/toolbox/EditTextBox.d.ts +0 -10
  42. package/dist/components/toolbox/LoadFileTool.d.ts +0 -11
  43. package/dist/components/toolbox/MenuGroup.d.ts +0 -23
  44. package/dist/components/toolbox/PictureUrlInput.d.ts +0 -7
  45. package/dist/components/toolbox/Tool.d.ts +0 -13
  46. package/dist/components/toolbox/Toolbar.d.ts +0 -20
  47. package/dist/components/toolbox/ToolbarGroup.d.ts +0 -18
  48. package/dist/constants/draw.d.ts +0 -2
  49. package/dist/constants/draw.js +0 -10
  50. package/dist/constants/icons.d.ts +0 -36
  51. package/dist/constants/shapes.d.ts +0 -5
  52. package/dist/constants/snackbar.d.ts +0 -11
  53. package/dist/constants/style.d.ts +0 -12
  54. package/dist/hooks/useComponent.d.ts +0 -9
  55. package/dist/hooks/useDrag.d.ts +0 -15
  56. package/dist/hooks/useDrawableCanvas.d.ts +0 -30
  57. package/dist/hooks/useKeyboard.d.ts +0 -15
  58. package/dist/hooks/useShapes.d.ts +0 -22
  59. package/dist/hooks/useSnackbar.d.ts +0 -16
  60. package/dist/schemas/drawableShape.json +0 -1021
  61. package/dist/types/Mode.d.ts +0 -51
  62. package/dist/types/Shapes.d.ts +0 -122
  63. package/dist/types/keyboard.d.ts +0 -15
  64. package/dist/utils/data.d.ts +0 -4
  65. package/dist/utils/draw.d.ts +0 -18
  66. package/dist/utils/file.d.ts +0 -33
  67. package/dist/utils/intersect.d.ts +0 -8
  68. package/dist/utils/selection.d.ts +0 -7
  69. package/dist/utils/shapeData.d.ts +0 -5
  70. package/dist/utils/string.d.ts +0 -3
  71. package/dist/utils/style.d.ts +0 -2
  72. package/dist/utils/toolbar.d.ts +0 -12
  73. 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,19 +39,23 @@ 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 drawCanvas = function drawCanvas(drawCtx, selectionCtx, selectionMode, canvasSize, activeTool, canvasOffset, shapes, selectedShape) {
43
+ var width = canvasSize.width,
44
+ height = canvasSize.height,
45
+ scaleRatio = canvasSize.scaleRatio;
45
46
  drawCtx.clearRect(0, 0, width, height);
46
47
  selectionCtx.clearRect(0, 0, width, height);
47
48
 
48
49
  for (var i = shapes.length - 1; i >= 0; i--) {
49
50
  if (selectionMode.mode !== _Mode.SelectionModeLib.textedition || shapes[i] !== selectedShape) {
50
- (0, _draw.drawShape)(drawCtx, shapes[i], canvasOffset);
51
+ (0, _draw.drawShape)(drawCtx, shapes[i], scaleRatio, canvasOffset);
51
52
  }
52
53
  }
53
54
 
54
55
  selectedShape && activeTool !== _Shapes.ShapeEnum.brush && (0, _draw.drawSelection)({
55
56
  ctx: selectionCtx,
56
57
  shape: selectedShape,
58
+ scaleRatio: scaleRatio,
57
59
  canvasOffset: canvasOffset,
58
60
  withAnchors: selectionMode.mode !== _Mode.SelectionModeLib.textedition
59
61
  });
@@ -87,8 +89,7 @@ var Canvas = /*#__PURE__*/_react["default"].forwardRef(function (_ref2, ref) {
87
89
  canGrow = _ref2.canGrow,
88
90
  _ref2$disabled = _ref2.disabled,
89
91
  disabled = _ref2$disabled === void 0 ? false : _ref2$disabled,
90
- width = _ref2.width,
91
- height = _ref2.height,
92
+ canvasSize = _ref2.canvasSize,
92
93
  shapes = _ref2.shapes,
93
94
  addShape = _ref2.addShape,
94
95
  updateSingleShape = _ref2.updateSingleShape,
@@ -115,13 +116,12 @@ var Canvas = /*#__PURE__*/_react["default"].forwardRef(function (_ref2, ref) {
115
116
  var _useDrawableCanvas = (0, _useDrawableCanvas2["default"])({
116
117
  disabled: disabled,
117
118
  addShape: addShape,
119
+ canvasSize: canvasSize,
118
120
  drawCanvasRef: drawCanvasRef,
119
121
  setActiveTool: setActiveTool,
120
122
  shapes: shapes,
121
123
  defaultConf: defaultConf,
122
124
  selectionMode: selectionMode,
123
- width: width,
124
- height: height,
125
125
  activeTool: activeTool,
126
126
  isInsideComponent: isInsideComponent,
127
127
  setCanvasOffset: setCanvasOffset,
@@ -160,23 +160,26 @@ var Canvas = /*#__PURE__*/_react["default"].forwardRef(function (_ref2, ref) {
160
160
 
161
161
  var drawCtx = (_drawCanvasRef$curren2 = drawCanvasRef.current) === null || _drawCanvasRef$curren2 === void 0 ? void 0 : _drawCanvasRef$curren2.getContext('2d');
162
162
  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]);
163
+ drawCtx && selectionCtx && window.requestAnimationFrame(function () {
164
+ return drawCanvas(drawCtx, selectionCtx, selectionMode, canvasSize, activeTool, canvasOffset, shapes, selectedShape);
165
+ });
166
+ }, [shapes, selectionMode, selectedShape, activeTool, canvasOffset, canvasSize]);
165
167
  return /*#__PURE__*/_react["default"].createElement(StyledCanvasBox, null, /*#__PURE__*/_react["default"].createElement(StyledCanvasContainer, {
166
168
  "data-grid": withGrid,
167
169
  "data-grow": canGrow
168
170
  }, /*#__PURE__*/_react["default"].createElement(StyledDrawCanvas, {
169
171
  ref: drawCanvasRef,
170
172
  "data-grow": canGrow,
171
- width: width,
172
- height: height
173
+ width: canvasSize.width,
174
+ height: canvasSize.height
173
175
  }), /*#__PURE__*/_react["default"].createElement(StyledSelectionCanvas, {
174
176
  ref: selectionCanvasRef,
175
- width: width,
176
- height: height,
177
+ width: canvasSize.width,
178
+ height: canvasSize.height,
177
179
  "data-grow": canGrow,
178
180
  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
181
  }), selectionMode.mode === _Mode.SelectionModeLib.textedition && (selectedShape === null || selectedShape === void 0 ? void 0 : selectedShape.type) === _Shapes.ShapeEnum.text && /*#__PURE__*/_react["default"].createElement(_EditTextBox["default"], {
182
+ scaleRatio: canvasSize.scaleRatio,
180
183
  disabled: disabled,
181
184
  shape: selectedShape,
182
185
  defaultValue: selectionMode.defaultValue,
@@ -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
  }));
@@ -53,6 +53,7 @@ var EditTextBox = function EditTextBox(_ref5) {
53
53
 
54
54
  var _ref5$disabled = _ref5.disabled,
55
55
  disabled = _ref5$disabled === void 0 ? false : _ref5$disabled,
56
+ scaleRatio = _ref5.scaleRatio,
56
57
  shape = _ref5.shape,
57
58
  defaultValue = _ref5.defaultValue,
58
59
  updateValue = _ref5.updateValue;
@@ -76,8 +77,8 @@ var EditTextBox = function EditTextBox(_ref5) {
76
77
  }, [shape]);
77
78
  return /*#__PURE__*/_react["default"].createElement(StyledEditBox, {
78
79
  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,
80
+ transform: "translate3D(".concat(position[0] * scaleRatio, "px, ").concat(position[1] * scaleRatio, "px, 0) rotate(").concat((0, _transform.radiansToDegrees)(shape.rotation), "deg)"),
81
+ fontsize: shape.fontSize * scaleRatio,
81
82
  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
83
  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
84
  contentEditable: !disabled,
@@ -117,6 +117,7 @@ var MenuGroup = function MenuGroup(_ref) {
117
117
  document.addEventListener('click', closePanel);
118
118
  }, 0);
119
119
  return function () {
120
+ clearTimeout(timeoutId);
120
121
  document.removeEventListener('click', closePanel);
121
122
  };
122
123
  }, [isOpen]);
@@ -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
  }();
@@ -23,23 +23,21 @@ var _Mode = require("../types/Mode");
23
23
 
24
24
  var _transform = require("../utils/transform");
25
25
 
26
- var _draw = require("../constants/draw");
27
-
28
26
  var _data = require("../utils/data");
29
27
 
30
- var handleMove = function handleMove(e, canvasRef, activeTool, canvasOffset, selectedShape, selectionMode, canvasOffsetStartPosition, width, height, setHoverMode, updateSingleShape, setCanvasOffset, setSelectedShape) {
28
+ var handleMove = function handleMove(e, canvasRef, activeTool, canvasOffset, selectedShape, selectionMode, canvasOffsetStartPosition, width, height, scaleRatio, setHoverMode, updateSingleShape, setCanvasOffset, setSelectedShape) {
31
29
  if (activeTool === _Shapes.ToolEnum.move && canvasOffsetStartPosition !== undefined) {
32
- var _cursorPosition = (0, _intersect.getCursorPosition)(e, canvasRef.current, width, height);
30
+ var _cursorPosition = (0, _intersect.getCursorPosition)(e, canvasRef.current, width, height, scaleRatio);
33
31
 
34
32
  setCanvasOffset([_cursorPosition[0] - canvasOffsetStartPosition[0], _cursorPosition[1] - canvasOffsetStartPosition[1]]);
35
33
  }
36
34
 
37
35
  if (selectedShape == undefined) return;
38
36
  if (selectedShape.locked) return;
39
- var cursorPosition = (0, _intersect.getCursorPosition)(e, canvasRef.current, width, height);
37
+ var cursorPosition = (0, _intersect.getCursorPosition)(e, canvasRef.current, width, height, scaleRatio);
40
38
 
41
39
  if (selectionMode.mode === _Mode.SelectionModeLib["default"]) {
42
- var positionIntersection = (0, _intersect.checkPositionIntersection)(selectedShape, cursorPosition, canvasOffset, true) || {
40
+ var positionIntersection = (0, _intersect.checkPositionIntersection)(selectedShape, cursorPosition, canvasOffset, scaleRatio, true) || {
43
41
  mode: _Mode.SelectionModeLib["default"]
44
42
  };
45
43
  setHoverMode(positionIntersection);
@@ -60,13 +58,12 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
60
58
  var _ref$disabled = _ref.disabled,
61
59
  disabled = _ref$disabled === void 0 ? false : _ref$disabled,
62
60
  addShape = _ref.addShape,
61
+ canvasSize = _ref.canvasSize,
63
62
  drawCanvasRef = _ref.drawCanvasRef,
64
63
  setActiveTool = _ref.setActiveTool,
65
64
  shapes = _ref.shapes,
66
65
  defaultConf = _ref.defaultConf,
67
66
  selectionMode = _ref.selectionMode,
68
- width = _ref.width,
69
- height = _ref.height,
70
67
  activeTool = _ref.activeTool,
71
68
  isInsideComponent = _ref.isInsideComponent,
72
69
  setCanvasOffset = _ref.setCanvasOffset,
@@ -79,6 +76,9 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
79
76
  canvasOffset = _ref.canvasOffset,
80
77
  saveShapes = _ref.saveShapes,
81
78
  setSelectionMode = _ref.setSelectionMode;
79
+ var width = canvasSize.width,
80
+ height = canvasSize.height,
81
+ scaleRatio = canvasSize.scaleRatio;
82
82
 
83
83
  var _useState = (0, _react.useState)({
84
84
  mode: _Mode.SelectionModeLib["default"]
@@ -89,7 +89,9 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
89
89
 
90
90
  (0, _react.useEffect)(function () {
91
91
  var handleMouseMove = function handleMouseMove(e) {
92
- return _fp["default"].throttle(_draw.FRAMERATE_SELECTION, handleMove)(e, selectionCanvasRef, activeTool, canvasOffset, selectedShape, selectionMode, canvasOffsetStartPosition, width, height, setHoverMode, updateSingleShape, setCanvasOffset, setSelectedShape);
92
+ return window.requestAnimationFrame(function () {
93
+ return handleMove(e, selectionCanvasRef, activeTool, canvasOffset, selectedShape, selectionMode, canvasOffsetStartPosition, width, height, scaleRatio, setHoverMode, updateSingleShape, setCanvasOffset, setSelectedShape);
94
+ });
93
95
  };
94
96
 
95
97
  if (isInsideComponent) {
@@ -103,7 +105,7 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
103
105
  document.removeEventListener('touchmove', handleMouseMove);
104
106
  }
105
107
  };
106
- }, [isInsideComponent, selectionCanvasRef, selectedShape, selectionMode, setHoverMode, canvasOffset, canvasOffsetStartPosition, width, height, updateSingleShape, activeTool, setCanvasOffset, setSelectedShape]);
108
+ }, [isInsideComponent, selectionCanvasRef, selectedShape, selectionMode, setHoverMode, canvasOffset, canvasOffsetStartPosition, width, height, scaleRatio, updateSingleShape, activeTool, setCanvasOffset, setSelectedShape]);
107
109
  (0, _react.useEffect)(function () {
108
110
  var handleMouseUp = function handleMouseUp(e) {
109
111
  if (selectionMode.mode === _Mode.SelectionModeLib.textedition) return;
@@ -111,7 +113,7 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
111
113
  if (activeTool === _Shapes.ShapeEnum.text) {
112
114
  var _drawCanvasRef$curren;
113
115
 
114
- var cursorPosition = (0, _intersect.getCursorPosition)(e, selectionCanvasRef.current, width, height);
116
+ var cursorPosition = (0, _intersect.getCursorPosition)(e, selectionCanvasRef.current, width, height, scaleRatio);
115
117
  var drawCtx = (_drawCanvasRef$curren = drawCanvasRef.current) === null || _drawCanvasRef$curren === void 0 ? void 0 : _drawCanvasRef$curren.getContext('2d');
116
118
  if (!drawCtx) return;
117
119
 
@@ -146,7 +148,7 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
146
148
  document.removeEventListener('touchend', handleMouseUp);
147
149
  }
148
150
  };
149
- }, [isInsideComponent, selectionCanvasRef, drawCanvasRef, selectionMode, saveShapes, activeTool, addShape, defaultConf, width, height, setActiveTool, setSelectedShape, setSelectionMode]);
151
+ }, [isInsideComponent, selectionCanvasRef, drawCanvasRef, selectionMode, saveShapes, activeTool, addShape, defaultConf, width, height, scaleRatio, setActiveTool, setSelectedShape, setSelectionMode]);
150
152
  (0, _react.useEffect)(function () {
151
153
  var ref = selectionCanvasRef.current;
152
154
  if (!ref) return;
@@ -154,10 +156,10 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
154
156
 
155
157
  var handleMouseDown = function handleMouseDown(e) {
156
158
  e.preventDefault();
157
- var cursorPosition = (0, _intersect.getCursorPosition)(e, selectionCanvasRef.current, width, height);
159
+ var cursorPosition = (0, _intersect.getCursorPosition)(e, selectionCanvasRef.current, width, height, scaleRatio);
158
160
 
159
161
  if (activeTool === _Shapes.ToolEnum.selection) {
160
- var _selectShape = (0, _selection.selectShape)(shapes, cursorPosition, canvasOffset, selectedShape),
162
+ var _selectShape = (0, _selection.selectShape)(shapes, cursorPosition, scaleRatio, canvasOffset, selectedShape),
161
163
  shape = _selectShape.shape,
162
164
  mode = _selectShape.mode;
163
165
 
@@ -211,7 +213,7 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
211
213
  ref.removeEventListener('mousedown', handleMouseDown);
212
214
  ref.removeEventListener('touchstart', handleMouseDown);
213
215
  };
214
- }, [disabled, selectionCanvasRef, drawCanvasRef, selectedShape, activeTool, canvasOffset, setCanvasOffsetStartPosition, shapes, defaultConf, width, height, updateSingleShape, addShape, setActiveTool, setSelectedShape, setSelectionMode]);
216
+ }, [disabled, selectionCanvasRef, drawCanvasRef, selectedShape, activeTool, canvasOffset, setCanvasOffsetStartPosition, shapes, defaultConf, width, height, scaleRatio, updateSingleShape, addShape, setActiveTool, setSelectedShape, setSelectionMode]);
215
217
  (0, _react.useEffect)(function () {
216
218
  var ref = selectionCanvasRef.current;
217
219
  if (!ref) return;
@@ -219,7 +221,7 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
219
221
  var handleDoubleClick = function handleDoubleClick(e) {
220
222
  if (activeTool === _Shapes.ToolEnum.selection) {
221
223
  if ((selectedShape === null || selectedShape === void 0 ? void 0 : selectedShape.type) === _Shapes.ShapeEnum.text) {
222
- var cursorPosition = (0, _intersect.getCursorPosition)(e, selectionCanvasRef.current, width, height);
224
+ var cursorPosition = (0, _intersect.getCursorPosition)(e, selectionCanvasRef.current, width, height, scaleRatio);
223
225
 
224
226
  if ((0, _intersect.checkPositionIntersection)(selectedShape, cursorPosition, canvasOffset)) {
225
227
  setSelectionMode({
@@ -240,7 +242,7 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
240
242
  ref.removeEventListener('dblclick', handleDoubleClick);
241
243
  }
242
244
  };
243
- }, [isInsideComponent, selectionCanvasRef, activeTool, selectedShape, width, height, canvasOffset, setSelectionMode]);
245
+ }, [isInsideComponent, selectionCanvasRef, activeTool, selectedShape, width, height, scaleRatio, canvasOffset, setSelectionMode]);
244
246
  return {
245
247
  hoverMode: hoverMode
246
248
  };
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _fp = _interopRequireDefault(require("lodash/fp"));
11
+
12
+ var _react = require("react");
13
+
14
+ var useResizeObserver = function useResizeObserver(_ref) {
15
+ var onResized = _ref.onResized,
16
+ element = _ref.element;
17
+ (0, _react.useEffect)(function () {
18
+ var current = element.current;
19
+ if (!current) return;
20
+ var resizeObserver = new ResizeObserver(function (entries) {
21
+ var _ref2 = _fp["default"].get('0.borderBoxSize', entries) ? _fp["default"].flow(_fp["default"].get('0.borderBoxSize'), _fp["default"].castArray, _fp["default"].first, function (el) {
22
+ return {
23
+ width: _fp["default"].get('inlineSize', el),
24
+ height: _fp["default"].get('blockSize', el)
25
+ };
26
+ })(entries) : _fp["default"].get('0.contentRect', entries),
27
+ width = _ref2.width,
28
+ height = _ref2.height;
29
+
30
+ onResized(width, height);
31
+ });
32
+ resizeObserver.observe(current);
33
+ return function () {
34
+ resizeObserver.unobserve(current);
35
+ };
36
+ }, [element, onResized]);
37
+ };
38
+
39
+ var _default = useResizeObserver;
40
+ exports["default"] = _default;
@@ -24,6 +24,8 @@ var _data = require("../utils/data");
24
24
  var useShapes = function useShapes() {
25
25
  var onDataChanged = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _fp["default"].noop;
26
26
  var shapesRef = (0, _react.useRef)([]);
27
+ var onDataChangedRef = (0, _react.useRef)(onDataChanged);
28
+ onDataChangedRef.current = onDataChanged;
27
29
 
28
30
  var _useState = (0, _react.useState)(undefined),
29
31
  _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
@@ -60,23 +62,25 @@ var useShapes = function useShapes() {
60
62
  }, []);
61
63
  var addPictureShape = (0, _react.useCallback)( /*#__PURE__*/function () {
62
64
  var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(fileOrUrl) {
63
- var maxSize,
65
+ var maxWidth,
66
+ maxHeight,
64
67
  pictureShape,
65
68
  _args = arguments;
66
69
  return _regenerator["default"].wrap(function _callee$(_context) {
67
70
  while (1) {
68
71
  switch (_context.prev = _context.next) {
69
72
  case 0:
70
- maxSize = _args.length > 1 && _args[1] !== undefined ? _args[1] : 300;
71
- _context.next = 3;
72
- return (0, _data.createPicture)(fileOrUrl, maxSize);
73
+ maxWidth = _args.length > 1 && _args[1] !== undefined ? _args[1] : 300;
74
+ maxHeight = _args.length > 2 && _args[2] !== undefined ? _args[2] : 300;
75
+ _context.next = 4;
76
+ return (0, _data.createPicture)(fileOrUrl, maxWidth, maxHeight);
73
77
 
74
- case 3:
78
+ case 4:
75
79
  pictureShape = _context.sent;
76
80
  addShape(pictureShape);
77
81
  return _context.abrupt("return", pictureShape);
78
82
 
79
- case 6:
83
+ case 7:
80
84
  case "end":
81
85
  return _context.stop();
82
86
  }
@@ -202,8 +206,8 @@ var useShapes = function useShapes() {
202
206
  updateShapes(_fp["default"].set(shapeIndex, newShape, shapes));
203
207
  }, [updateShapes]);
204
208
  (0, _react.useEffect)(function () {
205
- onDataChanged();
206
- }, [onDataChanged, savedShapes]);
209
+ onDataChangedRef.current();
210
+ }, [savedShapes]);
207
211
  return {
208
212
  shapesRef: shapesRef,
209
213
  selectedShape: selectedShape,
package/dist/styles.css CHANGED
@@ -1,33 +1,32 @@
1
- body {
1
+ #react-paint-root {
2
2
  margin: 0;
3
3
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu',
4
4
  'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
5
- -webkit-font-smoothing: antialiased;
6
- -moz-osx-font-smoothing: grayscale;
7
5
  background: #F3F3F3;
6
+
8
7
  }
9
8
 
10
- .examples {
9
+ #react-paint-root .examples {
11
10
  display: flex;
12
11
  }
13
12
 
14
- .menu {
13
+ #react-paint-root .menu {
15
14
  width: 250px;
16
15
  min-width: 0;
17
16
  display: flex;
18
17
  flex-direction: column;
19
18
  }
20
19
 
21
- .menu a {
20
+ #react-paint-root .menu a {
22
21
  margin: 8px;
23
22
  padding: 4px;
24
23
  }
25
24
 
26
- .menu a.selected {
25
+ #react-paint-root .menu a.selected {
27
26
  color: green;
28
27
  }
29
28
 
30
- .currentApp {
29
+ #react-paint-root .currentApp {
31
30
  flex: 1;
32
31
  min-width: 0;
33
32
  }
@@ -41,28 +40,28 @@ body {
41
40
  .sst453j{width:100%;box-sizing:border-box;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:2px 6px;}
42
41
  .s1q5lsc2{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}
43
42
  .s1dis2j8{-webkit-flex:1;-ms-flex:1;flex:1;text-align:left;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.s1dis2j8 + .s1q5lsc2{margin-left:12px;}
44
- .s1xzg253{position:absolute;z-index:3;background:var(--bg-color);bottom:100%;box-shadow:0 3px 8px rgb(0 0 0 / 24%);padding:4px;border-radius:8px;white-space:nowrap;}.s1xzg253[data-alignment='left']{left:0;margin:4px;}.s1xzg253[data-alignment='center']{left:50%;-webkit-transform:translate3d(-50%,0px,0px);-ms-transform:translate3d(-50%,0px,0px);transform:translate3d(-50%,0px,0px);margin:4px 0px;}.s1xzg253[data-alignment='right']{right:0;margin:4px;}
43
+ .s1xzg253{position:absolute;z-index:3;background:var(--bg-color);bottom:100%;box-shadow:0 3px 8px rgb(0 0 0 / 24%);padding:8px;border-radius:8px;white-space:nowrap;}.s1xzg253[data-alignment='left']{left:0;margin:4px;}.s1xzg253[data-alignment='center']{left:50%;-webkit-transform:translate3d(-50%,0px,0px);-ms-transform:translate3d(-50%,0px,0px);transform:translate3d(-50%,0px,0px);margin:4px 0px;}.s1xzg253[data-alignment='right']{right:0;margin:4px;}
45
44
  .s17qj3jh{margin-bottom:8px;margin-top:4px;font-size:18px;}
46
45
  .su3a8bs{display:inline-block;background:var(--bg-color);box-sizing:border-box;overflow-y:auto;min-width:200px;}
47
- .szboplp{border:3px solid transparent;padding:4px 0px;position:relative;background:var(--bg-color);box-sizing:border-box;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}.szboplp[data-is-over='1']{border:3px dotted var(--btn-hover);}.szboplp[data-is-dragging='1']{opacity:0.4;}.szboplp[data-selected='1']{color:var(--text-color-selected);border:3px solid var(--bg-color-selected);}.szboplp[data-selected='0'][data-disabled='0']:hover{background:var(--btn-hover);}.szboplp[data-disabled='1']{opacity:0.25;cursor:default;}.szboplp[data-disabled='0']{cursor:move;}.szboplp > span{height:20px;}.szboplp > span > svg{fill:#8a8a8a;width:20px;height:20px;padding:0 16px;}
46
+ .szboplp{border:3px solid transparent;padding:4px 0px;position:relative;background:var(--bg-color);box-sizing:border-box;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}.szboplp[data-is-over='1']{border:3px dotted var(--btn-hover);}.szboplp[data-is-dragging='1']{opacity:0.4;}.szboplp[data-selected='1']{color:var(--text-color-selected);background:var(--bg-color-selected);}.szboplp[data-selected='0'][data-disabled='0']:hover{background:var(--btn-hover);}.szboplp[data-disabled='1']{opacity:0.25;cursor:default;}.szboplp[data-disabled='0']{cursor:move;}.szboplp > span{height:20px;}.szboplp > span > svg{fill:#8a8a8a;width:20px;height:20px;padding:0 16px;}
48
47
  .sff5xt[data-visible='false']{opacity:0.2;}
49
48
  .sj3bift[data-locked='false']{opacity:0.2;}
50
49
  .s10ip0a4[data-grid='false'] svg{opacity:0.2;}
51
50
  .s1j9uq9o{-webkit-flex:1;-ms-flex:1;flex:1;}
52
51
  .s156ddbb{bottom:0;left:unset;top:unset;max-height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}
53
- .s11gt4hl{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;overflow-y:auto;}.s11gt4hl hr{opacity:0.6;width:100%;border:none;border-top:1px solid var(--text-color);}
52
+ .s11gt4hl{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;overflow-y:auto;}
54
53
  .s13cxqhq{opacity:0.6;text-align:center;padding:12px 0px;}
55
54
  .s1bvz4xj{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;bottom:unset;top:100%;}.s1bvz4xj[data-vertical='1']{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}
56
55
  .siejlch{position:relative;display:inline-block;}
57
56
  .s1uphjfh{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;bottom:unset;top:100%;}.s1uphjfh[data-vertical='1']{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}.s1uphjfh hr{width:100%;border:none;border-top:1px solid var(--text-color);opacity:0.6;}
58
57
  .s1e5a6k5{position:relative;display:inline-block;}
59
58
  .s1c8tp02{z-index:3;position:absolute;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;left:0;right:0;bottom:0;top:0;}
60
- .svkxpz4{display:grid;background:var(--bg-color);box-shadow:0 3px 8px rgb(0 0 0 / 24%);padding:4px;border-radius:8px;white-space:nowrap;position:relative;}
59
+ .svkxpz4{display:grid;background:var(--bg-color);box-shadow:0 3px 8px rgb(0 0 0 / 24%);padding:12px;border-radius:8px;white-space:nowrap;position:relative;}
61
60
  .s1s9jyyg{position:absolute;left:0;top:0;right:0;bottom:0;background:#00000073;}
62
61
  .s95bkm9 form{grid-template-columns:3fr 1fr 1fr;}.s95bkm9 form input{color:var(--text-color);border:2px solid var(--text-color);outline:none;}
63
62
  .so6hnjf{-webkit-flex:1;-ms-flex:1;flex:1;position:relative;height:100%;text-align:center;max-height:72px;}
64
- .s1c1dllr{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;max-height:36px;background:var(--bg-color);}
65
- .s1g032mh{display:inline-block;text-align:left;background:var(--bg-color);margin-right:36px;text-align:right;}.s1g032mh + *{position:absolute;right:0;bottom:36px;}
63
+ .s1c1dllr{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;max-height:36px;background:var(--bg-color);border-bottom:1px solid var(--border-color);box-sizing:border-box;}
64
+ .s1g032mh{display:inline-block;text-align:left;margin-right:36px;text-align:right;}.s1g032mh + *{position:absolute;right:0;bottom:36px;}
66
65
  .s4owjrv{grid-template-columns:1fr 1fr 1fr;}
67
66
  .snh2jyk{width:24px;height:24px;box-sizing:border-box;border-radius:50%;border:1px solid gray;background:var(--snh2jyk-0);background-repeat:repeat;background-size:16px;}
68
67
  .sfm1cqx{width:36px;height:36px;box-sizing:border-box;border-radius:50%;color:var(--sfm1cqx-0);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:baseline;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;font-size:48px;line-height:36px;position:relative;bottom:6px;font-weight:bold;}
@@ -77,12 +76,12 @@ body {
77
76
  .s1xxj4yl{position:absolute;left:0;top:50%;-webkit-transform:translate3d(-25%,-50%,0px);-ms-transform:translate3d(-25%,-50%,0px);transform:translate3d(-25%,-50%,0px);display:inline-block;width:0;height:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:15px solid black;}
78
77
  .sbd6jc8{position:absolute;right:0;top:50%;-webkit-transform:translate3d(25%,-50%,0px);-ms-transform:translate3d(25%,-50%,0px);transform:translate3d(25%,-50%,0px);display:inline-block;width:0;height:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:15px solid black;}
79
78
  .scawaat{position:relative;display:inline-block;width:60px;height:2px;background:black;vertical-align:middle;}.scawaat[data-type='0'] .s1xxj4yl,.scawaat[data-type='1'] .s1xxj4yl{display:none;}.scawaat[data-type='0'] .sbd6jc8,.scawaat[data-type='2'] .sbd6jc8{display:none;}
80
- .s16z54di{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;background:var(--bg-color);position:relative;}
79
+ .s16z54di{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;background:var(--bg-color);position:relative;height:36px;border-top:1px solid var(--border-color);box-sizing:border-box;}
81
80
  .sa7lzh9{-webkit-flex:1;-ms-flex:1;flex:1;}
82
81
  .s1xssqat{display:inline-block;padding:12px 48px;margin:4px;max-width:calc(100% - 24px);overflow-wrap:break-word;box-sizing:border-box;-webkit-transition:all 500ms;transition:all 500ms;opacity:0;-webkit-transform:translate3d(0px,40px,0px);-ms-transform:translate3d(0px,40px,0px);transform:translate3d(0px,40px,0px);}.s1xssqat[data-type='0']{background:#646464;color:white;}.s1xssqat[data-type='1']{background:#c3a200;color:black;}.s1xssqat[data-type='2']{background:#911717;color:white;}.s1xssqat[data-type='3']{background:#088900;color:white;}.s1xssqat[data-is-shown='1']{opacity:1;-webkit-transform:translate3d(0px,0px,0px);-ms-transform:translate3d(0px,0px,0px);transform:translate3d(0px,0px,0px);}.s1xssqat[data-is-shown='0']{opacity:0;-webkit-transform:translate3d(0px,40px,0px);-ms-transform:translate3d(0px,40px,0px);transform:translate3d(0px,40px,0px);}
83
82
  .s1bgtt22{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse;position:absolute;z-index:4;bottom:0;left:0;right:0;height:0px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}
84
83
  .s9j48u3{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;position:absolute;z-index:2;top:0;bottom:0;left:0;right:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background:#00000050;-webkit-transition:opacity 300ms linear;transition:opacity 300ms linear;opacity:0;}.s9j48u3[data-loading='visible']{opacity:1;}
85
- .s4auclc{width:40px;height:40px;position:relative;-webkit-transform:rotate(10deg);-ms-transform:rotate(10deg);transform:rotate(10deg);-webkit-animation:react-paint-editor-rotation-s4auclc 1s infinite;animation:react-paint-editor-rotation-s4auclc 1s infinite;}@-webkit-keyframes react-paint-editor-rotation-s4auclc{from{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}to{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@keyframes react-paint-editor-rotation-s4auclc{from{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}to{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}
84
+ .s4auclc{width:40px;height:40px;position:relative;-webkit-transform:rotate(10deg);-ms-transform:rotate(10deg);transform:rotate(10deg);-webkit-animation:react-paint-rotation-s4auclc 1s infinite;animation:react-paint-rotation-s4auclc 1s infinite;}@-webkit-keyframes react-paint-rotation-s4auclc{from{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}to{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@keyframes react-paint-rotation-s4auclc{from{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);}to{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}
86
85
  .s1l3fbq{border-radius:50%;position:absolute;width:15px;height:15px;}.s1l3fbq:nth-child(1){left:0;background-color:#5c6bc0;}.s1l3fbq:nth-child(2){right:0;background-color:#8bc34a;}.s1l3fbq:nth-child(3){bottom:0;background-color:#ffb74d;}.s1l3fbq:nth-child(4){bottom:0;right:0;background-color:#f44336;}
87
- .s1v9piyg{--bg-color:white;--text-color:#364181;--btn-hover:#afd8d8;--bg-color-selected:#364181;--text-color-selected:white;--shrinkedcanvas-bg-color:white;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;color:var(--text-color);position:relative;overflow:hidden;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}.s1v9piyg[data-grow='false']{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;max-width:var(--s1v9piyg-0);}.s1v9piyg[data-shrink='false']{min-width:var(--s1v9piyg-1);}
86
+ .s1v9piyg{--bg-color:white;--text-color:#364181;--btn-hover:#afd8d8;--bg-color-selected:#364181;--text-color-selected:white;--shrinkedcanvas-bg-color:white;--border-color:#36418129;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;color:var(--text-color);position:relative;overflow:hidden;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}.s1v9piyg hr{width:100%;border:none;border-top:1px solid var(--border-color);}.s1v9piyg[data-grow='false']{max-width:var(--s1v9piyg-0);}.s1v9piyg[data-shrink='false']{min-width:var(--s1v9piyg-1);}
88
87
  .s6o5tmu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;position:relative;max-width:100%;z-index:1;aspect-ratio:var(--s6o5tmu-2);}.layoutPanelOpened .s6o5tmu{background:var(--shrinkedcanvas-bg-color);}.s6o5tmu[data-grow='true']{width:100%;}.s6o5tmu[data-grow='false']{width:var(--s6o5tmu-1);}