@yorab/react-paint 0.2.2

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 (103) hide show
  1. package/Changelog.md +26 -0
  2. package/README.md +99 -0
  3. package/dist/components/App.d.ts +20 -0
  4. package/dist/components/App.js +533 -0
  5. package/dist/components/Canvas.d.ts +28 -0
  6. package/dist/components/Canvas.js +188 -0
  7. package/dist/components/common/Button.d.ts +14 -0
  8. package/dist/components/common/Button.js +97 -0
  9. package/dist/components/common/Loading.d.ts +6 -0
  10. package/dist/components/common/Loading.js +66 -0
  11. package/dist/components/common/Modal.d.ts +8 -0
  12. package/dist/components/common/Modal.js +41 -0
  13. package/dist/components/common/Panel.d.ts +10 -0
  14. package/dist/components/common/Panel.js +48 -0
  15. package/dist/components/common/Snackbar.d.ts +7 -0
  16. package/dist/components/common/Snackbar.js +75 -0
  17. package/dist/components/settings/ColorField.d.ts +12 -0
  18. package/dist/components/settings/ColorField.js +128 -0
  19. package/dist/components/settings/DeleteButton.d.ts +9 -0
  20. package/dist/components/settings/DeleteButton.js +36 -0
  21. package/dist/components/settings/FontFamilyField.d.ts +10 -0
  22. package/dist/components/settings/FontFamilyField.js +57 -0
  23. package/dist/components/settings/LayoutButton.d.ts +8 -0
  24. package/dist/components/settings/LayoutButton.js +37 -0
  25. package/dist/components/settings/Layouts.d.ts +18 -0
  26. package/dist/components/settings/Layouts.js +218 -0
  27. package/dist/components/settings/LineArrowField.d.ts +10 -0
  28. package/dist/components/settings/LineArrowField.js +59 -0
  29. package/dist/components/settings/LineTypeField.d.ts +14 -0
  30. package/dist/components/settings/LineTypeField.js +57 -0
  31. package/dist/components/settings/PointsNumberField.d.ts +11 -0
  32. package/dist/components/settings/PointsNumberField.js +51 -0
  33. package/dist/components/settings/RangeField.d.ts +16 -0
  34. package/dist/components/settings/RangeField.js +90 -0
  35. package/dist/components/settings/SelectField.d.ts +16 -0
  36. package/dist/components/settings/SelectField.js +82 -0
  37. package/dist/components/settings/SettingsBar.d.ts +16 -0
  38. package/dist/components/settings/SettingsBar.js +262 -0
  39. package/dist/components/toolbox/EditTextBox.d.ts +10 -0
  40. package/dist/components/toolbox/EditTextBox.js +89 -0
  41. package/dist/components/toolbox/LoadFileTool.d.ts +11 -0
  42. package/dist/components/toolbox/LoadFileTool.js +58 -0
  43. package/dist/components/toolbox/MenuGroup.d.ts +23 -0
  44. package/dist/components/toolbox/MenuGroup.js +173 -0
  45. package/dist/components/toolbox/PictureUrlInput.d.ts +7 -0
  46. package/dist/components/toolbox/PictureUrlInput.js +96 -0
  47. package/dist/components/toolbox/Tool.d.ts +13 -0
  48. package/dist/components/toolbox/Tool.js +41 -0
  49. package/dist/components/toolbox/Toolbar.d.ts +20 -0
  50. package/dist/components/toolbox/Toolbar.js +205 -0
  51. package/dist/components/toolbox/ToolbarGroup.d.ts +18 -0
  52. package/dist/components/toolbox/ToolbarGroup.js +139 -0
  53. package/dist/constants/draw.d.ts +2 -0
  54. package/dist/constants/draw.js +10 -0
  55. package/dist/constants/icons.d.ts +36 -0
  56. package/dist/constants/icons.js +80 -0
  57. package/dist/constants/shapes.d.ts +5 -0
  58. package/dist/constants/shapes.js +14 -0
  59. package/dist/constants/snackbar.d.ts +11 -0
  60. package/dist/constants/snackbar.js +23 -0
  61. package/dist/constants/style.d.ts +12 -0
  62. package/dist/constants/style.js +30 -0
  63. package/dist/hooks/useComponent.d.ts +9 -0
  64. package/dist/hooks/useComponent.js +48 -0
  65. package/dist/hooks/useDrag.d.ts +15 -0
  66. package/dist/hooks/useDrag.js +100 -0
  67. package/dist/hooks/useDrawableCanvas.d.ts +30 -0
  68. package/dist/hooks/useDrawableCanvas.js +250 -0
  69. package/dist/hooks/useKeyboard.d.ts +15 -0
  70. package/dist/hooks/useKeyboard.js +123 -0
  71. package/dist/hooks/useShapes.d.ts +22 -0
  72. package/dist/hooks/useShapes.js +229 -0
  73. package/dist/hooks/useSnackbar.d.ts +16 -0
  74. package/dist/hooks/useSnackbar.js +86 -0
  75. package/dist/schemas/drawableShape.json +1021 -0
  76. package/dist/styles.css +88 -0
  77. package/dist/types/Mode.d.ts +51 -0
  78. package/dist/types/Mode.js +17 -0
  79. package/dist/types/Shapes.d.ts +122 -0
  80. package/dist/types/Shapes.js +35 -0
  81. package/dist/types/keyboard.d.ts +15 -0
  82. package/dist/types/keyboard.js +28 -0
  83. package/dist/utils/data.d.ts +4 -0
  84. package/dist/utils/data.js +178 -0
  85. package/dist/utils/draw.d.ts +18 -0
  86. package/dist/utils/draw.js +422 -0
  87. package/dist/utils/file.d.ts +33 -0
  88. package/dist/utils/file.js +220 -0
  89. package/dist/utils/intersect.d.ts +8 -0
  90. package/dist/utils/intersect.js +194 -0
  91. package/dist/utils/selection.d.ts +7 -0
  92. package/dist/utils/selection.js +88 -0
  93. package/dist/utils/shapeData.d.ts +5 -0
  94. package/dist/utils/shapeData.js +178 -0
  95. package/dist/utils/string.d.ts +3 -0
  96. package/dist/utils/string.js +42 -0
  97. package/dist/utils/style.d.ts +2 -0
  98. package/dist/utils/style.js +46 -0
  99. package/dist/utils/toolbar.d.ts +12 -0
  100. package/dist/utils/toolbar.js +37 -0
  101. package/dist/utils/transform.d.ts +271 -0
  102. package/dist/utils/transform.js +371 -0
  103. package/package.json +79 -0
