@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
@@ -106,11 +106,11 @@ var ToolbarGroup = function ToolbarGroup(_ref) {
106
106
 
107
107
  var isActive = _fp["default"].includes(activeTool, group === null || group === void 0 ? void 0 : group.tools);
108
108
 
109
- var groupIcon = (_ref2 = localActiveTool ? (0, _style.getShapePicture)(localActiveTool) : group.img) !== null && _ref2 !== void 0 ? _ref2 : group.title;
109
+ var groupIcon = (_ref2 = localActiveTool ? (0, _style.getShapePicture)(localActiveTool) : group.tools && group.tools[0] && (0, _style.getShapePicture)(group.tools[0])) !== null && _ref2 !== void 0 ? _ref2 : group.title;
110
110
 
111
111
  var openPanel = function openPanel() {
112
- if (localActiveTool) setActiveToolFromProps(localActiveTool);
113
- setIsOpen(true);
112
+ if (localActiveTool) setActiveToolFromProps(localActiveTool);else group.tools && group.tools[0] && setActiveTool(group.tools[0]);
113
+ setIsOpen(true); // group.tools && group.tools[0] && setActiveTool(group.tools[0])
114
114
  };
115
115
 
116
116
  return /*#__PURE__*/_react["default"].createElement(StyledRelative, null, /*#__PURE__*/_react["default"].createElement(_Button["default"], {
@@ -3,9 +3,13 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.SELECTION_ROTATED_ANCHOR_POSITION = exports.SELECTION_RESIZE_ANCHOR_POSITIONS = exports.SELECTION_PADDING = exports.SELECTION_ANCHOR_SIZE = void 0;
7
- var SELECTION_PADDING = 0;
8
- exports.SELECTION_PADDING = SELECTION_PADDING;
6
+ exports.SELECTION_ROTATED_ANCHOR_POSITION = exports.SELECTION_RESIZE_ANCHOR_POSITIONS = exports.SELECTION_DEFAULT_WIDTH = exports.SELECTION_DEFAULT_PADDING = exports.SELECTION_DEFAULT_COLOR = exports.SELECTION_ANCHOR_SIZE = void 0;
7
+ var SELECTION_DEFAULT_PADDING = 0;
8
+ exports.SELECTION_DEFAULT_PADDING = SELECTION_DEFAULT_PADDING;
9
+ var SELECTION_DEFAULT_WIDTH = 2;
10
+ exports.SELECTION_DEFAULT_WIDTH = SELECTION_DEFAULT_WIDTH;
11
+ var SELECTION_DEFAULT_COLOR = 'blue';
12
+ exports.SELECTION_DEFAULT_COLOR = SELECTION_DEFAULT_COLOR;
9
13
  var SELECTION_ANCHOR_SIZE = 14;
10
14
  exports.SELECTION_ANCHOR_SIZE = SELECTION_ANCHOR_SIZE;
11
15
  var SELECTION_ROTATED_ANCHOR_POSITION = 16;
@@ -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, selectionPadding) {
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, selectionPadding, scaleRatio, true) || {
43
41
  mode: _Mode.SelectionModeLib["default"]
44
42
  };
45
43
  setHoverMode(positionIntersection);
@@ -49,7 +47,7 @@ var handleMove = function handleMove(e, canvasRef, activeTool, canvasOffset, sel
49
47
  var ctx = (_canvasRef$current = canvasRef.current) === null || _canvasRef$current === void 0 ? void 0 : _canvasRef$current.getContext('2d');
50
48
  if (!ctx) return;
51
49
 
52
- var _newShape = (0, _transform.transformShape)(ctx, selectedShape, cursorPosition, canvasOffset, selectionMode);
50
+ var _newShape = (0, _transform.transformShape)(ctx, selectedShape, cursorPosition, canvasOffset, selectionMode, selectionPadding);
53
51
 
54
52
  updateSingleShape(_newShape);
55
53
  setSelectedShape(_newShape);
@@ -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,
@@ -78,7 +75,11 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
78
75
  updateSingleShape = _ref.updateSingleShape,
79
76
  canvasOffset = _ref.canvasOffset,
80
77
  saveShapes = _ref.saveShapes,
81
- setSelectionMode = _ref.setSelectionMode;
78
+ setSelectionMode = _ref.setSelectionMode,
79
+ selectionPadding = _ref.selectionPadding;
80
+ var width = canvasSize.width,
81
+ height = canvasSize.height,
82
+ scaleRatio = canvasSize.scaleRatio;
82
83
 
83
84
  var _useState = (0, _react.useState)({
84
85
  mode: _Mode.SelectionModeLib["default"]
@@ -89,7 +90,9 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
89
90
 
90
91
  (0, _react.useEffect)(function () {
91
92
  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);
93
+ return window.requestAnimationFrame(function () {
94
+ return handleMove(e, selectionCanvasRef, activeTool, canvasOffset, selectedShape, selectionMode, canvasOffsetStartPosition, width, height, scaleRatio, setHoverMode, updateSingleShape, setCanvasOffset, setSelectedShape, selectionPadding);
95
+ });
93
96
  };
94
97
 
95
98
  if (isInsideComponent) {
@@ -103,7 +106,7 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
103
106
  document.removeEventListener('touchmove', handleMouseMove);
104
107
  }
105
108
  };
106
- }, [isInsideComponent, selectionCanvasRef, selectedShape, selectionMode, setHoverMode, canvasOffset, canvasOffsetStartPosition, width, height, updateSingleShape, activeTool, setCanvasOffset, setSelectedShape]);
109
+ }, [isInsideComponent, selectionCanvasRef, selectedShape, selectionMode, setHoverMode, canvasOffset, canvasOffsetStartPosition, width, height, scaleRatio, updateSingleShape, activeTool, setCanvasOffset, setSelectedShape, selectionPadding]);
107
110
  (0, _react.useEffect)(function () {
108
111
  var handleMouseUp = function handleMouseUp(e) {
109
112
  if (selectionMode.mode === _Mode.SelectionModeLib.textedition) return;
@@ -111,7 +114,7 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
111
114
  if (activeTool === _Shapes.ShapeEnum.text) {
112
115
  var _drawCanvasRef$curren;
113
116
 
114
- var cursorPosition = (0, _intersect.getCursorPosition)(e, selectionCanvasRef.current, width, height);
117
+ var cursorPosition = (0, _intersect.getCursorPosition)(e, selectionCanvasRef.current, width, height, scaleRatio);
115
118
  var drawCtx = (_drawCanvasRef$curren = drawCanvasRef.current) === null || _drawCanvasRef$curren === void 0 ? void 0 : _drawCanvasRef$curren.getContext('2d');
116
119
  if (!drawCtx) return;
117
120
 
@@ -146,7 +149,7 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
146
149
  document.removeEventListener('touchend', handleMouseUp);
147
150
  }
148
151
  };
149
- }, [isInsideComponent, selectionCanvasRef, drawCanvasRef, selectionMode, saveShapes, activeTool, addShape, defaultConf, width, height, setActiveTool, setSelectedShape, setSelectionMode]);
152
+ }, [isInsideComponent, selectionCanvasRef, drawCanvasRef, selectionMode, saveShapes, activeTool, addShape, defaultConf, width, height, scaleRatio, setActiveTool, setSelectedShape, setSelectionMode]);
150
153
  (0, _react.useEffect)(function () {
151
154
  var ref = selectionCanvasRef.current;
152
155
  if (!ref) return;
@@ -154,10 +157,10 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
154
157
 
155
158
  var handleMouseDown = function handleMouseDown(e) {
156
159
  e.preventDefault();
157
- var cursorPosition = (0, _intersect.getCursorPosition)(e, selectionCanvasRef.current, width, height);
160
+ var cursorPosition = (0, _intersect.getCursorPosition)(e, selectionCanvasRef.current, width, height, scaleRatio);
158
161
 
159
162
  if (activeTool === _Shapes.ToolEnum.selection) {
160
- var _selectShape = (0, _selection.selectShape)(shapes, cursorPosition, canvasOffset, selectedShape),
163
+ var _selectShape = (0, _selection.selectShape)(shapes, cursorPosition, scaleRatio, canvasOffset, selectedShape, selectionPadding),
161
164
  shape = _selectShape.shape,
162
165
  mode = _selectShape.mode;
163
166
 
@@ -211,7 +214,7 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
211
214
  ref.removeEventListener('mousedown', handleMouseDown);
212
215
  ref.removeEventListener('touchstart', handleMouseDown);
213
216
  };
214
- }, [disabled, selectionCanvasRef, drawCanvasRef, selectedShape, activeTool, canvasOffset, setCanvasOffsetStartPosition, shapes, defaultConf, width, height, updateSingleShape, addShape, setActiveTool, setSelectedShape, setSelectionMode]);
217
+ }, [disabled, selectionCanvasRef, drawCanvasRef, selectedShape, activeTool, canvasOffset, setCanvasOffsetStartPosition, shapes, defaultConf, width, height, scaleRatio, updateSingleShape, addShape, setActiveTool, setSelectedShape, setSelectionMode, selectionPadding]);
215
218
  (0, _react.useEffect)(function () {
216
219
  var ref = selectionCanvasRef.current;
217
220
  if (!ref) return;
@@ -219,9 +222,9 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
219
222
  var handleDoubleClick = function handleDoubleClick(e) {
220
223
  if (activeTool === _Shapes.ToolEnum.selection) {
221
224
  if ((selectedShape === null || selectedShape === void 0 ? void 0 : selectedShape.type) === _Shapes.ShapeEnum.text) {
222
- var cursorPosition = (0, _intersect.getCursorPosition)(e, selectionCanvasRef.current, width, height);
225
+ var cursorPosition = (0, _intersect.getCursorPosition)(e, selectionCanvasRef.current, width, height, scaleRatio);
223
226
 
224
- if ((0, _intersect.checkPositionIntersection)(selectedShape, cursorPosition, canvasOffset)) {
227
+ if ((0, _intersect.checkPositionIntersection)(selectedShape, cursorPosition, canvasOffset, selectionPadding)) {
225
228
  setSelectionMode({
226
229
  mode: _Mode.SelectionModeLib.textedition,
227
230
  defaultValue: selectedShape.value
@@ -240,7 +243,7 @@ var useDrawableCanvas = function useDrawableCanvas(_ref) {
240
243
  ref.removeEventListener('dblclick', handleDoubleClick);
241
244
  }
242
245
  };
243
- }, [isInsideComponent, selectionCanvasRef, activeTool, selectedShape, width, height, canvasOffset, setSelectionMode]);
246
+ }, [isInsideComponent, selectionCanvasRef, activeTool, selectedShape, width, height, scaleRatio, canvasOffset, setSelectionMode, selectionPadding]);
244
247
  return {
245
248
  hoverMode: hoverMode
246
249
  };
@@ -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,26 @@ 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);
81
+ saveShapes();
77
82
  return _context.abrupt("return", pictureShape);
78
83
 
79
- case 6:
84
+ case 8:
80
85
  case "end":
81
86
  return _context.stop();
82
87
  }
@@ -87,7 +92,7 @@ var useShapes = function useShapes() {
87
92
  return function (_x) {
88
93
  return _ref.apply(this, arguments);
89
94
  };
90
- }(), [addShape]);
95
+ }(), [addShape, saveShapes]);
91
96
  var updateShape = (0, _react.useCallback)(function (updatedShape) {
92
97
  var withSave = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
93
98
  shapesRef.current = shapesRef.current.map(function (marker) {
@@ -202,8 +207,8 @@ var useShapes = function useShapes() {
202
207
  updateShapes(_fp["default"].set(shapeIndex, newShape, shapes));
203
208
  }, [updateShapes]);
204
209
  (0, _react.useEffect)(function () {
205
- onDataChanged();
206
- }, [onDataChanged, savedShapes]);
210
+ onDataChangedRef.current();
211
+ }, [savedShapes]);
207
212
  return {
208
213
  shapesRef: shapesRef,
209
214
  selectedShape: selectedShape,
package/dist/styles.css CHANGED
@@ -1,88 +1,85 @@
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
  }
34
33
 
35
- .s1unz6yq{position:absolute;display:inline-block;outline:none;left:0px;top:0px;-webkit-transform-origin:left top;-ms-transform-origin:left top;transform-origin:left top;-webkit-transform:var(--s1unz6yq-0);-ms-transform:var(--s1unz6yq-0);transform:var(--s1unz6yq-0);color:var(--s1unz6yq-1);font-size:var(--s1unz6yq-2);line-height:var(--s1unz6yq-2);font-family:var(--s1unz6yq-4);}
34
+ .s1unz6yq{position:absolute;display:inline-block;outline:none;left:0px;top:0px;-webkit-transform-origin:left top;-ms-transform-origin:left top;transform-origin:left top;box-sizing:border-box;-webkit-transform:var(--s1unz6yq-0);-ms-transform:var(--s1unz6yq-0);transform:var(--s1unz6yq-0);color:var(--s1unz6yq-1);padding:var(--s1unz6yq-2);font-size:var(--s1unz6yq-3);line-height:var(--s1unz6yq-3);font-family:var(--s1unz6yq-5);}
36
35
  .s9czb9p{-webkit-flex:1;-ms-flex:1;flex:1;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;}
37
- .s1538eht{position:relative;background-color:white;background-repeat:repeat;background-size:16px;overflow:hidden;}.s1538eht[data-grid='true']{background-image:url("data:image/svg+xml,%3Csvg%20id%3D%22svg%22%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20width%3D%22400%22%20height%3D%22400%22%20viewBox%3D%220%2C%200%2C%20400%2C400%22%3E%3Cg%20id%3D%22svgg%22%3E%3Cpath%20id%3D%22path0%22%20d%3D%22M204.800%2094.600%20C%20204.800%20188.933%2C204.802%20189.200%2C205.600%20189.200%20C%20206.248%20189.200%2C206.400%20189.467%2C206.400%20190.600%20C%20206.400%20191.733%2C206.552%20192.000%2C207.200%20192.000%20C%20207.733%20192.000%2C208.000%20192.267%2C208.000%20192.800%20C%20208.000%20193.244%2C208.267%20193.600%2C208.600%20193.600%20C%20208.933%20193.600%2C209.200%20193.956%2C209.200%20194.400%20C%20209.200%20195.067%2C209.467%20195.200%2C210.800%20195.200%20C%20212.133%20195.200%2C212.400%20195.333%2C212.400%20196.000%20C%20212.400%20196.798%2C212.667%20196.800%2C306.200%20196.800%20L%20400.000%20196.800%20400.000%2098.400%20L%20400.000%200.000%20302.400%200.000%20L%20204.800%200.000%20204.800%2094.600%20M0.000%20302.400%20L%200.000%20400.000%2098.400%20400.000%20L%20196.800%20400.000%20196.800%20306.200%20C%20196.800%20212.667%2C196.798%20212.400%2C196.000%20212.400%20C%20195.333%20212.400%2C195.200%20212.133%2C195.200%20210.800%20C%20195.200%20209.467%2C195.067%20209.200%2C194.400%20209.200%20C%20193.956%20209.200%2C193.600%20208.933%2C193.600%20208.600%20C%20193.600%20208.267%2C193.244%20208.000%2C192.800%20208.000%20C%20192.267%20208.000%2C192.000%20207.733%2C192.000%20207.200%20C%20192.000%20206.552%2C191.733%20206.400%2C190.600%20206.400%20C%20189.467%20206.400%2C189.200%20206.248%2C189.200%20205.600%20C%20189.200%20204.802%2C188.933%20204.800%2C94.600%20204.800%20L%200.000%20204.800%200.000%20302.400%20%22%20stroke%3D%22none%22%20fill%3D%22%23fcfcfc%22%20fill-rule%3D%22evenodd%22%3E%3C%2Fpath%3E%3Cpath%20id%3D%22path1%22%20d%3D%22M0.000%20100.000%20L%200.000%20200.000%2096.800%20200.000%20C%20193.333%20200.000%2C193.600%20199.998%2C193.600%20199.200%20C%20193.600%20198.533%2C193.867%20198.400%2C195.200%20198.400%20C%20196.533%20198.400%2C196.800%20198.267%2C196.800%20197.600%20C%20196.800%20197.067%2C197.067%20196.800%2C197.600%20196.800%20C%20198.267%20196.800%2C198.400%20196.533%2C198.400%20195.200%20C%20198.400%20193.867%2C198.533%20193.600%2C199.200%20193.600%20C%20199.998%20193.600%2C200.000%20193.333%2C200.000%2096.800%20L%20200.000%200.000%20100.000%200.000%20L%200.000%200.000%200.000%20100.000%20M208.000%20202.400%20C%20208.000%20203.067%2C207.733%20203.200%2C206.400%20203.200%20C%20205.067%20203.200%2C204.800%20203.333%2C204.800%20204.000%20C%20204.800%20204.533%2C204.533%20204.800%2C204.000%20204.800%20C%20203.333%20204.800%2C203.200%20205.067%2C203.200%20206.400%20C%20203.200%20207.733%2C203.067%20208.000%2C202.400%20208.000%20C%20201.602%20208.000%2C201.600%20208.267%2C201.600%20304.000%20L%20201.600%20400.000%20300.800%20400.000%20L%20400.000%20400.000%20400.000%20300.800%20L%20400.000%20201.600%20304.000%20201.600%20C%20208.267%20201.600%2C208.000%20201.602%2C208.000%20202.400%20%22%20stroke%3D%22none%22%20fill%3D%22%23e4e4e4%22%20fill-rule%3D%22evenodd%22%3E%3C%2Fpath%3E%3Cpath%20id%3D%22path2%22%20d%3D%22%22%20stroke%3D%22none%22%20fill%3D%22%23f4100f0%22%20fill-rule%3D%22evenodd%22%3E%3C%2Fpath%3E%3Cpath%20id%3D%22path3%22%20d%3D%22%22%20stroke%3D%22none%22%20fill%3D%22%23f4100f0%22%20fill-rule%3D%22evenodd%22%3E%3C%2Fpath%3E%3Cpath%20id%3D%22path4%22%20d%3D%22%22%20stroke%3D%22none%22%20fill%3D%22%23f4100f0%22%20fill-rule%3D%22evenodd%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3C%2Fsvg%3E");}.s1538eht[data-grow='true']{width:100%;height:100%;}
38
- .s101qxdc{position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;max-width:100%;touch-action:none;display:block;}.s101qxdc[data-grow='true']{width:100%;}
39
- .sa4oq48{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;max-width:100%;touch-action:none;display:block;cursor:var(--sa4oq48-0);}.sa4oq48[data-grow='true']{width:100%;}
40
- .sq3bzv4{min-width:32px;height:32px;font-size:14px;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;box-sizing:border-box;-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;background:none;border:none;cursor:pointer;border-radius:8px;color:var(--text-color);margin:2px 4px;padding:0;}.sq3bzv4[data-selected='1']{color:var(--text-color-selected);background:var(--bg-color-selected);}.sq3bzv4[data-hidden='1']{visibility:hidden;}.sq3bzv4[data-disabled='1']{opacity:0.25;cursor:default;}.sq3bzv4[data-selected='0'][data-disabled='0']:hover{background:var(--btn-hover);}.sq3bzv4[data-disabled='0']{cursor:pointer;}.sq3bzv4 svg{fill:currentColor;width:20px;height:20px;}.sq3bzv4 input{position:absolute;visibility:hidden;}
36
+ .s1538eht{position:relative;background-color:var(--canvas-bg);background-repeat:repeat;background-size:16px;overflow:hidden;display:grid;}.s1538eht[data-grid='true']{background-image:url("data:image/svg+xml,%3Csvg%20id%3D%22svg%22%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20width%3D%22400%22%20height%3D%22400%22%20viewBox%3D%220%2C%200%2C%20400%2C400%22%3E%3Cg%20id%3D%22svgg%22%3E%3Cpath%20id%3D%22path0%22%20d%3D%22M204.800%2094.600%20C%20204.800%20188.933%2C204.802%20189.200%2C205.600%20189.200%20C%20206.248%20189.200%2C206.400%20189.467%2C206.400%20190.600%20C%20206.400%20191.733%2C206.552%20192.000%2C207.200%20192.000%20C%20207.733%20192.000%2C208.000%20192.267%2C208.000%20192.800%20C%20208.000%20193.244%2C208.267%20193.600%2C208.600%20193.600%20C%20208.933%20193.600%2C209.200%20193.956%2C209.200%20194.400%20C%20209.200%20195.067%2C209.467%20195.200%2C210.800%20195.200%20C%20212.133%20195.200%2C212.400%20195.333%2C212.400%20196.000%20C%20212.400%20196.798%2C212.667%20196.800%2C306.200%20196.800%20L%20400.000%20196.800%20400.000%2098.400%20L%20400.000%200.000%20302.400%200.000%20L%20204.800%200.000%20204.800%2094.600%20M0.000%20302.400%20L%200.000%20400.000%2098.400%20400.000%20L%20196.800%20400.000%20196.800%20306.200%20C%20196.800%20212.667%2C196.798%20212.400%2C196.000%20212.400%20C%20195.333%20212.400%2C195.200%20212.133%2C195.200%20210.800%20C%20195.200%20209.467%2C195.067%20209.200%2C194.400%20209.200%20C%20193.956%20209.200%2C193.600%20208.933%2C193.600%20208.600%20C%20193.600%20208.267%2C193.244%20208.000%2C192.800%20208.000%20C%20192.267%20208.000%2C192.000%20207.733%2C192.000%20207.200%20C%20192.000%20206.552%2C191.733%20206.400%2C190.600%20206.400%20C%20189.467%20206.400%2C189.200%20206.248%2C189.200%20205.600%20C%20189.200%20204.802%2C188.933%20204.800%2C94.600%20204.800%20L%200.000%20204.800%200.000%20302.400%20%22%20stroke%3D%22none%22%20fill%3D%22%23fcfcfc%22%20fill-rule%3D%22evenodd%22%3E%3C%2Fpath%3E%3Cpath%20id%3D%22path1%22%20d%3D%22M0.000%20100.000%20L%200.000%20200.000%2096.800%20200.000%20C%20193.333%20200.000%2C193.600%20199.998%2C193.600%20199.200%20C%20193.600%20198.533%2C193.867%20198.400%2C195.200%20198.400%20C%20196.533%20198.400%2C196.800%20198.267%2C196.800%20197.600%20C%20196.800%20197.067%2C197.067%20196.800%2C197.600%20196.800%20C%20198.267%20196.800%2C198.400%20196.533%2C198.400%20195.200%20C%20198.400%20193.867%2C198.533%20193.600%2C199.200%20193.600%20C%20199.998%20193.600%2C200.000%20193.333%2C200.000%2096.800%20L%20200.000%200.000%20100.000%200.000%20L%200.000%200.000%200.000%20100.000%20M208.000%20202.400%20C%20208.000%20203.067%2C207.733%20203.200%2C206.400%20203.200%20C%20205.067%20203.200%2C204.800%20203.333%2C204.800%20204.000%20C%20204.800%20204.533%2C204.533%20204.800%2C204.000%20204.800%20C%20203.333%20204.800%2C203.200%20205.067%2C203.200%20206.400%20C%20203.200%20207.733%2C203.067%20208.000%2C202.400%20208.000%20C%20201.602%20208.000%2C201.600%20208.267%2C201.600%20304.000%20L%20201.600%20400.000%20300.800%20400.000%20L%20400.000%20400.000%20400.000%20300.800%20L%20400.000%20201.600%20304.000%20201.600%20C%20208.267%20201.600%2C208.000%20201.602%2C208.000%20202.400%20%22%20stroke%3D%22none%22%20fill%3D%22%23e4e4e4%22%20fill-rule%3D%22evenodd%22%3E%3C%2Fpath%3E%3Cpath%20id%3D%22path2%22%20d%3D%22%22%20stroke%3D%22none%22%20fill%3D%22%23f4100f0%22%20fill-rule%3D%22evenodd%22%3E%3C%2Fpath%3E%3Cpath%20id%3D%22path3%22%20d%3D%22%22%20stroke%3D%22none%22%20fill%3D%22%23f4100f0%22%20fill-rule%3D%22evenodd%22%3E%3C%2Fpath%3E%3Cpath%20id%3D%22path4%22%20d%3D%22%22%20stroke%3D%22none%22%20fill%3D%22%23f4100f0%22%20fill-rule%3D%22evenodd%22%3E%3C%2Fpath%3E%3C%2Fg%3E%3C%2Fsvg%3E");}.s1538eht[data-grow='true']{width:100%;height:100%;}
37
+ .s101qxdc{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;max-width:100%;touch-action:none;display:block;grid-area:1 / 1;}.s101qxdc[data-grow='true']{width:100%;}
38
+ .sa4oq48{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;max-width:100%;touch-action:none;display:block;grid-area:1 / 1;cursor:var(--sa4oq48-0);}.sa4oq48[data-grow='true']{width:100%;}
39
+ .sq3bzv4{min-width:32px;height:32px;font-size:14px;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle;box-sizing:border-box;-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;background:none;border:none;cursor:pointer;border-radius:var(--font-radius);color:var(--font-color);margin:2px 4px;padding:0;}.sq3bzv4[data-selected='1']{color:var(--font-selected-color);background:var(--font-selected-bg);}.sq3bzv4[data-hidden='1']{visibility:hidden;}.sq3bzv4[data-disabled='1']{cursor:default;color:var(--font-disabled-color);background:var(--font-disabled-bg);}.sq3bzv4[data-selected='0'][data-disabled='0']{background:var(--font-bg);color:var(--font-color);}.sq3bzv4[data-selected='0'][data-disabled='0']:hover{color:var(--font-hover-color);background:var(--font-hover-bg);}.sq3bzv4[data-disabled='0']{cursor:pointer;}.sq3bzv4 svg{fill:currentColor;width:20px;height:20px;}.sq3bzv4 input{position:absolute;visibility:hidden;}
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(--toolbar-bg);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
- .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;}
45
+ .su3a8bs{display:inline-block;background:var(--toolbar-bg);box-sizing:border-box;overflow-y:auto;min-width:200px;}
46
+ .szboplp{border:3px solid transparent;padding:4px 0px;position:relative;background:var(--toolbar-bg);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(--font-hover-bg);}.szboplp[data-is-dragging='1']{opacity:0.4;}.szboplp[data-selected='1']{color:var(--font-selected-color);background:var(--font-selected-bg);}.szboplp[data-selected='0'][data-disabled='0']{background:var(--font-bg);color:var(--font-color);}.szboplp[data-selected='0'][data-disabled='0']:hover{color:var(--font-hover-color);background:var(--font-hover-bg);}.szboplp[data-disabled='1']{cursor:default;color:var(--font-disabled-color);background:var(--font-disabled-bg);}.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
- .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;}
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;}
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(--toolbar-bg);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
- .s95bkm9 form{grid-template-columns:3fr 1fr 1fr;}.s95bkm9 form input{color:var(--text-color);border:2px solid var(--text-color);outline:none;}
63
- .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;}
66
- .s4owjrv{grid-template-columns:1fr 1fr 1fr;}
61
+ .s95bkm9 form{grid-template-columns:3fr 1fr 1fr;}.s95bkm9 form input{color:var(--font-color);border:1px solid var(--font-color);background:var(--toolbar-bg);outline:none;}
62
+ .so6hnjf{-webkit-flex:1;-ms-flex:1;flex:1;position:relative;height:100%;text-align:center;max-height:36px;overflow:hidden;}
63
+ .s1c1dllr{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;max-height:36px;background:var(--toolbar-bg);border-bottom:1px solid var(--divider-color);box-sizing:border-box;}
64
+ .s1g032mh{grid-template-columns:1fr 1fr 1fr;}
67
65
  .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
