@yorab/react-paint 0.8.0 → 0.9.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 (45) hide show
  1. package/README.md +1 -11
  2. package/dist/components/Canvas.d.ts +6 -6
  3. package/dist/components/settings/DeleteButton.d.ts +3 -3
  4. package/dist/components/settings/Layouts.d.ts +7 -7
  5. package/dist/components/settings/SettingsBar.d.ts +7 -5
  6. package/dist/components/toolbox/EditTextBox.d.ts +2 -2
  7. package/dist/components/toolbox/Tool.d.ts +2 -2
  8. package/dist/constants/shapes.d.ts +1 -1
  9. package/dist/constants/style.d.ts +1 -1
  10. package/dist/hooks/useDrag.d.ts +3 -3
  11. package/dist/hooks/useDrawableCanvas.d.ts +6 -6
  12. package/dist/hooks/useKeyboard.d.ts +9 -7
  13. package/dist/hooks/useShapes.d.ts +16 -12
  14. package/dist/react-paint.css +1 -1
  15. package/dist/react-paint.js +5374 -5596
  16. package/dist/react-paint.umd.cjs +17 -43
  17. package/dist/types/Mode.d.ts +4 -4
  18. package/dist/types/Shapes.d.ts +83 -67
  19. package/dist/types/react.d.ts +7 -0
  20. package/dist/types/tools.d.ts +2 -1
  21. package/dist/types/utils.d.ts +1 -0
  22. package/dist/utils/data.d.ts +2 -223
  23. package/dist/utils/file.d.ts +2 -2
  24. package/dist/utils/{shapes/grid.d.ts → grid.d.ts} +2 -2
  25. package/dist/utils/migration.d.ts +98 -116
  26. package/dist/utils/selection/lineSelection.d.ts +12 -0
  27. package/dist/utils/selection/rectSelection.d.ts +13 -0
  28. package/dist/utils/selection.d.ts +4 -4
  29. package/dist/utils/shapes/brush.d.ts +10 -45
  30. package/dist/utils/shapes/circle.d.ts +10 -6
  31. package/dist/utils/shapes/curve.d.ts +10 -5
  32. package/dist/utils/shapes/ellipse.d.ts +10 -6
  33. package/dist/utils/shapes/index.d.ts +11 -227
  34. package/dist/utils/shapes/line.d.ts +10 -16
  35. package/dist/utils/shapes/path.d.ts +9 -0
  36. package/dist/utils/shapes/picture.d.ts +11 -5
  37. package/dist/utils/shapes/polygon.d.ts +11 -5
  38. package/dist/utils/shapes/rectangle.d.ts +11 -17
  39. package/dist/utils/shapes/text.d.ts +8 -37
  40. package/dist/utils/shapes/triangle.d.ts +3 -2
  41. package/dist/utils/style.d.ts +1 -1
  42. package/dist/utils/transform.d.ts +5 -4
  43. package/dist/utils/trigo.d.ts +7 -1
  44. package/package.json +15 -15
  45. package/dist/utils/shapes/default.d.ts +0 -10
package/README.md CHANGED
@@ -1,11 +1 @@
1
- # React Paint
2
-
3
- ## known issues :
4
-
5
- - dnd layout on mobile not working (fix : use dnd lib, or add touch listener to fake dnd, or provide alt UI)
6
- - TextEdit cursor overflow MINOR (quick fix : edit on modale ?)
7
- - circle resizing only goes one direction
8
- - adding padding to selection result in wrong intersection calculs
9
- - Clear with custom callback breaks history stack
10
- - selection padding needs work
11
- - with shrunk or grown container, anchors selection is miscalculated
1
+ # React Paint V0.9.0
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { DrawableShape, Point } from '../types/Shapes';
2
+ import type { Point, ShapeEntity } from '../types/Shapes';
3
3
  import type { SelectionModeData } from '../types/Mode';
4
4
  import type { ToolsType } from '../types/tools';
5
5
  import type { GridFormatType } from '../constants/app';