@@ -0,0 +1,229 @@
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 _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
+
14
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
15
+
16
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
17
+
18
+ var _react = require("react");
19
+
20
+ var _fp = _interopRequireDefault(require("lodash/fp"));
21
+
22
+ var _data = require("../utils/data");
23
+
24
+ var useShapes = function useShapes() {
25
+ var onDataChanged = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _fp["default"].noop;
26
+ var shapesRef = (0, _react.useRef)([]);
27
+
28
+ var _useState = (0, _react.useState)(undefined),
29
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
30
+ selectedShape = _useState2[0],
31
+ setSelectedShape = _useState2[1];
32
+
33
+ var _useState3 = (0, _react.useState)({
34
+ states: [{
35
+ shapes: [],
36
+ selectedShape: undefined
37
+ }],
38
+ cursor: 0
39
+ }),
40
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
41
+ savedShapes = _useState4[0],
42
+ setSavedShapes = _useState4[1];
43
+
44
+ var canGoBackward = savedShapes.cursor > 0;
45
+ var canGoForward = savedShapes.cursor < savedShapes.states.length - 1;
46
+ var canClear = shapesRef.current.length > 0;
47
+ var saveShapes = (0, _react.useCallback)(function () {
48
+ setSavedShapes(function (prevSavedShaped) {
49
+ return _fp["default"].isEqual(_fp["default"].get([prevSavedShaped.cursor, 'shapes'], prevSavedShaped.states), shapesRef.current) ? prevSavedShaped : {
50
+ states: [].concat((0, _toConsumableArray2["default"])(prevSavedShaped.states.slice(0, prevSavedShaped.cursor + 1)), [{
51
+ shapes: shapesRef.current,
52
+ selectedShape: selectedShape
53
+ }]),
54
+ cursor: prevSavedShaped.cursor + 1
55
+ };
56
+ });
57
+ }, [selectedShape]);
58
+ var addShape = (0, _react.useCallback)(function (newShape) {
59
+ shapesRef.current = [newShape].concat((0, _toConsumableArray2["default"])(shapesRef.current));
60
+ }, []);
61
+ var addPictureShape = (0, _react.useCallback)( /*#__PURE__*/function () {
62
+ var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(fileOrUrl) {
63
+ var maxSize,
64
+ pictureShape,
65
+ _args = arguments;
66
+ return _regenerator["default"].wrap(function _callee$(_context) {
67
+ while (1) {
68
+ switch (_context.prev = _context.next) {
69
+ 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
+
74
+ case 3:
75
+ pictureShape = _context.sent;
76
+ addShape(pictureShape);
77
+ return _context.abrupt("return", pictureShape);
78
+
79
+ case 6:
80
+ case "end":
81
+ return _context.stop();
82
+ }
83
+ }
84
+ }, _callee);
85
+ }));
86
+
87
+ return function (_x) {
88
+ return _ref.apply(this, arguments);
89
+ };
90
+ }(), [addShape]);
91
+ var updateShape = (0, _react.useCallback)(function (updatedShape) {
92
+ var withSave = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
93
+ shapesRef.current = shapesRef.current.map(function (marker) {
94
+ return marker.id === (selectedShape === null || selectedShape === void 0 ? void 0 : selectedShape.id) ? updatedShape : marker;
95
+ });
96
+ setSelectedShape(function (prevSelectedShape) {
97
+ return (prevSelectedShape === null || prevSelectedShape === void 0 ? void 0 : prevSelectedShape.id) === updatedShape.id ? updatedShape : prevSelectedShape;
98
+ });
99
+ withSave && saveShapes();
100
+ }, [selectedShape, saveShapes]);
101
+ var updateShapes = (0, _react.useCallback)(function (newShapes) {
102
+ var pureShapes = newShapes.map(function (shape) {
103
+ return _fp["default"].omit(['chosen'], shape);
104
+ });
105
+ shapesRef.current = pureShapes;
106
+ saveShapes();
107
+ }, [saveShapes]);
108
+ var removeShape = (0, _react.useCallback)(function (shape) {
109
+ setSelectedShape(function (prevSelectedShape) {
110
+ return (prevSelectedShape === null || prevSelectedShape === void 0 ? void 0 : prevSelectedShape.id) === shape.id ? undefined : prevSelectedShape;
111
+ });
112
+ shapesRef.current = _fp["default"].remove({
113
+ id: shape.id
114
+ }, shapesRef.current);
115
+ saveShapes();
116
+ }, [saveShapes]);
117
+ var backwardShape = (0, _react.useCallback)(function () {
118
+ setSavedShapes(function (prevSavedShaped) {
119
+ var newCursor = Math.max(0, prevSavedShaped.cursor - 1);
120
+ shapesRef.current = _fp["default"].get([newCursor, 'shapes'], prevSavedShaped.states);
121
+ setSelectedShape(_fp["default"].get([newCursor, 'selectedShape'], prevSavedShaped.states));
122
+ return _fp["default"].set('cursor', newCursor, prevSavedShaped);
123
+ });
124
+ }, []);
125
+ var forwardShape = (0, _react.useCallback)(function () {
126
+ setSavedShapes(function (prevSavedShaped) {
127
+ var newCursor = Math.min(prevSavedShaped.states.length - 1, prevSavedShaped.cursor + 1);
128
+ shapesRef.current = _fp["default"].get([newCursor, 'shapes'], prevSavedShaped.states);
129
+ setSelectedShape(_fp["default"].get([newCursor, 'selectedShape'], prevSavedShaped.states));
130
+ return _fp["default"].set('cursor', newCursor, prevSavedShaped);
131
+ });
132
+ }, []);
133
+ var clearShapes = (0, _react.useCallback)(function () {
134
+ var shapesToInit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
135
+ var clearHistory = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
136
+ setSelectedShape(undefined);
137
+ shapesRef.current = shapesToInit;
138
+ setSavedShapes(function (prevSavedShaped) {
139
+ return clearHistory ? {
140
+ states: [{
141
+ shapes: shapesToInit,
142
+ selectedShape: undefined
143
+ }],
144
+ cursor: 0
145
+ } : {
146
+ states: [].concat((0, _toConsumableArray2["default"])(prevSavedShaped.states.slice(0, prevSavedShaped.cursor + 1)), [{
147
+ shapes: shapesToInit,
148
+ selectedShape: undefined
149
+ }]),
150
+ cursor: prevSavedShaped.cursor + 1
151
+ };
152
+ });
153
+ }, []);
154
+ var moveShapes = (0, _react.useCallback)(function (firstShapeId, lastShapeId) {
155
+ var shapes = shapesRef.current;
156
+
157
+ var firstShapeIndex = _fp["default"].findIndex({
158
+ id: firstShapeId
159
+ }, shapes);
160
+
161
+ var lastShapeIndex = _fp["default"].findIndex({
162
+ id: lastShapeId
163
+ }, shapes); // todo utils
164
+
165
+
166
+ if (firstShapeIndex < lastShapeIndex) {
167
+ updateShapes([].concat((0, _toConsumableArray2["default"])(_fp["default"].slice(0, firstShapeIndex, shapes)), (0, _toConsumableArray2["default"])(_fp["default"].slice(firstShapeIndex + 1, lastShapeIndex + 1, shapes)), [shapes[firstShapeIndex]], (0, _toConsumableArray2["default"])(_fp["default"].slice(lastShapeIndex + 1, shapes.length, shapes))));
168
+ } else {
169
+ updateShapes([].concat((0, _toConsumableArray2["default"])(_fp["default"].slice(0, lastShapeIndex, shapes)), [shapes[firstShapeIndex]], (0, _toConsumableArray2["default"])(_fp["default"].slice(lastShapeIndex, firstShapeIndex, shapes)), (0, _toConsumableArray2["default"])(_fp["default"].slice(firstShapeIndex + 1, shapes.length, shapes))));
170
+ }
171
+ }, [updateShapes]);
172
+ var toggleShapeVisibility = (0, _react.useCallback)(function (shape) {
173
+ var shapes = shapesRef.current;
174
+
175
+ var shapeIndex = _fp["default"].findIndex({
176
+ id: shape.id
177
+ }, shapes);
178
+
179
+ if (shapeIndex < 0) return;
180
+
181
+ var newShape = _fp["default"].set('visible', shape.visible === false, shape);
182
+
183
+ setSelectedShape(function (prevSelectedShape) {
184
+ return (prevSelectedShape === null || prevSelectedShape === void 0 ? void 0 : prevSelectedShape.id) === newShape.id ? newShape : prevSelectedShape;
185
+ });
186
+ updateShapes(_fp["default"].set(shapeIndex, newShape, shapes));
187
+ }, [updateShapes]);
188
+ var toggleShapeLock = (0, _react.useCallback)(function (shape) {
189
+ var shapes = shapesRef.current;
190
+
191
+ var shapeIndex = _fp["default"].findIndex({
192
+ id: shape.id
193
+ }, shapes);
194
+
195
+ if (shapeIndex < 0) return;
196
+
197
+ var newShape = _fp["default"].set('locked', !shape.locked, shape);
198
+
199
+ setSelectedShape(function (prevSelectedShape) {
200
+ return (prevSelectedShape === null || prevSelectedShape === void 0 ? void 0 : prevSelectedShape.id) === newShape.id ? newShape : prevSelectedShape;
201
+ });
202
+ updateShapes(_fp["default"].set(shapeIndex, newShape, shapes));
203
+ }, [updateShapes]);
204
+ (0, _react.useEffect)(function () {
205
+ onDataChanged();
206
+ }, [onDataChanged, savedShapes]);
207
+ return {
208
+ shapesRef: shapesRef,
209
+ selectedShape: selectedShape,
210
+ addShape: addShape,
211
+ addPictureShape: addPictureShape,
212
+ moveShapes: moveShapes,
213
+ saveShapes: saveShapes,
214
+ setSelectedShape: setSelectedShape,
215
+ toggleShapeVisibility: toggleShapeVisibility,
216
+ toggleShapeLock: toggleShapeLock,
217
+ removeShape: removeShape,
218
+ updateShape: updateShape,
219
+ backwardShape: backwardShape,
220
+ forwardShape: forwardShape,
221
+ clearShapes: clearShapes,
222
+ canGoBackward: canGoBackward,
223
+ canGoForward: canGoForward,
224
+ canClear: canClear
225
+ };
226
+ };
227
+
228
+ var _default = useShapes;
229
+ exports["default"] = _default;
@@ -0,0 +1,16 @@
1
+ import { SnackbarTypeEnum } from 'constants/snackbar';
2
+ export declare type SnackBarType = {
3
+ id: string;
4
+ type: SnackbarTypeEnum;
5
+ text: string;
6
+ duration: number;
7
+ };
8
+ declare const useSnackbar: () => {
9
+ snackbarList: SnackBarType[];
10
+ addSnackbar: ({ type, duration, text }: {
11
+ type?: SnackbarTypeEnum | undefined;
12
+ duration?: number | undefined;
13
+ text: string;
14
+ }) => void;
15
+ };
16
+ export default useSnackbar;
@@ -0,0 +1,86 @@
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 _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
14
+ var _snackbar = require("../constants/snackbar");
15
+
16
+ var _fp = _interopRequireDefault(require("lodash/fp"));
17
+
18
+ var _react = require("react");
19
+
20
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
21
+
22
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
23
+
24
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
25
+
26
+ var useSnackbar = function useSnackbar() {
27
+ var timers = (0, _react.useRef)([]);
28
+
29
+ var _useState = (0, _react.useState)([]),
30
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
31
+ snackbarList = _useState2[0],
32
+ setSnackbarList = _useState2[1];
33
+
34
+ var removeSnackbar = function removeSnackbar(id) {
35
+ setSnackbarList(function (prev) {
36
+ return _fp["default"].remove({
37
+ id: id
38
+ }, prev);
39
+ });
40
+ };
41
+
42
+ var addSnackbar = function addSnackbar(_ref) {
43
+ var _ref$type = _ref.type,
44
+ type = _ref$type === void 0 ? _snackbar.SNACKBAR_DEFAULT_SETTINGS.type : _ref$type,
45
+ _ref$duration = _ref.duration,
46
+ duration = _ref$duration === void 0 ? _snackbar.SNACKBAR_DEFAULT_SETTINGS.duration : _ref$duration,
47
+ text = _ref.text;
48
+ var newSnackbar = {
49
+ id: _fp["default"].uniqueId('snackbar_'),
50
+ duration: duration,
51
+ type: type,
52
+ text: text
53
+ };
54
+ setSnackbarList(function (prev) {
55
+ return [].concat((0, _toConsumableArray2["default"])(prev), [newSnackbar]);
56
+ });
57
+ timers.current = [].concat((0, _toConsumableArray2["default"])(timers.current), [setTimeout(function () {
58
+ return removeSnackbar(newSnackbar.id);
59
+ }, duration)]);
60
+ };
61
+
62
+ (0, _react.useEffect)(function () {
63
+ return function () {
64
+ var _iterator = _createForOfIteratorHelper(timers.current),
65
+ _step;
66
+
67
+ try {
68
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
69
+ var timer = _step.value;
70
+ clearTimeout(timer);
71
+ }
72
+ } catch (err) {
73
+ _iterator.e(err);
74
+ } finally {
75
+ _iterator.f();
76
+ }
77
+ };
78
+ }, []);
79
+ return {
80
+ snackbarList: snackbarList,
81
+ addSnackbar: addSnackbar
82
+ };
83
+ };
84
+
85
+ var _default = useSnackbar;
86
+ exports["default"] = _default;