- .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;}
69
- .sttf061{border-radius:50%;}
70
- .layoutPanelOpened .sj7hhjx{color:var(--text-color-selected);background:var(--bg-color-selected);}.sj7hhjx[data-hidden='1']{display:none;}
66
+ .sfm1cqx{width:24px;height:24px;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;line-height:36px;font-weight:bold;}
67
+ .layoutPanelOpened .sj7hhjx.sj7hhjx{color:var(--font-selected-color);background:var(--font-selected-bg);}.sj7hhjx[data-hidden='1']{display:none;}
71
68
  .s9mugpt{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}
72
69
  .s1ktxhkr{padding:16px;}
73
70
  .smpmxx5{font-family:var(--smpmxx5-0);}
74
71
 
75
72
  .s1qssg4n{display:inline-block;width:6px;height:2px;background:transparent;vertical-align:middle;}
76
- .se26iq6{display:inline-block;}.se26iq6[data-type='0'] .s1qssg4n{background:black;}.se26iq6[data-type='1']{position:relative;left:3px;}.se26iq6[data-type='1'] .s1qssg4n:nth-child(3n-1){background:black;width:12px;}.se26iq6[data-type='1'] .s1qssg4n:nth-child(n+11){display:none;}.se26iq6[data-type='2'] .s1qssg4n:nth-child(2n+1){background:black;}
77
- .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
- .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
- .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;}
73
+ .se26iq6{display:inline-block;}.se26iq6[data-type='0'] .s1qssg4n{background:currentColor;}.se26iq6[data-type='1']{position:relative;left:3px;}.se26iq6[data-type='1'] .s1qssg4n:nth-child(3n-1){background:currentColor;width:12px;}.se26iq6[data-type='1'] .s1qssg4n:nth-child(n+11){display:none;}.se26iq6[data-type='2'] .s1qssg4n:nth-child(2n+1){background:currentColor;}
74
+ .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 currentColor;}
75
+ .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 currentColor;}
76
+ .scawaat{position:relative;display:inline-block;width:60px;height:2px;background:currentColor;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;}
77
+ .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(--toolbar-bg);position:relative;height:36px;border-top:1px solid var(--divider-color);box-sizing:border-box;}
81
78
  .sa7lzh9{-webkit-flex:1;-ms-flex:1;flex:1;}