@@ -17,12 +17,12 @@ type DrawerType = {
17
17
  selectionWidth: number;
18
18
  selectionPadding: number;
19
19
  isEditMode: boolean;
20
- shapes: DrawableShape[];
20
+ shapes: ShapeEntity[];
21
21
  saveShapes: () => void;
22
- addShape: (newShape: DrawableShape) => void;
23
- updateSingleShape: (updatedShape: DrawableShape) => void;
24
- selectedShape: DrawableShape | undefined;
25
- setSelectedShape: React.Dispatch<React.SetStateAction<DrawableShape | undefined>>;
22
+ addShape: (newShape: ShapeEntity) => void;
23
+ updateSingleShape: (updatedShape: ShapeEntity) => void;
24
+ selectedShape: ShapeEntity | undefined;
25
+ setSelectedShape: React.Dispatch<React.SetStateAction<ShapeEntity | undefined>>;
26
26
  activeTool: ToolsType;
27
27
  setActiveTool: React.Dispatch<React.SetStateAction<ToolsType>>;
28
28
  canvasOffsetStartPosition: Point | undefined;
@@ -1,9 +1,9 @@
1
1
  import React from 'react';
2
- import type { DrawableShape } from '../../types/Shapes';
2
+ import type { ShapeEntity } from '../../types/Shapes';
3
3
  type DeleteShapeButtonType = {
4
4
  disabled?: boolean;
5
- selectedShape: DrawableShape;
6
- removeShape: (shape: DrawableShape) => void;
5
+ selectedShape: ShapeEntity;
6
+ removeShape: (shape: ShapeEntity) => void;
7
7
  };
8
8
  declare const DeleteButton: ({ disabled, selectedShape, removeShape }: DeleteShapeButtonType) => React.JSX.Element;
9
9
  export default DeleteButton;
@@ -1,17 +1,17 @@
1
1
  import React from 'react';
2
- import type { DrawableShape } from '../../types/Shapes';
2
+ import type { ShapeEntity } from '../../types/Shapes';
3
3
  import type { GridFormatType } from '../../constants/app';
4
4
  import './Layouts.css';
5
5
  type LayoutsType = {
6
6
  gridFormat: GridFormatType;
7
7
  setGridFormat: React.Dispatch<React.SetStateAction<GridFormatType>>;
8
8
  disabled?: boolean;
9
- shapes: DrawableShape[];
10
- removeShape: (shape: DrawableShape) => void;
11
- toggleShapeVisibility: (shape: DrawableShape) => void;
12
- toggleShapeLock: (shape: DrawableShape) => void;
13
- selectedShape: DrawableShape | undefined;
14
- selectShape: (shape: DrawableShape) => void;
9
+ shapes: ShapeEntity[];
10
+ removeShape: (shape: ShapeEntity) => void;
11
+ toggleShapeVisibility: (shape: ShapeEntity) => void;
12
+ toggleShapeLock: (shape: ShapeEntity) => void;
13
+ selectedShape: ShapeEntity | undefined;
14
+ selectShape: (shape: ShapeEntity) => void;
15
15
  moveShapes: (firstShapeId: string, lastShapeId: string) => void;
16
16
  isLayoutPanelShown: boolean;
17
17
  };
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { DrawableShape } from '../../types/Shapes';
2
+ import type { ShapeEntity } from '../../types/Shapes';
3
3
  import type { CustomTool, ToolsType } from '../../types/tools';
4
4
  import './SettingsBar.css';
5
5
  type SettingsBoxType = {
@@ -9,11 +9,13 @@ type SettingsBoxType = {
9
9
  updateToolSettings: (toolId: string, field: string, value: string | number | boolean) => void;
10
10
  layersManipulation?: boolean;
11
11
  activeTool: ToolsType;
12
- selectedShape: DrawableShape | undefined;
12
+ selectedShape: ShapeEntity | undefined;
13
13
  canvas: HTMLCanvasElement | null;
14
- updateShape: (shape: DrawableShape, withSave?: boolean) => void;
15
- removeShape: (shape: DrawableShape) => void;
14
+ currentScale: number;
15
+ selectionPadding: number;
16
+ updateShape: (shape: ShapeEntity, withSave?: boolean) => void;
17
+ removeShape: (shape: ShapeEntity) => void;
16
18
  toggleLayoutPanel: () => void;
17
19
  };
18
- declare const SettingsBar: ({ width, disabled, availableTools, updateToolSettings, layersManipulation, toggleLayoutPanel, activeTool, selectedShape, canvas, updateShape, removeShape }: SettingsBoxType) => React.JSX.Element;
20
+ declare const SettingsBar: ({ width, disabled, availableTools, updateToolSettings, layersManipulation, toggleLayoutPanel, activeTool, selectedShape, canvas, currentScale, selectionPadding, updateShape, removeShape }: SettingsBoxType) => React.JSX.Element;
19
21
  export default SettingsBar;
@@ -1,10 +1,10 @@
1
1
  import React from 'react';
2
- import type { DrawableText } from '../../types/Shapes';
2
+ import type { DrawableShape } from '../../types/Shapes';
3
3
  import './EditTextBox.css';
4
4
  type EditTextBoxType = {
5
5
  scaleRatio: number;
6
6
  disabled?: boolean;
7
- shape: DrawableText;
7
+ shape: DrawableShape<'text'>;
8
8
  defaultValue: string[];
9
9
  selectionPadding: number;
10
10
  updateValue: (newValue: string[]) => void;
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import type { ToolsType } from '../../types/tools';
3
- type ToolType = {
3
+ type ToolComponentType = {
4
4
  type: ToolsType;
5
5
  img?: string;
6
6
  withText?: boolean;
@@ -8,5 +8,5 @@ type ToolType = {
8
8
  disabled?: boolean;
9
9
  setActive: (marker: ToolsType) => void;
10
10
  };
11
- declare const Tool: ({ type, img, isActive, withText, disabled, setActive }: ToolType) => React.JSX.Element;
11
+ declare const Tool: ({ type, img, isActive, withText, disabled, setActive }: ToolComponentType) => React.JSX.Element;
12
12
  export default Tool;
@@ -5,4 +5,4 @@ export declare const SELECTION_DEFAULT_COLOR = "blue";
5
5
  export declare const SELECTION_ANCHOR_SIZE = 14;
6
6
  export declare const SELECTION_ROTATED_ANCHOR_POSITION = 16;
7
7
  export declare const SELECTION_RESIZE_ANCHOR_POSITIONS: Point[];
8
- export declare const ShapeTypeArray: readonly ["brush", "rect", "square", "line", "polygon", "circle", "curve", "ellipse", "picture", "text"];
8
+ export declare const ShapeTypeArray: readonly ["brush", "rect", "square", "line", "polygon", "circle", "curve", "ellipse", "picture", "text", "triangle"];
@@ -13,5 +13,5 @@ export declare const STYLE_ZINDEX: {
13
13
  PANEL: number;
14
14
  SNACKBAR: number;
15
15
  };
16
- export declare const GRID_STEP: number[];
16
+ export declare const GRID_STEP: readonly [10, 20, 40];
17
17
  export declare const GRID_ROTATION_STEPS = 18;
@@ -1,12 +1,12 @@
1
1
  import { RefObject } from 'react';
2
- import type { DrawableShape } from '../types/Shapes';
2
+ import type { ShapeEntity } from '../types/Shapes';
3
3
  type useDragType = {
4
4
  disabled?: boolean;
5
5
  ref: RefObject<HTMLDivElement>;
6
- shape: DrawableShape;
6
+ shape: ShapeEntity;
7
7
  layoutDragging: string | undefined;
8
8
  setLayoutDragging: (shapeId: string | undefined) => void;
9
- handleSelect: (shape: DrawableShape) => void;
9
+ handleSelect: (shape: ShapeEntity) => void;
10
10
  onMoveShapes: (firstShapeId: string, lastShapeId: string) => void;
11
11
  };
12
12
  declare const useDrag: ({ disabled, ref, shape, layoutDragging, setLayoutDragging, handleSelect, onMoveShapes }: useDragType) => {
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { DrawableShape, Point } from '../types/Shapes';
2
+ import type { Point, ShapeEntity } from '../types/Shapes';
3
3
  import type { HoverModeData, SelectionModeData } from '../types/Mode';
4
4
  import type { ToolsType } from '../types/tools';
5
5
  import type { GridFormatType } from '../constants/app';
@@ -10,12 +10,12 @@ type UseCanvasType = {
10
10
  height: number;
11
11
  scaleRatio: number;
12
12
  };
13
- shapes: DrawableShape[];
13
+ shapes: ShapeEntity[];
14
14
  saveShapes: () => void;
15
- addShape: (newShape: DrawableShape) => void;
16
- updateSingleShape: (updatedShape: DrawableShape) => void;
17
- selectedShape: DrawableShape | undefined;
18
- setSelectedShape: React.Dispatch<React.SetStateAction<DrawableShape | undefined>>;
15
+ addShape: (newShape: ShapeEntity) => void;
16
+ updateSingleShape: (updatedShape: ShapeEntity) => void;
17
+ selectedShape: ShapeEntity | undefined;
18
+ setSelectedShape: React.Dispatch<React.SetStateAction<ShapeEntity | undefined>>;
19
19
  activeTool: ToolsType;
20
20
  setActiveTool: React.Dispatch<React.SetStateAction<ToolsType>>;
21
21
  canvasOffsetStartPosition: Point | undefined;
@@ -1,18 +1,20 @@
1
1
  /// <reference types="react" />
2
2
  import type { GridFormatType } from '../constants/app';
3
- import type { DrawableShape } from '../types/Shapes';
3
+ import type { ShapeEntity } from '../types/Shapes';
4
4
  type UseKeyboardType = {
5
5
  isInsideComponent: boolean;
6
- selectedShape: DrawableShape | undefined;
7
- pasteShape: (shape: DrawableShape) => void;
8
- updateShape: (shape: DrawableShape) => void;
9
- setSelectedShape: (value: React.SetStateAction<DrawableShape | undefined>) => void;
10
- removeShape: (shape: DrawableShape) => void;
6
+ selectedShape: ShapeEntity | undefined;
7
+ pasteShape: (shape: ShapeEntity) => void;
8
+ updateShape: (shape: ShapeEntity) => void;
9
+ setSelectedShape: (value: React.SetStateAction<ShapeEntity | undefined>) => void;
10
+ removeShape: (shape: ShapeEntity) => void;
11
11
  backwardShape: () => void;
12
12
  forwardShape: () => void;
13
13
  setShiftPressed: (value: React.SetStateAction<boolean>) => void;
14
14
  isEditingText: boolean;
15
15
  gridFormat: GridFormatType;
16
+ currentScale: number;
17
+ selectionPadding: number;
16
18
  };
17
- declare const useKeyboard: ({ gridFormat, isInsideComponent, selectedShape, isEditingText, setSelectedShape, removeShape, pasteShape, updateShape, backwardShape, forwardShape, setShiftPressed }: UseKeyboardType) => {};
19
+ declare const useKeyboard: ({ gridFormat, isInsideComponent, selectedShape, isEditingText, currentScale, selectionPadding, setSelectedShape, removeShape, pasteShape, updateShape, backwardShape, forwardShape, setShiftPressed }: UseKeyboardType) => {};
18
20
  export default useKeyboard;
@@ -1,20 +1,24 @@
1
1
  /// <reference types="react" />
2
- import type { DrawableShape } from '../types/Shapes';
3
- declare const useShapes: (onDataChanged?: () => void) => {
4
- shapesRef: import("react").MutableRefObject<DrawableShape[]>;
5
- selectedShape: DrawableShape | undefined;
6
- addShape: (newShape: DrawableShape) => void;
7
- addPictureShape: (fileOrUrl: File | string, maxWidth?: number, maxHeight?: number) => Promise<import("../types/Shapes").DrawablePicture>;
2
+ import type { ShapeEntity } from '../types/Shapes';
3
+ declare const useShapes: (onDataChanged: (() => void) | undefined, selectionPadding: number, canvasSize: {
4
+ width: number;
5
+ height: number;
6
+ scaleRatio: number;
7
+ }) => {
8
+ shapesRef: import("react").MutableRefObject<ShapeEntity[]>;
9
+ selectedShape: ShapeEntity | undefined;
10
+ addShape: (newShape: ShapeEntity) => void;
11
+ addPictureShape: (fileOrUrl: File | string, maxWidth?: number, maxHeight?: number) => Promise<ShapeEntity<"picture">>;
8
12
  moveShapes: (firstShapeId: string, lastShapeId: string) => void;
9
13
  saveShapes: () => void;
10
- setSelectedShape: import("react").Dispatch<import("react").SetStateAction<DrawableShape | undefined>>;
11
- toggleShapeVisibility: (shape: DrawableShape) => void;
12
- toggleShapeLock: (shape: DrawableShape) => void;
13
- removeShape: (shape: DrawableShape) => void;
14
- updateShape: (updatedShape: DrawableShape, withSave?: boolean) => void;
14
+ setSelectedShape: import("react").Dispatch<import("react").SetStateAction<ShapeEntity | undefined>>;
15
+ toggleShapeVisibility: (shape: ShapeEntity) => void;
16
+ toggleShapeLock: (shape: ShapeEntity) => void;
17
+ removeShape: (shape: ShapeEntity) => void;
18
+ updateShape: (updatedShape: ShapeEntity, withSave?: boolean) => void;
15
19
  backwardShape: () => void;
16
20
  forwardShape: () => void;
17
- clearShapes: (shapesToInit?: DrawableShape[], clearHistory?: boolean) => void;
21
+ clearShapes: (shapesToInit?: ShapeEntity[], clearHistory?: boolean) => void;
18
22
  canGoBackward: boolean;
19
23
  canGoForward: boolean;
20
24
  canClear: boolean;
@@ -1 +1 @@
1
- .react-paint-editor-toolbox-edittextbox{transform-origin:0 0;box-sizing:border-box;transform:var(--react-paint-editor-toolbox-edittextbox-transform);color:var(--react-paint-editor-toolbox-edittextbox-color);padding:var(--react-paint-editor-toolbox-edittextbox-padding);line-height:1;font-size:var(--react-paint-editor-toolbox-edittextbox-fontsize);font-family:var(--react-paint-editor-toolbox-edittextbox-fontfamily);opacity:var(--react-paint-editor-toolbox-edittextbox-opacity);background:0 0;outline:none;width:-webkit-max-content;width:-moz-max-content;width:max-content;display:inline-block;position:absolute;top:0;left:0}.react-paint-editor-toolbox-edittextbox[data-fontbold=true]{font-weight:700}.react-paint-editor-toolbox-edittextbox[data-fontitalic=true]{font-style:italic}.react-paint-editor-canvas-box{flex:1;justify-content:center;align-items:center;display:flex}.react-paint-editor-canvas-container{background-color:var(--react-paint-editor-app-canvas-bg);background-repeat:repeat;background-size:16px;display:grid;position:relative;overflow:hidden}.react-paint-editor-canvas-container[data-grow=true]{width:100%;height:100%}.react-paint-editor-canvas-drawcanvas{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;touch-action:none;grid-area:1/1;max-width:100%;display:block}.react-paint-editor-canvas-drawcanvas[data-grow=true]{width:100%}.react-paint-editor-canvas-selectioncanvas{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;touch-action:none;cursor:var(--react-paint-editor-canvas-cursor);grid-area:1/1;max-width:100%;display:block;position:relative}.react-paint-editor-canvas-selectioncanvas[data-grow=true]{width:100%}.react-paint-editor-button{vertical-align:middle;box-sizing:border-box;cursor:pointer;border-radius:var(--react-paint-editor-app-font-radius);color:var(--react-paint-editor-app-font-color);padding:var(--react-paint-editor-button-padding,0);background:0 0;border:none;justify-content:center;align-items:center;min-width:32px;height:32px;margin:2px 4px;font-size:14px;display:inline-flex}.react-paint-editor-button[data-selected="1"]{color:var(--react-paint-editor-app-font-selected-color);background:var(--react-paint-editor-app-font-selected-bg)}.react-paint-editor-button[data-hidden="1"]{visibility:hidden}.react-paint-editor-button[data-disabled="1"]{cursor:default;color:var(--react-paint-editor-app-font-disabled-color);background:var(--react-paint-editor-app-font-disabled-bg)}.react-paint-editor-button[data-selected="0"][data-disabled="0"]{background:var(--react-paint-editor-app-font-bg);color:var(--react-paint-editor-app-font-color)}.react-paint-editor-button[data-selected="0"][data-disabled="0"]:hover{color:var(--react-paint-editor-app-font-hover-color);background:var(--react-paint-editor-app-font-hover-bg)}.react-paint-editor-button[data-disabled="0"]{cursor:pointer}.react-paint-editor-button svg{fill:currentColor;width:20px;height:20px}.react-paint-editor-button input{visibility:hidden;position:absolute}.react-paint-editor-button-content{box-sizing:border-box;width:100%;padding:2px 6px;display:flex}.react-paint-editor-button-icon{align-items:center;display:flex}.react-paint-editor-button-children{text-align:left;flex:1;align-items:center;display:flex}.react-paint-editor-button-children+.react-paint-editor-button-icon{margin-left:12px}.react-paint-editor-panel{z-index:var(--react-paint-editor-panel-zindex);background:var(--react-paint-editor-app-toolbar-bg);white-space:nowrap;box-sizing:border-box;border-radius:8px;padding:8px;position:absolute;box-shadow:0 3px 8px rgba(0,0,0,.24)}.react-paint-editor-panel[data-alignment=left]{margin:4px;left:0}.react-paint-editor-panel[data-alignment=center]{margin:4px 0;left:50%;transform:translate(-50%)}.react-paint-editor-panel[data-alignment=right]{margin:4px;right:0}.react-paint-editor-panel[data-position=bottom]{bottom:100%}.react-paint-editor-panel[data-position=top]{top:100%}.react-paint-editor-panel[data-fitcontainer=true]{max-width:100%}.react-paint-editor-panel-title{margin-top:4px;margin-bottom:8px;font-size:18px}.react-paint-editor-layouts{background:var(--react-paint-editor-app-toolbar-bg);box-sizing:border-box;min-width:200px;display:inline-block;overflow-y:auto}.react-paint-editor-layouts-remove-button.react-paint-editor-layouts-remove-button{margin:2px 0}.react-paint-editor-layouts-remove-button.react-paint-editor-layouts-remove-button:not(:hover){opacity:.2}.react-paint-editor-layout{background:var(--react-paint-editor-app-toolbar-bg);box-sizing:border-box;border:3px solid transparent;justify-content:space-between;align-items:center;padding:4px 0;display:flex;position:relative}.react-paint-editor-layout[data-is-over="1"]{border:3px dotted var(--react-paint-editor-app-font-hover-bg)}.react-paint-editor-layout[data-is-dragging="1"]{opacity:.4}.react-paint-editor-layout[data-selected="1"]{color:var(--react-paint-editor-app-font-selected-color);background:var(--react-paint-editor-app-font-selected-bg)}.react-paint-editor-layout[data-selected="1"] .react-paint-editor-layouts-remove-button{color:#fff}.react-paint-editor-layout[data-selected="0"][data-disabled="0"]{background:var(--react-paint-editor-app-font-bg);color:var(--react-paint-editor-app-font-color)}.react-paint-editor-layout[data-selected="0"][data-disabled="0"]:hover{color:var(--react-paint-editor-app-font-hover-color);background:var(--react-paint-editor-app-font-hover-bg)}.react-paint-editor-layout[data-disabled="1"]{cursor:default;color:var(--react-paint-editor-app-font-disabled-color);background:var(--react-paint-editor-app-font-disabled-bg)}.react-paint-editor-layout[data-disabled="0"]{cursor:move}.react-paint-editor-layout>span{color:#8a8a8a;height:20px;line-height:1}.react-paint-editor-layout>span>svg{fill:#8a8a8a;width:20px;height:20px;padding:0 4px;transform:scale(.75)}.react-paint-editor-layouts-visible-button.react-paint-editor-layouts-visible-button{margin:2px 0}.react-paint-editor-layouts-visible-button.react-paint-editor-layouts-visible-button[data-visible=false]{opacity:.2}.react-paint-editor-layouts-locked-button.react-paint-editor-layouts-locked-button{margin:2px 0}.react-paint-editor-layouts-locked-button.react-paint-editor-layouts-locked-button[data-locked=false]{opacity:.2}.react-paint-editor-layouts-grid-button.react-paint-editor-layouts-grid-button span{justify-content:center}.react-paint-editor-layouts-subtitle{min-width:60px;font-weight:700}.react-paint-editor-layouts-separator{flex:1}.react-paint-editor-layouts-panel.react-paint-editor-layouts-panel.react-paint-editor-layouts-panel{bottom:0;top:unset}.react-paint-editor-layouts-panel-content{flex-direction:column;max-height:100%;display:flex}.react-paint-editor-layouts-scrolling-content{flex-direction:column;display:flex;overflow-y:auto}.react-paint-editor-layouts-row{align-items:center;display:flex}.react-paint-editor-layouts-placeholder{opacity:.6;text-align:center;padding:12px 0}.react-paint-editor-toolbargroup-panel-content{display:flex}.react-paint-editor-toolbargroup-panel-content[data-vertical="1"]{flex-direction:column}.react-paint-editor-toolbargroup-relative{display:inline-block;position:relative}.react-paint-editor-toolbox-panel-content{display:flex}.react-paint-editor-toolbox-panel-content[data-vertical="1"]{flex-direction:column}.react-paint-editor-toolbox-relative{display:inline-block;position:relative}.react-paint-editor-modal{z-index:var(--react-paint-editor-modal-zindex);justify-content:center;align-items:center;display:flex;position:absolute;top:0;bottom:0;left:0;right:0}.react-paint-editor-modal[data-position=center]{align-items:center}.react-paint-editor-modal[data-position=bottom]{align-items:end}.react-paint-editor-modal-panel{background:var(--react-paint-editor-app-toolbar-bg);white-space:nowrap;border-radius:8px;padding:4px;display:grid;position:relative;box-shadow:0 3px 8px rgba(0,0,0,.24)}.react-paint-editor-modal-mask{background:rgba(0,0,0,.45);position:absolute;top:0;bottom:0;left:0;right:0}.react-paint-editor-toolbox-pictureinput-modal form{grid-template-columns:3fr 1fr 1fr}.react-paint-editor-toolbox-pictureinput-modal form input{color:var(--react-paint-editor-app-font-color);border:1px solid var(--react-paint-editor-app-font-color);background:var(--react-paint-editor-app-toolbar-bg);outline:none}.react-paint-editor-toolbar-shrinkable{text-align:center;flex:1;height:36px;position:relative}.react-paint-editor-toolbar-toolbox{background:var(--react-paint-editor-app-toolbar-bg);border-bottom:1px solid var(--react-paint-editor-app-divider-color);box-sizing:border-box;max-height:36px;display:flex}.react-paint-editor-toolbar-modal{grid-template-columns:1fr 1fr 1fr}.react-paint-editor-colorfield-color{box-sizing:border-box;border-radius:50%;width:20px;height:20px}.react-paint-editor-colorfield-color[data-mode=fill]{background:var(--react-paint-editor-colorfield-color-value);border:1px solid rgba(128,128,128,.22)}.react-paint-editor-colorfield-color[data-mode=stroke]{border:4px solid rgba(128,128,128,.22)}.react-paint-editor-colorfield-color[data-mode=stroke]:after{content:"";border:2px solid var(--react-paint-editor-colorfield-color-value);box-sizing:border-box;border-radius:100%;width:18px;height:18px;display:block;position:relative;top:-3px;left:-3px}.react-paint-editor-colorfield-wrapper{flex-wrap:wrap;display:flex}.react-paint-editor-colorfield-customcolor{box-sizing:border-box;color:var(--react-paint-editor-colorfield-color-value);border-radius:50%;justify-content:center;align-items:baseline;width:20px;height:20px;font-weight:700;display:flex}.react-paint-editor-layout-opened .react-paint-editor-layout-button.react-paint-editor-layout-button.react-paint-editor-layout-button{color:var(--react-paint-editor-app-font-selected-color);background:var(--react-paint-editor-app-font-selected-bg)}.react-paint-editor-rangefield{flex-wrap:wrap;align-items:center;max-width:100%;display:inline-flex}.react-paint-editor-selectfield-wrapper{flex-wrap:wrap;display:flex}.react-paint-editor-fontfamily-option{font-family:var(--react-paint-editor-fontfamily-family)}.react-paint-editor-linetype-option{display:inline-block}.react-paint-editor-linetype-option[data-type="0"]>span{background:currentColor}.react-paint-editor-linetype-option[data-type="2"]{position:relative;left:3px}.react-paint-editor-linetype-option[data-type="2"]>span:nth-child(3n-1){background:currentColor;width:12px}.react-paint-editor-linetype-option[data-type="2"]>span:nth-child(n+11){display:none}.react-paint-editor-linetype-option[data-type="1"]>span:nth-child(odd){background:currentColor}.react-paint-editor-linetype-option>span{vertical-align:middle;background:0 0;width:6px;height:2px;display:inline-block}.react-paint-editor-linearrow-left{border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:15px solid;width:0;height:0;display:inline-block;position:absolute;top:50%;left:0;transform:translate(-25%,-50%)}.react-paint-editor-linearrow-right{border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:15px solid;width:0;height:0;display:inline-block;position:absolute;top:50%;right:0;transform:translate(25%,-50%)}.react-paint-editor-linearrow-option{vertical-align:middle;background:currentColor;width:60px;height:2px;display:inline-block;position:relative}.react-paint-editor-linearrow-option[data-type="0"] .react-paint-editor-linearrow-left,.react-paint-editor-linearrow-option[data-type="1"] .react-paint-editor-linearrow-left,.react-paint-editor-linearrow-option[data-type="0"] .react-paint-editor-linearrow-right,.react-paint-editor-linearrow-option[data-type="2"] .react-paint-editor-linearrow-right{display:none}.react-paint-editor-settings-bar{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:var(--react-paint-editor-app-toolbar-bg);border-top:1px solid var(--react-paint-editor-app-divider-color);box-sizing:border-box;height:36px;display:flex;position:relative}.react-paint-editor-settings-separator{flex:1}.react-paint-editor-settings-modal{grid-template-columns:repeat(auto-fill,40px);width:100%}.react-paint-editor-snackbar-container{z-index:var(--react-paint-editor-snackbar-zindex);flex-direction:column-reverse;align-items:center;height:0;display:flex;position:absolute;bottom:0;left:0;right:0}.react-paint-editor-snackbar{color:#fff;overflow-wrap:break-word;box-sizing:border-box;transition:all var(--react-paint-editor-panel-transition-duration);opacity:0;max-width:calc(100% - 24px);margin:4px;padding:12px 48px;display:inline-block;transform:translateY(40px)}.react-paint-editor-snackbar[data-type=infos]{background:#646464}.react-paint-editor-snackbar[data-type=error]{background:#911717}.react-paint-editor-snackbar[data-type=success]{background:#088900}.react-paint-editor-snackbar[data-is-shown="1"]{opacity:1;transform:translate(0,0)}.react-paint-editor-snackbar[data-is-shown="0"]{opacity:0;transform:translateY(40px)}.react-paint-editor-loading{z-index:var(--react-paint-editor-loading-zindex);transition:opacity var(--react-paint-editor-loading-transition-duration)linear;opacity:0;background:rgba(0,0,0,.314);justify-content:center;align-items:center;display:flex;position:absolute;top:0;bottom:0;left:0;right:0}.react-paint-editor-loading[data-loading=visible]{opacity:1}@keyframes react-paint-editor-loading-rotation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.react-paint-editor-loader{width:40px;height:40px;animation:1s infinite react-paint-editor-loading-rotation;position:relative;transform:rotate(10deg)}.react-paint-editor-loader>div{border-radius:50%;width:15px;height:15px;position:absolute}.react-paint-editor-loader>div:first-child{background-color:#5c6bc0;left:0}.react-paint-editor-loader>div:nth-child(2){background-color:#8bc34a;right:0}.react-paint-editor-loader>div:nth-child(3){background-color:#ffb74d;bottom:0}.react-paint-editor-loader>div:nth-child(4){background-color:#f44336;bottom:0;right:0}.react-paint-editor-app{color:var(--react-paint-editor-app-font-color);flex-direction:column;display:flex;position:relative}.react-paint-editor-app hr{border:none;border-top:1px solid var(--react-paint-editor-app-divider-color);width:100%}.react-paint-editor-app[data-grow=false]{max-width:min(100%,var(--react-paint-editor-app-canvaswidth))}.react-paint-editor-app[data-shrink=false]{min-width:var(--react-paint-editor-app-canvaswidth)}.react-paint-editor-app-row{z-index:var(--react-paint-editor-app-row-zindex);aspect-ratio:var(--react-paint-editor-app-row-aspectratio);flex-direction:row;max-width:100%;display:flex;position:relative}.react-paint-editor-app-row[data-grow=true]{width:100%}.react-paint-editor-app-row[data-grow=false]{width:var(--react-paint-editor-app-row-width)}
1
+ .react-paint-editor-toolbox-edittextbox{transform-origin:0 0;box-sizing:border-box;transform:var(--react-paint-editor-toolbox-edittextbox-transform);color:var(--react-paint-editor-toolbox-edittextbox-color);padding:var(--react-paint-editor-toolbox-edittextbox-padding);line-height:1;font-size:var(--react-paint-editor-toolbox-edittextbox-fontsize);font-family:var(--react-paint-editor-toolbox-edittextbox-fontfamily);opacity:var(--react-paint-editor-toolbox-edittextbox-opacity);background:0 0;outline:none;width:max-content;display:inline-block;position:absolute;top:0;left:0}.react-paint-editor-toolbox-edittextbox[data-fontbold=true]{font-weight:700}.react-paint-editor-toolbox-edittextbox[data-fontitalic=true]{font-style:italic}.react-paint-editor-canvas-box{flex:1;justify-content:center;align-items:center;display:flex}.react-paint-editor-canvas-container{background-color:var(--react-paint-editor-app-canvas-bg);background-repeat:repeat;background-size:16px;display:grid;position:relative;overflow:hidden}.react-paint-editor-canvas-container[data-grow=true]{width:100%;height:100%}.react-paint-editor-canvas-drawcanvas{-webkit-user-select:none;user-select:none;touch-action:none;grid-area:1/1;max-width:100%;display:block}.react-paint-editor-canvas-drawcanvas[data-grow=true]{width:100%}.react-paint-editor-canvas-selectioncanvas{-webkit-user-select:none;user-select:none;touch-action:none;cursor:var(--react-paint-editor-canvas-cursor);grid-area:1/1;max-width:100%;display:block;position:relative}.react-paint-editor-canvas-selectioncanvas[data-grow=true]{width:100%}.react-paint-editor-button{vertical-align:middle;box-sizing:border-box;cursor:pointer;border-radius:var(--react-paint-editor-app-font-radius);color:var(--react-paint-editor-app-font-color);padding:var(--react-paint-editor-button-padding,0);background:0 0;border:none;justify-content:center;align-items:center;min-width:32px;height:32px;margin:2px 4px;font-size:14px;display:inline-flex}.react-paint-editor-button[data-selected="1"]{color:var(--react-paint-editor-app-font-selected-color);background:var(--react-paint-editor-app-font-selected-bg)}.react-paint-editor-button[data-hidden="1"]{visibility:hidden}.react-paint-editor-button[data-disabled="1"]{cursor:default;color:var(--react-paint-editor-app-font-disabled-color);background:var(--react-paint-editor-app-font-disabled-bg)}.react-paint-editor-button[data-selected="0"][data-disabled="0"]{background:var(--react-paint-editor-app-font-bg);color:var(--react-paint-editor-app-font-color)}.react-paint-editor-button[data-selected="0"][data-disabled="0"]:hover{color:var(--react-paint-editor-app-font-hover-color);background:var(--react-paint-editor-app-font-hover-bg)}.react-paint-editor-button[data-disabled="0"]{cursor:pointer}.react-paint-editor-button svg{fill:currentColor;width:20px;height:20px}.react-paint-editor-button input{visibility:hidden;position:absolute}.react-paint-editor-button-content{box-sizing:border-box;width:100%;padding:2px 6px;display:flex}.react-paint-editor-button-icon{align-items:center;display:flex}.react-paint-editor-button-children{text-align:left;flex:1;align-items:center;display:flex}.react-paint-editor-button-children+.react-paint-editor-button-icon{margin-left:12px}.react-paint-editor-panel{z-index:var(--react-paint-editor-panel-zindex);background:var(--react-paint-editor-app-toolbar-bg);white-space:nowrap;box-sizing:border-box;border-radius:8px;padding:8px;position:absolute;box-shadow:0 3px 8px #0000003d}.react-paint-editor-panel[data-alignment=left]{margin:4px;left:0}.react-paint-editor-panel[data-alignment=center]{margin:4px 0;left:50%;transform:translate(-50%)}.react-paint-editor-panel[data-alignment=right]{margin:4px;right:0}.react-paint-editor-panel[data-position=bottom]{bottom:100%}.react-paint-editor-panel[data-position=top]{top:100%}.react-paint-editor-panel[data-fitcontainer=true]{max-width:100%}.react-paint-editor-panel-title{margin-top:4px;margin-bottom:8px;font-size:18px}.react-paint-editor-layouts{background:var(--react-paint-editor-app-toolbar-bg);box-sizing:border-box;min-width:200px;display:inline-block;overflow-y:auto}.react-paint-editor-layouts-remove-button.react-paint-editor-layouts-remove-button{margin:2px 0}.react-paint-editor-layouts-remove-button.react-paint-editor-layouts-remove-button:not(:hover){opacity:.2}.react-paint-editor-layout{background:var(--react-paint-editor-app-toolbar-bg);box-sizing:border-box;border:3px solid #0000;justify-content:space-between;align-items:center;padding:4px 0;display:flex;position:relative}.react-paint-editor-layout[data-is-over="1"]{border:3px dotted var(--react-paint-editor-app-font-hover-bg)}.react-paint-editor-layout[data-is-dragging="1"]{opacity:.4}.react-paint-editor-layout[data-selected="1"]{color:var(--react-paint-editor-app-font-selected-color);background:var(--react-paint-editor-app-font-selected-bg)}.react-paint-editor-layout[data-selected="1"] .react-paint-editor-layouts-remove-button{color:#fff}.react-paint-editor-layout[data-selected="0"][data-disabled="0"]{background:var(--react-paint-editor-app-font-bg);color:var(--react-paint-editor-app-font-color)}.react-paint-editor-layout[data-selected="0"][data-disabled="0"]:hover{color:var(--react-paint-editor-app-font-hover-color);background:var(--react-paint-editor-app-font-hover-bg)}.react-paint-editor-layout[data-disabled="1"]{cursor:default;color:var(--react-paint-editor-app-font-disabled-color);background:var(--react-paint-editor-app-font-disabled-bg)}.react-paint-editor-layout[data-disabled="0"]{cursor:move}.react-paint-editor-layout>span{color:#8a8a8a;height:20px;line-height:1}.react-paint-editor-layout>span>svg{fill:#8a8a8a;width:20px;height:20px;padding:0 4px;transform:scale(.75)}.react-paint-editor-layouts-visible-button.react-paint-editor-layouts-visible-button{margin:2px 0}.react-paint-editor-layouts-visible-button.react-paint-editor-layouts-visible-button[data-visible=false]{opacity:.2}.react-paint-editor-layouts-locked-button.react-paint-editor-layouts-locked-button{margin:2px 0}.react-paint-editor-layouts-locked-button.react-paint-editor-layouts-locked-button[data-locked=false]{opacity:.2}.react-paint-editor-layouts-grid-button.react-paint-editor-layouts-grid-button span{justify-content:center}.react-paint-editor-layouts-subtitle{min-width:60px;font-weight:700}.react-paint-editor-layouts-separator{flex:1}.react-paint-editor-layouts-panel.react-paint-editor-layouts-panel.react-paint-editor-layouts-panel{bottom:0;top:unset}.react-paint-editor-layouts-panel-content{flex-direction:column;max-height:100%;display:flex}.react-paint-editor-layouts-scrolling-content{flex-direction:column;display:flex;overflow-y:auto}.react-paint-editor-layouts-row{align-items:center;display:flex}.react-paint-editor-layouts-placeholder{opacity:.6;text-align:center;padding:12px 0}.react-paint-editor-toolbargroup-panel-content{display:flex}.react-paint-editor-toolbargroup-panel-content[data-vertical="1"]{flex-direction:column}.react-paint-editor-toolbargroup-relative{display:inline-block;position:relative}.react-paint-editor-toolbox-panel-content{display:flex}.react-paint-editor-toolbox-panel-content[data-vertical="1"]{flex-direction:column}.react-paint-editor-toolbox-relative{display:inline-block;position:relative}.react-paint-editor-modal{z-index:var(--react-paint-editor-modal-zindex);justify-content:center;align-items:center;display:flex;position:absolute;top:0;bottom:0;left:0;right:0}.react-paint-editor-modal[data-position=center]{align-items:center}.react-paint-editor-modal[data-position=bottom]{align-items:end}.react-paint-editor-modal-panel{background:var(--react-paint-editor-app-toolbar-bg);white-space:nowrap;border-radius:8px;padding:4px;display:grid;position:relative;box-shadow:0 3px 8px #0000003d}.react-paint-editor-modal-mask{background:#00000073;position:absolute;top:0;bottom:0;left:0;right:0}.react-paint-editor-toolbox-pictureinput-modal form{grid-template-columns:3fr 1fr 1fr}.react-paint-editor-toolbox-pictureinput-modal form input{color:var(--react-paint-editor-app-font-color);border:1px solid var(--react-paint-editor-app-font-color);background:var(--react-paint-editor-app-toolbar-bg);outline:none}.react-paint-editor-toolbar-shrinkable{text-align:center;flex:1;height:36px;position:relative}.react-paint-editor-toolbar-toolbox{background:var(--react-paint-editor-app-toolbar-bg);border-bottom:1px solid var(--react-paint-editor-app-divider-color);box-sizing:border-box;max-height:36px;display:flex}.react-paint-editor-toolbar-modal{grid-template-columns:1fr 1fr 1fr}.react-paint-editor-colorfield-color{box-sizing:border-box;border-radius:50%;width:20px;height:20px}.react-paint-editor-colorfield-color[data-mode=fill]{background:var(--react-paint-editor-colorfield-color-value);border:1px solid #80808038}.react-paint-editor-colorfield-color[data-mode=stroke]{border:4px solid #80808038}.react-paint-editor-colorfield-color[data-mode=stroke]:after{content:"";border:2px solid var(--react-paint-editor-colorfield-color-value);box-sizing:border-box;border-radius:100%;width:18px;height:18px;display:block;position:relative;top:-3px;left:-3px}.react-paint-editor-colorfield-wrapper{flex-wrap:wrap;display:flex}.react-paint-editor-colorfield-customcolor{box-sizing:border-box;color:var(--react-paint-editor-colorfield-color-value);border-radius:50%;justify-content:center;align-items:baseline;width:20px;height:20px;font-weight:700;display:flex}.react-paint-editor-layout-opened .react-paint-editor-layout-button.react-paint-editor-layout-button.react-paint-editor-layout-button{color:var(--react-paint-editor-app-font-selected-color);background:var(--react-paint-editor-app-font-selected-bg)}.react-paint-editor-rangefield{flex-wrap:wrap;align-items:center;max-width:100%;display:inline-flex}.react-paint-editor-selectfield-wrapper{flex-wrap:wrap;display:flex}.react-paint-editor-fontfamily-option{font-family:var(--react-paint-editor-fontfamily-family)}.react-paint-editor-linetype-option{display:inline-block}.react-paint-editor-linetype-option[data-type="0"]>span{background:currentColor}.react-paint-editor-linetype-option[data-type="2"]{position:relative;left:3px}.react-paint-editor-linetype-option[data-type="2"]>span:nth-child(3n-1){background:currentColor;width:12px}.react-paint-editor-linetype-option[data-type="2"]>span:nth-child(n+11){display:none}.react-paint-editor-linetype-option[data-type="1"]>span:nth-child(odd){background:currentColor}.react-paint-editor-linetype-option>span{vertical-align:middle;background:0 0;width:6px;height:2px;display:inline-block}.react-paint-editor-linearrow-left{border-top:5px solid #0000;border-bottom:5px solid #0000;border-right:15px solid;width:0;height:0;display:inline-block;position:absolute;top:50%;left:0;transform:translate(-25%,-50%)}.react-paint-editor-linearrow-right{border-top:5px solid #0000;border-bottom:5px solid #0000;border-left:15px solid;width:0;height:0;display:inline-block;position:absolute;top:50%;right:0;transform:translate(25%,-50%)}.react-paint-editor-linearrow-option{vertical-align:middle;background:currentColor;width:60px;height:2px;display:inline-block;position:relative}.react-paint-editor-linearrow-option[data-type="0"] .react-paint-editor-linearrow-left,.react-paint-editor-linearrow-option[data-type="1"] .react-paint-editor-linearrow-left,.react-paint-editor-linearrow-option[data-type="0"] .react-paint-editor-linearrow-right,.react-paint-editor-linearrow-option[data-type="2"] .react-paint-editor-linearrow-right{display:none}.react-paint-editor-settings-bar{-webkit-user-select:none;user-select:none;background:var(--react-paint-editor-app-toolbar-bg);border-top:1px solid var(--react-paint-editor-app-divider-color);box-sizing:border-box;height:36px;display:flex;position:relative}.react-paint-editor-settings-separator{flex:1}.react-paint-editor-settings-modal{grid-template-columns:repeat(auto-fill,40px);width:100%}.react-paint-editor-snackbar-container{z-index:var(--react-paint-editor-snackbar-zindex);flex-direction:column-reverse;align-items:center;height:0;display:flex;position:absolute;bottom:0;left:0;right:0}.react-paint-editor-snackbar{color:#fff;overflow-wrap:break-word;box-sizing:border-box;transition:all var(--react-paint-editor-panel-transition-duration);opacity:0;max-width:calc(100% - 24px);margin:4px;padding:12px 48px;display:inline-block;transform:translateY(40px)}.react-paint-editor-snackbar[data-type=infos]{background:#646464}.react-paint-editor-snackbar[data-type=error]{background:#911717}.react-paint-editor-snackbar[data-type=success]{background:#088900}.react-paint-editor-snackbar[data-is-shown="1"]{opacity:1;transform:translate(0,0)}.react-paint-editor-snackbar[data-is-shown="0"]{opacity:0;transform:translateY(40px)}.react-paint-editor-loading{z-index:var(--react-paint-editor-loading-zindex);transition:opacity var(--react-paint-editor-loading-transition-duration)linear;opacity:0;background:#00000050;justify-content:center;align-items:center;display:flex;position:absolute;top:0;bottom:0;left:0;right:0}.react-paint-editor-loading[data-loading=visible]{opacity:1}@keyframes react-paint-editor-loading-rotation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.react-paint-editor-loader{width:40px;height:40px;animation:1s infinite react-paint-editor-loading-rotation;position:relative;transform:rotate(10deg)}.react-paint-editor-loader>div{border-radius:50%;width:15px;height:15px;position:absolute}.react-paint-editor-loader>div:first-child{background-color:#5c6bc0;left:0}.react-paint-editor-loader>div:nth-child(2){background-color:#8bc34a;right:0}.react-paint-editor-loader>div:nth-child(3){background-color:#ffb74d;bottom:0}.react-paint-editor-loader>div:nth-child(4){background-color:#f44336;bottom:0;right:0}.react-paint-editor-app{color:var(--react-paint-editor-app-font-color);flex-direction:column;font-family:Arial,Helvetica,sans-serif;display:flex;position:relative}.react-paint-editor-app hr{border:none;border-top:1px solid var(--react-paint-editor-app-divider-color);width:100%}.react-paint-editor-app[data-grow=false]{max-width:min(100%,var(--react-paint-editor-app-canvaswidth))}.react-paint-editor-app[data-shrink=false]{min-width:var(--react-paint-editor-app-canvaswidth)}.react-paint-editor-app-row{z-index:var(--react-paint-editor-app-row-zindex);aspect-ratio:var(--react-paint-editor-app-row-aspectratio);flex-direction:row;max-width:100%;display:flex;position:relative}.react-paint-editor-app-row[data-grow=true]{width:100%}.react-paint-editor-app-row[data-grow=false]{width:var(--react-paint-editor-app-row-width)}