82
79
  .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
80
  .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
81
  .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);}}
82
+ .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
83
  .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);}
88
- .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);}
84
+ .s1v9piyg{--toolbar-bg:var(--s1v9piyg-0);--divider-color:var(--s1v9piyg-1);--font-radius:var(--s1v9piyg-2);--font-disabled-color:var(--s1v9piyg-3);--font-disabled-bg:var(--s1v9piyg-4);--font-color:var(--s1v9piyg-5);--font-bg:var(--s1v9piyg-6);--font-selected-color:var(--s1v9piyg-7);--font-selected-bg:var(--s1v9piyg-8);--font-hover-color:var(--s1v9piyg-9);--font-hover-bg:var(--s1v9piyg-10);--canvas-bg:var(--s1v9piyg-11);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;color:var(--font-color);position:relative;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}.s1v9piyg hr{width:100%;border:none;border-top:1px solid var(--divider-color);}.s1v9piyg[data-grow='false']{max-width:var(--s1v9piyg-12);}.s1v9piyg[data-shrink='false']{min-width:var(--s1v9piyg-13);}
85
+ .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);}.s6o5tmu[data-grow='true']{width:100%;}.s6o5tmu[data-grow='false']{width:var(--s6o5tmu-1);}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -5,34 +5,41 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.createShape = exports.createPicture = exports.copyShape = void 0;
8
+ exports.roundValues = exports.createShape = exports.createPicture = exports.copyShape = exports.cleanShapesBeforeExport = exports.addDefaultAndTempShapeProps = void 0;
9
9
 
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
11
 
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
12
14
  var _fp = _interopRequireDefault(require("lodash/fp"));
13
15
 
14
16
  var _transform = require("./transform");
15
17
 
16
18
  var _Shapes = require("../types/Shapes");
17
19
 
20
+ var _file = require("./file");
21
+
18
22
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
19
23
 
20
24
  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; }
21
25
 
22
- var createPicture = function createPicture(fileOrUrl, maxPictureSize) {
26
+ var createPicture = function createPicture(fileOrUrl, maxPictureWidth, maxPictureHeight) {
23
27
  return new Promise(function (resolve, reject) {
24
28
  var img = new Image();
25
29
 
26
30
  img.onload = function () {
27
- var maxSize = Math.min(Math.max(img.width, img.height), maxPictureSize);
28
- var imgRatio = img.width / img.height;
31
+ var _fitContentInsideCont = (0, _transform.fitContentInsideContainer)(img.width, img.height, maxPictureWidth, maxPictureHeight, true),
32
+ _fitContentInsideCont2 = (0, _slicedToArray2["default"])(_fitContentInsideCont, 2),
33
+ width = _fitContentInsideCont2[0],
34
+ height = _fitContentInsideCont2[1];
35
+
29
36
  var pictureShape = {
30
37
  type: _Shapes.ShapeEnum.picture,
31
- id: _fp["default"].uniqueId(_Shapes.ShapeEnum.picture),
32
- x: 0,
33
- y: 0,
34
- width: imgRatio < 1 ? imgRatio * maxSize : maxSize,
35
- height: imgRatio > 1 ? maxSize / imgRatio : maxSize,
38
+ id: _fp["default"].uniqueId("".concat(_Shapes.ShapeEnum.picture, "_")),
39
+ x: (maxPictureWidth - width) / 2,
40
+ y: (maxPictureHeight - height) / 2,
41
+ width: width,
42
+ height: height,
36
43
  src: img.src,
37
44
  img: img,
38
45
  translation: [0, 0],
@@ -66,7 +73,7 @@ var createShape = function createShape(ctx, shape, cursorPosition, defaultConf)
66
73
  case _Shapes.ShapeEnum.brush:
67
74
  return {
68
75
  type: _Shapes.ShapeEnum.brush,
69
- id: _fp["default"].uniqueId(shape),
76
+ id: _fp["default"].uniqueId("".concat(shape, "_")),
70
77
  points: [[cursorPosition]],
71
78
  translation: [0, 0],
72
79
  rotation: 0,
@@ -76,7 +83,7 @@ var createShape = function createShape(ctx, shape, cursorPosition, defaultConf)
76
83
  case _Shapes.ShapeEnum.line:
77
84
  return {
78
85
  type: _Shapes.ShapeEnum.line,
79
- id: _fp["default"].uniqueId(shape),
86
+ id: _fp["default"].uniqueId("".concat(shape, "_")),
80
87
  points: [cursorPosition, cursorPosition],
81
88
  translation: [0, 0],
82
89
  rotation: 0,
@@ -86,7 +93,7 @@ var createShape = function createShape(ctx, shape, cursorPosition, defaultConf)
86
93
  case _Shapes.ShapeEnum.polygon:
87
94
  return {
88
95
  type: _Shapes.ShapeEnum.polygon,
89
- id: _fp["default"].uniqueId(shape),
96
+ id: _fp["default"].uniqueId("".concat(shape, "_")),
90
97
  points: _fp["default"].flow(_fp["default"].range(0), _fp["default"].map(function () {
91
98
  return cursorPosition;
92
99
  }))((_defaultConf$style$po = (_defaultConf$style = defaultConf.style) === null || _defaultConf$style === void 0 ? void 0 : _defaultConf$style.pointsCount) !== null && _defaultConf$style$po !== void 0 ? _defaultConf$style$po : 3),
@@ -98,7 +105,7 @@ var createShape = function createShape(ctx, shape, cursorPosition, defaultConf)
98
105
  case _Shapes.ShapeEnum.curve:
99
106
  return {
100
107
  type: _Shapes.ShapeEnum.curve,
101
- id: _fp["default"].uniqueId(shape),
108
+ id: _fp["default"].uniqueId("".concat(shape, "_")),
102
109
  points: _fp["default"].flow(_fp["default"].range(0), _fp["default"].map(function () {
103
110
  return cursorPosition;
104
111
  }))((_defaultConf$style$po2 = (_defaultConf$style2 = defaultConf.style) === null || _defaultConf$style2 === void 0 ? void 0 : _defaultConf$style2.pointsCount) !== null && _defaultConf$style$po2 !== void 0 ? _defaultConf$style$po2 : 3),
@@ -111,7 +118,7 @@ var createShape = function createShape(ctx, shape, cursorPosition, defaultConf)
111
118
  case _Shapes.ShapeEnum.square:
112
119
  return {
113
120
  type: shape,
114
- id: _fp["default"].uniqueId(shape),
121
+ id: _fp["default"].uniqueId("".concat(shape, "_")),
115
122
  x: cursorPosition[0],
116
123
  y: cursorPosition[1],
117
124
  width: 1,
@@ -126,7 +133,7 @@ var createShape = function createShape(ctx, shape, cursorPosition, defaultConf)
126
133
  var fontSize = (0, _transform.calculateTextFontSize)(ctx, defaultValue, 50, (_defaultConf$style3 = defaultConf.style) === null || _defaultConf$style3 === void 0 ? void 0 : _defaultConf$style3.fontFamily);
127
134
  return {
128
135
  type: _Shapes.ShapeEnum.text,
129
- id: _fp["default"].uniqueId(shape),
136
+ id: _fp["default"].uniqueId("".concat(shape, "_")),
130
137
  x: cursorPosition[0],
131
138
  y: cursorPosition[1],
132
139
  value: defaultValue,
@@ -141,7 +148,7 @@ var createShape = function createShape(ctx, shape, cursorPosition, defaultConf)
141
148
  case _Shapes.ShapeEnum.ellipse:
142
149
  return {
143
150
  type: _Shapes.ShapeEnum.ellipse,
144
- id: _fp["default"].uniqueId(shape),
151
+ id: _fp["default"].uniqueId("".concat(shape, "_")),
145
152
  x: cursorPosition[0],
146
153
  y: cursorPosition[1],
147
154
  radiusX: 0,
@@ -155,7 +162,7 @@ var createShape = function createShape(ctx, shape, cursorPosition, defaultConf)
155
162
  default:
156
163
  return {
157
164
  type: _Shapes.ShapeEnum.circle,
158
- id: _fp["default"].uniqueId(shape),
165
+ id: _fp["default"].uniqueId("".concat(shape, "_")),
159
166
  x: cursorPosition[0],
160
167
  y: cursorPosition[1],
161
168
  radius: 0,
@@ -170,9 +177,54 @@ exports.createShape = createShape;
170
177
 
171
178
  var copyShape = function copyShape(shape) {
172
179
  return _objectSpread(_objectSpread({}, shape), {}, {
173
- id: _fp["default"].uniqueId(shape.type),
180
+ id: _fp["default"].uniqueId("".concat(shape.type, "_")),
174
181
  translation: [shape.translation[0] + 20, shape.translation[1] + 20]
175
182
  });
176
183
  };
177
184
 
178
- exports.copyShape = copyShape;
185
+ exports.copyShape = copyShape;
186
+
187
+ var roundValues = function roundValues(prop) {
188
+ var precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;
189
+
190
+ if (_fp["default"].isArray(prop)) {
191
+ return prop.map(roundValues);
192
+ }
193
+
194
+ if (_fp["default"].isObject(prop)) {
195
+ return _fp["default"].mapValues(roundValues, prop);
196
+ }
197
+
198
+ if (_fp["default"].isNumber(prop)) {
199
+ return +prop.toFixed(precision);
200
+ }
201
+
202
+ return prop;
203
+ };
204
+
205
+ exports.roundValues = roundValues;
206
+
207
+ var cleanShapesBeforeExport = function cleanShapesBeforeExport(shapes) {
208
+ var propsToOmit = ['img', 'id'];
209
+ return shapes.map(function (shape) {
210
+ if (shape.type === _Shapes.ShapeEnum.picture) {
211
+ if (!shape.src.startsWith('http')) {
212
+ return roundValues(_fp["default"].omit(propsToOmit, _objectSpread(_objectSpread({}, shape), {}, {
213
+ src: (0, _file.getBase64Image)(shape.img)
214
+ })));
215
+ }
216
+ }
217
+
218
+ return roundValues(_fp["default"].omit(propsToOmit, shape));
219
+ });
220
+ };
221
+
222
+ exports.cleanShapesBeforeExport = cleanShapesBeforeExport;
223
+
224
+ var addDefaultAndTempShapeProps = function addDefaultAndTempShapeProps(shape) {
225
+ return _objectSpread(_objectSpread({}, shape), {}, {
226
+ id: _fp["default"].uniqueId("".concat(shape.type, "_"))
227
+ });
228
+ };
229
+
230
+ exports.addDefaultAndTempShapeProps = addDefaultAndTempShapeProps;