@yorab/react-paint 0.16.3 → 0.17.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.
- package/dist/canvas/components/Canvas.d.ts +2 -0
- package/dist/canvas/constants/app.d.ts +1 -0
- package/dist/canvas/constants/keyboard.d.ts +3 -0
- package/dist/canvas/hooks/useDrawableCanvas.d.ts +3 -1
- package/dist/canvas/hooks/useKeyboard.d.ts +4 -1
- package/dist/canvas/hooks/useReactPaint.d.ts +18 -2
- package/dist/canvas/hooks/useShapes.d.ts +6 -2
- package/dist/canvas/utils/shapes/brush.d.ts +0 -6
- package/dist/canvas/utils/shapes/circle.d.ts +1 -7
- package/dist/canvas/utils/shapes/curve.d.ts +2 -7
- package/dist/canvas/utils/shapes/ellipse.d.ts +1 -7
- package/dist/canvas/utils/shapes/index.d.ts +1 -6
- package/dist/canvas/utils/shapes/line.d.ts +1 -7
- package/dist/canvas/utils/shapes/picture.d.ts +0 -6
- package/dist/canvas/utils/shapes/polygon.d.ts +1 -6
- package/dist/canvas/utils/shapes/rectangle.d.ts +0 -6
- package/dist/common/types/Mode.d.ts +7 -1
- package/dist/editor/components/common/Menu.d.ts +10 -0
- package/dist/editor/components/common/Panel.d.ts +3 -3
- package/dist/editor/components/settings/Layouts.d.ts +2 -2
- package/dist/editor/components/toolbox/ContextMenu.d.ts +23 -0
- package/dist/editor/components/toolbox/MenuGroup.d.ts +1 -8
- package/dist/editor/components/toolbox/ToolbarGroup.d.ts +1 -4
- package/dist/editor/constants/icons.d.ts +1 -0
- package/dist/editor/hooks/useDrag.d.ts +2 -2
- package/dist/editor/hooks/useMenu.d.ts +10 -0
- package/dist/react-paint.css +1 -1
- package/dist/react-paint.js +1421 -1229
- package/dist/react-paint.umd.cjs +1 -1
- package/package.json +1 -1
- package/dist/canvas/utils/string.d.ts +0 -2
- package/dist/editor/components/settings/PointsNumberField.d.ts +0 -13
|
@@ -40,12 +40,14 @@ type DrawerType = {
|
|
|
40
40
|
} | undefined>>;
|
|
41
41
|
setCanvasOffset: (offset: Point) => void;
|
|
42
42
|
isInsideComponent: boolean;
|
|
43
|
+
isInsideCanvas: boolean;
|
|
43
44
|
selectionMode: SelectionModeData<number | Point>;
|
|
44
45
|
setSelectionMode: React.Dispatch<React.SetStateAction<SelectionModeData<number | Point>>>;
|
|
45
46
|
isShiftPressed: boolean;
|
|
46
47
|
isAltPressed: boolean;
|
|
47
48
|
isSpacePressed: boolean;
|
|
48
49
|
withFrameSelection: boolean;
|
|
50
|
+
withContextMenu: boolean;
|
|
49
51
|
withSkeleton: boolean;
|
|
50
52
|
setCanvasMoveAcceleration: React.Dispatch<React.SetStateAction<Point>>;
|
|
51
53
|
};
|
|
@@ -40,6 +40,7 @@ type AppOptionsType = {
|
|
|
40
40
|
withUrlPicture: boolean;
|
|
41
41
|
withFrameSelection: boolean;
|
|
42
42
|
withSkeleton: boolean;
|
|
43
|
+
withContextMenu: boolean;
|
|
43
44
|
clearCallback: 'empty' | 'defaultShapes' | (() => ExportedDrawableShape[]);
|
|
44
45
|
brushAlgo: BrushAlgo;
|
|
45
46
|
isBrushShapeDoneOnMouseUp: boolean;
|
|
@@ -10,6 +10,8 @@ export declare const KeyboardCode: {
|
|
|
10
10
|
readonly Alt: "Alt";
|
|
11
11
|
readonly Option: "Option";
|
|
12
12
|
readonly Space: " ";
|
|
13
|
+
readonly A: "A";
|
|
14
|
+
readonly a: "a";
|
|
13
15
|
readonly z: "z";
|
|
14
16
|
readonly Z: "Z";
|
|
15
17
|
readonly y: "y";
|
|
@@ -19,6 +21,7 @@ export declare const KeyboardCode: {
|
|
|
19
21
|
readonly Zero: "0";
|
|
20
22
|
};
|
|
21
23
|
export declare const KeyboardCommand: {
|
|
24
|
+
readonly Cut: "cut";
|
|
22
25
|
readonly Copy: "copy";
|
|
23
26
|
readonly Paste: "paste";
|
|
24
27
|
};
|
|
@@ -25,6 +25,7 @@ type UseCanvasType = {
|
|
|
25
25
|
} | undefined>>;
|
|
26
26
|
setCanvasOffset: (offset: Point) => void;
|
|
27
27
|
isInsideComponent: boolean;
|
|
28
|
+
isInsideCanvas: boolean;
|
|
28
29
|
selectionMode: SelectionModeData<number | Point>;
|
|
29
30
|
setSelectionMode: React.Dispatch<React.SetStateAction<SelectionModeData<number | Point>>>;
|
|
30
31
|
setSelectionFrame: React.Dispatch<React.SetStateAction<{
|
|
@@ -36,10 +37,11 @@ type UseCanvasType = {
|
|
|
36
37
|
isShiftPressed: boolean;
|
|
37
38
|
isAltPressed: boolean;
|
|
38
39
|
withFrameSelection: boolean;
|
|
40
|
+
withContextMenu: boolean;
|
|
39
41
|
settings: UtilsSettings;
|
|
40
42
|
isSpacePressed: boolean;
|
|
41
43
|
};
|
|
42
|
-
declare const useDrawableCanvas: ({ addShapes, drawCanvasRef, setActiveTool, refreshHoveredShape, shapes, selectionMode, activeTool, isInsideComponent, setCanvasOffset, selectedShape, canvasOffsetStartData, refreshSelectedShapes, setSelectedShape, setSelectionFrame, setCanvasOffsetStartData, updateSingleShape, duplicateShapes, saveShapes, setSelectionMode, setCanvasMoveAcceleration, settings, isShiftPressed, isAltPressed, withFrameSelection, isSpacePressed }: UseCanvasType) => {
|
|
44
|
+
declare const useDrawableCanvas: ({ addShapes, drawCanvasRef, setActiveTool, refreshHoveredShape, shapes, selectionMode, activeTool, isInsideComponent, isInsideCanvas, setCanvasOffset, selectedShape, canvasOffsetStartData, refreshSelectedShapes, setSelectedShape, setSelectionFrame, setCanvasOffsetStartData, updateSingleShape, duplicateShapes, saveShapes, setSelectionMode, setCanvasMoveAcceleration, settings, isShiftPressed, isAltPressed, withFrameSelection, withContextMenu, isSpacePressed }: UseCanvasType) => {
|
|
43
45
|
hoverMode: HoverModeData;
|
|
44
46
|
};
|
|
45
47
|
export default useDrawableCanvas;
|
|
@@ -9,6 +9,7 @@ type UseKeyboardType = {
|
|
|
9
9
|
pasteShapes: (shape: ShapeEntity[]) => void;
|
|
10
10
|
updateShapes: (shapes: ShapeEntity[]) => void;
|
|
11
11
|
setSelectedShape: (value: React.SetStateAction<SelectionType | undefined>) => void;
|
|
12
|
+
selectAllShapes: () => void;
|
|
12
13
|
removeShape: (shape: ShapeEntity[]) => void;
|
|
13
14
|
backwardShape: () => void;
|
|
14
15
|
forwardShape: () => void;
|
|
@@ -25,6 +26,8 @@ type UseKeyboardType = {
|
|
|
25
26
|
settings: UtilsSettings;
|
|
26
27
|
setCanvasZoom: (action: 'unzoom' | 'zoom' | 'default') => void;
|
|
27
28
|
resetZoom: () => void;
|
|
29
|
+
copiedShape: SelectionType | undefined;
|
|
30
|
+
setCopiedShape: (shape: React.SetStateAction<SelectionType | undefined>) => void;
|
|
28
31
|
};
|
|
29
|
-
declare const useKeyboard: ({ isInsideComponent, isInsideCanvas, selectedShape, isEditingText, settings, setSelectedShape, setActiveTool, setCanvasZoom, resetZoom, setSelectionMode, setSelectionFrame, removeShape, pasteShapes, updateShapes, backwardShape, forwardShape, setShiftPressed, setAltPressed, setIsSpacePressed }: UseKeyboardType) => {};
|
|
32
|
+
declare const useKeyboard: ({ isInsideComponent, isInsideCanvas, selectedShape, isEditingText, settings, copiedShape, setCopiedShape, setSelectedShape, setActiveTool, setCanvasZoom, resetZoom, setSelectionMode, setSelectionFrame, selectAllShapes, removeShape, pasteShapes, updateShapes, backwardShape, forwardShape, setShiftPressed, setAltPressed, setIsSpacePressed }: UseKeyboardType) => {};
|
|
30
33
|
export default useKeyboard;
|
|
@@ -15,18 +15,25 @@ type UseReactPaintProps = {
|
|
|
15
15
|
type EditorProps = {
|
|
16
16
|
shapesRef: React.RefObject<ShapeEntity[]>;
|
|
17
17
|
addPictureShape: (fileOrUrl: File | string, maxWidth?: number, maxHeight?: number) => Promise<ShapeEntity>;
|
|
18
|
-
|
|
18
|
+
swapShapes: (startPositionShapeId: string, endPositionShapeId: string) => void;
|
|
19
|
+
moveShapes: (shapes: ShapeEntity[], action: 'first' | 'last' | 'forward' | 'backward') => void;
|
|
19
20
|
toggleShapeVisibility: (shapes: ShapeEntity[]) => void;
|
|
20
21
|
toggleShapeLock: (shapeGroup: ShapeEntity[]) => void;
|
|
21
22
|
canGoBackward: boolean;
|
|
22
23
|
canGoForward: boolean;
|
|
23
24
|
canClear: boolean;
|
|
24
25
|
selectedShape: SelectionType | undefined;
|
|
26
|
+
copiedShape: SelectionType | undefined;
|
|
27
|
+
setCopiedShape: React.Dispatch<React.SetStateAction<SelectionType | undefined>>;
|
|
28
|
+
pasteShapes: (shapes: ShapeEntity[]) => void;
|
|
25
29
|
saveShapes: () => void;
|
|
26
30
|
removeShape: (shapes: ShapeEntity[]) => void;
|
|
27
31
|
updateShape: (updatedShapes: ShapeEntity[], withSave?: boolean) => void;
|
|
32
|
+
duplicateShapes: (shapesToDuplicate: ShapeEntity[], translate?: boolean, selectNewOnes?: boolean) => void;
|
|
28
33
|
backwardShape: () => void;
|
|
29
34
|
forwardShape: () => void;
|
|
35
|
+
removeShapePoint: (shape: ShapeEntity<'curve' | 'polygon'>, pointIndex: number) => void;
|
|
36
|
+
transformShape: (ctx: CanvasRenderingContext2D, shapes: ShapeEntity[], center: Point, action: 'flipHorizontally' | 'flipVertically' | 'rotateClockwise' | 'rotateCounterclockwise') => void;
|
|
30
37
|
refs: {
|
|
31
38
|
canvas: React.RefObject<HTMLCanvasElement | null>;
|
|
32
39
|
editor: React.RefObject<HTMLElement | null>;
|
|
@@ -36,6 +43,7 @@ type EditorProps = {
|
|
|
36
43
|
height: number;
|
|
37
44
|
selectTool: (tool: ToolsType) => void;
|
|
38
45
|
selectShapes: (shapes: ShapeEntity[]) => void;
|
|
46
|
+
selectAllShapes: () => void;
|
|
39
47
|
activeTool: ToolsType;
|
|
40
48
|
setActiveTool: React.Dispatch<React.SetStateAction<ToolsType>>;
|
|
41
49
|
setAvailableTools: React.Dispatch<React.SetStateAction<CustomTool[]>>;
|
|
@@ -47,6 +55,8 @@ type EditorProps = {
|
|
|
47
55
|
exportPicture: (view: 'fitToShapes' | 'defaultView' | 'currentZoom') => void;
|
|
48
56
|
exportData: () => void;
|
|
49
57
|
clearCanvas: () => void;
|
|
58
|
+
selectionMode: SelectionModeData<number | Point>;
|
|
59
|
+
setSelectionMode: React.Dispatch<React.SetStateAction<SelectionModeData<number | Point>>>;
|
|
50
60
|
settings: UtilsSettings;
|
|
51
61
|
setCanvasZoom: (action: 'unzoom' | 'zoom' | 'default') => void;
|
|
52
62
|
resetZoom: () => void;
|
|
@@ -58,11 +68,15 @@ type EditorProps = {
|
|
|
58
68
|
withLoadAndSave: boolean;
|
|
59
69
|
withUploadPicture: boolean;
|
|
60
70
|
withUrlPicture: boolean;
|
|
71
|
+
withContextMenu: boolean;
|
|
61
72
|
};
|
|
62
73
|
};
|
|
63
74
|
type CanvasProps = {
|
|
64
75
|
shapesRef: React.RefObject<ShapeEntity[]>;
|
|
65
76
|
selectedShape: SelectionType | undefined;
|
|
77
|
+
copiedShape: SelectionType | undefined;
|
|
78
|
+
setCopiedShape: React.Dispatch<React.SetStateAction<SelectionType | undefined>>;
|
|
79
|
+
pasteShapes: (shapes: ShapeEntity[]) => void;
|
|
66
80
|
selectionFrame: {
|
|
67
81
|
oldSelection: SelectionType | undefined;
|
|
68
82
|
frame: [Point, Point];
|
|
@@ -78,7 +92,7 @@ type CanvasProps = {
|
|
|
78
92
|
refreshHoveredShape: (e: MouseEvent | TouchEvent, ctx: CanvasRenderingContext2D, cursorPosition: Point, isInsideMask: boolean) => void;
|
|
79
93
|
removeShape: (shapes: ShapeEntity[]) => void;
|
|
80
94
|
updateShape: (updatedShapes: ShapeEntity[], withSave?: boolean) => void;
|
|
81
|
-
duplicateShapes: (shapesToDuplicate: ShapeEntity[]) => void;
|
|
95
|
+
duplicateShapes: (shapesToDuplicate: ShapeEntity[], translate?: boolean, selectNewOnes?: boolean) => void;
|
|
82
96
|
backwardShape: () => void;
|
|
83
97
|
forwardShape: () => void;
|
|
84
98
|
saveShapes: () => void;
|
|
@@ -90,6 +104,7 @@ type CanvasProps = {
|
|
|
90
104
|
width: number;
|
|
91
105
|
height: number;
|
|
92
106
|
selectShapes: (shapes: ShapeEntity[]) => void;
|
|
107
|
+
selectAllShapes: () => void;
|
|
93
108
|
activeTool: ToolsType;
|
|
94
109
|
setActiveTool: React.Dispatch<React.SetStateAction<ToolsType>>;
|
|
95
110
|
isEditMode: boolean;
|
|
@@ -101,6 +116,7 @@ type CanvasProps = {
|
|
|
101
116
|
isInsideComponent: boolean;
|
|
102
117
|
isInsideCanvas: boolean;
|
|
103
118
|
canvas: {
|
|
119
|
+
withContextMenu: boolean;
|
|
104
120
|
withSkeleton: boolean;
|
|
105
121
|
withFrameSelection: boolean;
|
|
106
122
|
canGrow: boolean;
|
|
@@ -16,9 +16,10 @@ declare const useShapes: (settings: UtilsSettings, width: number, height: number
|
|
|
16
16
|
} | undefined>>;
|
|
17
17
|
refreshSelectedShapes: (ctx: CanvasRenderingContext2D, cursorPosition: Point) => void;
|
|
18
18
|
addShapes: (newShapes: ShapeEntity[]) => void;
|
|
19
|
-
duplicateShapes: (shapesToDuplicate: ShapeEntity[]) => void;
|
|
19
|
+
duplicateShapes: (shapesToDuplicate: ShapeEntity[], translate?: boolean, selectNewOnes?: boolean) => void;
|
|
20
20
|
addPictureShape: (fileOrUrl: File | string, maxWidth?: number, maxHeight?: number) => Promise<ShapeEntity>;
|
|
21
|
-
|
|
21
|
+
swapShapes: (startPositionShapeId: string, endPositionShapeId: string) => void;
|
|
22
|
+
moveShapes: (shapes: ShapeEntity[], action: "first" | "last" | "forward" | "backward") => void;
|
|
22
23
|
saveShapes: () => void;
|
|
23
24
|
setSelectedShape: React.Dispatch<React.SetStateAction<SelectionType | undefined>>;
|
|
24
25
|
refreshHoveredShape: (e: MouseEvent | TouchEvent, ctx: CanvasRenderingContext2D, cursorPosition: Point, isInsideMask: boolean) => void;
|
|
@@ -26,6 +27,7 @@ declare const useShapes: (settings: UtilsSettings, width: number, height: number
|
|
|
26
27
|
toggleShapeLock: (shapeGroup: ShapeEntity[]) => void;
|
|
27
28
|
removeShape: (shapes: ShapeEntity[]) => void;
|
|
28
29
|
updateShape: (updatedShapes: ShapeEntity[], withSave?: boolean) => void;
|
|
30
|
+
transformShape: (ctx: CanvasRenderingContext2D, shapes: ShapeEntity[], center: Point, action: "flipHorizontally" | "flipVertically" | "rotateClockwise" | "rotateCounterclockwise") => void;
|
|
29
31
|
backwardShape: () => void;
|
|
30
32
|
forwardShape: () => void;
|
|
31
33
|
clearShapes: (shapesToInit: ShapeEntity[], options: {
|
|
@@ -35,5 +37,7 @@ declare const useShapes: (settings: UtilsSettings, width: number, height: number
|
|
|
35
37
|
canGoBackward: boolean;
|
|
36
38
|
canGoForward: boolean;
|
|
37
39
|
canClear: boolean;
|
|
40
|
+
copiedShape: SelectionType | undefined;
|
|
41
|
+
setCopiedShape: React.Dispatch<React.SetStateAction<SelectionType | undefined>>;
|
|
38
42
|
};
|
|
39
43
|
export default useShapes;
|
|
@@ -4,12 +4,6 @@ import type { DrawableShape, Point, Rect, SelectionType, ShapeEntity } from './.
|
|
|
4
4
|
import type { ToolsSettingsType } from './../../../common/types/tools';
|
|
5
5
|
import { type GroupResizeContext } from './group';
|
|
6
6
|
export declare const getBrushBorder: (brush: DrawableShape<"brush">, { selectionPadding }: Pick<UtilsSettings, "selectionPadding">) => Rect;
|
|
7
|
-
export declare const getComputedBrush: (brush: DrawableShape<"brush">, settings: UtilsSettings) => {
|
|
8
|
-
borders: Rect;
|
|
9
|
-
outerBorders: Rect;
|
|
10
|
-
center: Point;
|
|
11
|
-
boundingBox: Rect;
|
|
12
|
-
};
|
|
13
7
|
export declare const refreshBrush: <T extends DrawableShape<"brush">>(brush: T & {
|
|
14
8
|
id: string;
|
|
15
9
|
}, settings: UtilsSettings) => ShapeEntity<"brush">;
|
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
import type { UtilsSettings } from './../../../canvas/constants/app';
|
|
2
2
|
import type { SelectionModeResize } from './../../../common/types/Mode';
|
|
3
|
-
import type { DrawableShape, Point,
|
|
3
|
+
import type { DrawableShape, Point, SelectionType, ShapeEntity } from './../../../common/types/Shapes';
|
|
4
4
|
import type { ToolsSettingsType } from './../../../common/types/tools';
|
|
5
5
|
import { type GroupResizeContext } from './group';
|
|
6
|
-
export declare const getComputedCircle: (circle: DrawableShape<"circle">, settings: UtilsSettings) => {
|
|
7
|
-
borders: Rect;
|
|
8
|
-
outerBorders: Rect;
|
|
9
|
-
center: Point;
|
|
10
|
-
boundingBox: Rect;
|
|
11
|
-
};
|
|
12
6
|
export declare const refreshCircle: <T extends DrawableShape<"circle">>(shape: T & {
|
|
13
7
|
id: string;
|
|
14
8
|
}, settings: UtilsSettings) => ShapeEntity<"circle">;
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
import type { UtilsSettings } from './../../../canvas/constants/app';
|
|
2
2
|
import type { SelectionModeResize } from './../../../common/types/Mode';
|
|
3
|
-
import type { DrawableShape, Point,
|
|
3
|
+
import type { DrawableShape, Point, ShapeEntity } from './../../../common/types/Shapes';
|
|
4
4
|
import type { ToolsSettingsType } from './../../../common/types/tools';
|
|
5
|
-
export declare const getComputedCurve: (curve: DrawableShape<"curve">, settings: UtilsSettings) => {
|
|
6
|
-
borders: Rect;
|
|
7
|
-
outerBorders: Rect;
|
|
8
|
-
center: Point;
|
|
9
|
-
boundingBox: Rect;
|
|
10
|
-
};
|
|
11
5
|
export declare const refreshCurve: <T extends DrawableShape<"curve">>(shape: T & {
|
|
12
6
|
id: string;
|
|
13
7
|
}, settings: UtilsSettings) => ShapeEntity<"curve">;
|
|
@@ -20,3 +14,4 @@ export declare const resizeCurve: (cursorPosition: Point, originalShape: ShapeEn
|
|
|
20
14
|
export declare const drawCurve: (ctx: CanvasRenderingContext2D, curve: ShapeEntity<"curve">) => void;
|
|
21
15
|
export declare const addCurveLine: (shape: ShapeEntity<"curve">, lineIndex: number, cursorPosition: Point, settings: UtilsSettings) => ShapeEntity<"curve">;
|
|
22
16
|
export declare const addCurvePoint: (shape: ShapeEntity<"curve">, cursorPosition: Point, settings: UtilsSettings, temporary?: boolean) => ShapeEntity<"curve">;
|
|
17
|
+
export declare const removeCurvePoint: (shape: ShapeEntity<"curve">, pointIndex: number, settings: UtilsSettings) => ShapeEntity<"curve">;
|
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
import type { UtilsSettings } from './../../../canvas/constants/app';
|
|
2
2
|
import type { SelectionModeResize } from './../../../common/types/Mode';
|
|
3
|
-
import type { DrawableShape, Point,
|
|
3
|
+
import type { DrawableShape, Point, SelectionType, ShapeEntity } from './../../../common/types/Shapes';
|
|
4
4
|
import type { ToolsSettingsType } from './../../../common/types/tools';
|
|
5
5
|
import { type GroupResizeContext } from './group';
|
|
6
|
-
export declare const getComputedEllipse: (ellipse: DrawableShape<"ellipse">, settings: UtilsSettings) => {
|
|
7
|
-
borders: Rect;
|
|
8
|
-
outerBorders: Rect;
|
|
9
|
-
center: Point;
|
|
10
|
-
boundingBox: Rect;
|
|
11
|
-
};
|
|
12
6
|
export declare const refreshEllipse: <T extends DrawableShape<"ellipse">>(shape: T & {
|
|
13
7
|
id: string;
|
|
14
8
|
}, settings: UtilsSettings) => ShapeEntity<"ellipse">;
|
|
@@ -10,16 +10,11 @@ export declare const drawShape: (ctx: CanvasRenderingContext2D, shape: ShapeEnti
|
|
|
10
10
|
export declare const rotateShape: <T extends ShapeEntity>(shape: T, rotationToApply: number, selectionCenter: Point) => T;
|
|
11
11
|
export declare const resizeShape: <T extends ShapeEntity>(ctx: CanvasRenderingContext2D, cursorPosition: Point, originalShape: T, selectionMode: SelectionModeData<Point | number>, settings: UtilsSettings, isShiftPressed: boolean, isAltPressed: boolean) => T;
|
|
12
12
|
export declare const resizeShapes: (ctx: CanvasRenderingContext2D, cursorPosition: Point, originalShape: SelectionType, selectionMode: SelectionModeResize<Point | number>, settings: UtilsSettings, isShiftPressed: boolean, isAltPressed: boolean) => ShapeEntity[];
|
|
13
|
+
export declare const flipShapes: (ctx: CanvasRenderingContext2D, shapes: ShapeEntity[], selectedShapes: ShapeEntity[], center: Point, action: "flipHorizontally" | "flipVertically", settings: UtilsSettings) => ShapeEntity[];
|
|
13
14
|
export declare const translateShapes: (cursorPosition: Point, originalShape: SelectionType, originalCursorPosition: Point, settings: UtilsSettings, isShiftPressed: boolean) => ShapeEntity[];
|
|
14
15
|
export declare const refreshShape: (shape: DrawableShape & {
|
|
15
16
|
id: string;
|
|
16
17
|
}, settings: UtilsSettings) => ShapeEntity;
|
|
17
|
-
export declare const getShapeComputedData: (shape: DrawableShape, settings: UtilsSettings) => {
|
|
18
|
-
borders: import("./../../../common/types/Shapes").Rect;
|
|
19
|
-
outerBorders: import("./../../../common/types/Shapes").Rect;
|
|
20
|
-
center: Point;
|
|
21
|
-
boundingBox: import("./../../../common/types/Shapes").Rect;
|
|
22
|
-
} | undefined;
|
|
23
18
|
export declare const drawShapeSelection: ({ ctx, shape, settings, selectionWidth, selectionColor, hoverMode, selectionMode, withAnchors }: {
|
|
24
19
|
ctx: CanvasRenderingContext2D;
|
|
25
20
|
shape: SelectionType;
|
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
import type { UtilsSettings } from './../../../canvas/constants/app';
|
|
2
2
|
import type { SelectionModeResize } from './../../../common/types/Mode';
|
|
3
|
-
import type { DrawableShape, Point,
|
|
3
|
+
import type { DrawableShape, Point, SelectionType, ShapeEntity, StyleShape, Triangle } from './../../../common/types/Shapes';
|
|
4
4
|
import type { ToolsSettingsType } from './../../../common/types/tools';
|
|
5
5
|
import { type GroupResizeContext } from './group';
|
|
6
|
-
export declare const getComputedLine: (line: DrawableShape<"line">, settings: UtilsSettings) => {
|
|
7
|
-
borders: Rect;
|
|
8
|
-
outerBorders: Rect;
|
|
9
|
-
center: Point;
|
|
10
|
-
boundingBox: Rect;
|
|
11
|
-
};
|
|
12
6
|
export declare const refreshLine: <T extends DrawableShape<"line">>(line: T & {
|
|
13
7
|
id: string;
|
|
14
8
|
}, settings: UtilsSettings) => ShapeEntity<"line">;
|
|
@@ -2,12 +2,6 @@ import type { UtilsSettings } from './../../../canvas/constants/app';
|
|
|
2
2
|
import type { SelectionModeResize } from './../../../common/types/Mode';
|
|
3
3
|
import type { DrawableShape, Point, SelectionType, ShapeEntity } from './../../../common/types/Shapes';
|
|
4
4
|
import { type GroupResizeContext } from './group';
|
|
5
|
-
export declare const getComputedPicture: (picture: DrawableShape<"picture">, settings: UtilsSettings) => {
|
|
6
|
-
borders: import("./../../../common/types/Shapes").Rect;
|
|
7
|
-
outerBorders: import("./../../../common/types/Shapes").Rect;
|
|
8
|
-
center: Point;
|
|
9
|
-
boundingBox: import("./../../../common/types/Shapes").Rect;
|
|
10
|
-
};
|
|
11
5
|
export declare const refreshPicture: <T extends DrawableShape<"picture">>(shape: T & {
|
|
12
6
|
id: string;
|
|
13
7
|
}, settings: UtilsSettings) => ShapeEntity<"picture">;
|
|
@@ -2,12 +2,6 @@ import type { UtilsSettings } from './../../../canvas/constants/app';
|
|
|
2
2
|
import type { SelectionModeResize } from './../../../common/types/Mode';
|
|
3
3
|
import type { DrawableShape, Point, Polygon, Rect, ShapeEntity } from './../../../common/types/Shapes';
|
|
4
4
|
import type { ToolsSettingsType } from './../../../common/types/tools';
|
|
5
|
-
export declare const getComputedPolygon: (polygon: DrawableShape<"polygon">, settings: UtilsSettings) => {
|
|
6
|
-
borders: Rect;
|
|
7
|
-
outerBorders: Rect;
|
|
8
|
-
center: Point;
|
|
9
|
-
boundingBox: Rect;
|
|
10
|
-
};
|
|
11
5
|
export declare const refreshPolygon: <T extends DrawableShape<"polygon">>(shape: T & {
|
|
12
6
|
id: string;
|
|
13
7
|
}, settings: UtilsSettings) => ShapeEntity<"polygon">;
|
|
@@ -21,3 +15,4 @@ export declare const getPolygonBorder: (polygon: Polygon, settings: Pick<UtilsSe
|
|
|
21
15
|
export declare const resizePolygon: (cursorPosition: Point, originalShape: ShapeEntity<"polygon">, selectionMode: SelectionModeResize<number>, settings: UtilsSettings) => ShapeEntity<"polygon">;
|
|
22
16
|
export declare const addPolygonLine: (shape: ShapeEntity<"polygon">, lineIndex: number, cursorPosition: Point, settings: UtilsSettings) => ShapeEntity<"polygon">;
|
|
23
17
|
export declare const addPolygonPoint: (shape: ShapeEntity<"polygon">, cursorPosition: Point, settings: UtilsSettings, temporary?: boolean) => ShapeEntity<"polygon">;
|
|
18
|
+
export declare const removePolygonPoint: (shape: ShapeEntity<"polygon">, pointIndex: number, settings: UtilsSettings) => ShapeEntity<"polygon">;
|
|
@@ -4,12 +4,6 @@ import type { DrawableShape, Point, Rect, SelectionType, ShapeEntity } from './.
|
|
|
4
4
|
import type { ToolsSettingsType } from './../../../common/types/tools';
|
|
5
5
|
import { type GroupResizeContext } from './group';
|
|
6
6
|
type rectish = 'rect' | 'square';
|
|
7
|
-
export declare const getComputedRect: (rect: DrawableShape<rectish>, settings: UtilsSettings) => {
|
|
8
|
-
borders: Rect;
|
|
9
|
-
outerBorders: Rect;
|
|
10
|
-
center: Point;
|
|
11
|
-
boundingBox: Rect;
|
|
12
|
-
};
|
|
13
7
|
export declare const refreshRect: <T extends rectish>(rect: DrawableShape<rectish> & {
|
|
14
8
|
id: string;
|
|
15
9
|
}, settings: UtilsSettings) => ShapeEntity<T>;
|
|
@@ -37,7 +37,13 @@ export type SelectionModeTranslate = {
|
|
|
37
37
|
hasBeenDuplicated: boolean;
|
|
38
38
|
dateStart: number;
|
|
39
39
|
};
|
|
40
|
-
export type
|
|
40
|
+
export type SelectionModeContextMenu<AnchorType extends Point | number = Point> = {
|
|
41
|
+
mode: 'contextMenu';
|
|
42
|
+
cursorStartPosition: Point;
|
|
43
|
+
originalShape: SelectionType | undefined;
|
|
44
|
+
anchor: AnchorType | undefined;
|
|
45
|
+
};
|
|
46
|
+
export type SelectionModeData<AnchorType extends Point | number> = SelectionModeDefault | SelectionModeSelectionFrame | SelectionModeBrush | SelectionModeResize<AnchorType> | SelectionModeRotate | SelectionModeTranslate | SelectionModeEditText | SelectionModePreview | SelectionModeContextMenu<AnchorType>;
|
|
41
47
|
export type HoverModeData = {
|
|
42
48
|
outOfView?: boolean;
|
|
43
49
|
} & ({
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import './Menu.css';
|
|
2
|
+
type MenuType = {
|
|
3
|
+
alignment?: 'left' | 'center' | 'right' | undefined;
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
className?: string;
|
|
6
|
+
style?: React.CSSProperties;
|
|
7
|
+
position?: 'top' | 'bottom' | 'left' | 'right' | undefined;
|
|
8
|
+
};
|
|
9
|
+
declare const Menu: ({ alignment, children, className, style, position }: MenuType) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export default Menu;
|
|
@@ -4,11 +4,11 @@ import type { CSSProperties } from 'react';
|
|
|
4
4
|
type PanelType = {
|
|
5
5
|
vertical?: boolean;
|
|
6
6
|
children: React.ReactNode;
|
|
7
|
-
style?: CSSProperties;
|
|
7
|
+
style?: CSSProperties | undefined;
|
|
8
8
|
title?: string;
|
|
9
|
-
className?: string;
|
|
9
|
+
className?: string | undefined;
|
|
10
10
|
fitContainer?: boolean;
|
|
11
|
-
position?: 'bottom' | 'top';
|
|
11
|
+
position?: 'bottom' | 'top' | 'left' | 'right' | undefined;
|
|
12
12
|
alignment?: 'left' | 'right' | 'center' | undefined;
|
|
13
13
|
};
|
|
14
14
|
declare const Panel: ({ children, title, className, position, fitContainer, alignment, style, ...props }: PanelType) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -12,8 +12,8 @@ type LayoutsType = {
|
|
|
12
12
|
toggleShapeLock: (shape: ShapeEntity[]) => void;
|
|
13
13
|
selectedShapes: SelectionType | undefined;
|
|
14
14
|
selectShapes: (shapes: ShapeEntity[]) => void;
|
|
15
|
-
|
|
15
|
+
swapShapes: (startPositionShapeId: string, endPositionShapeId: string) => void;
|
|
16
16
|
isLayoutPanelShown: boolean;
|
|
17
17
|
};
|
|
18
|
-
declare const Layouts: ({ gridFormat, setGridFormat, settings, shapes, removeShape, toggleShapeVisibility, toggleShapeLock, selectedShapes,
|
|
18
|
+
declare const Layouts: ({ gridFormat, setGridFormat, settings, shapes, removeShape, toggleShapeVisibility, toggleShapeLock, selectedShapes, swapShapes, selectShapes, isLayoutPanelShown }: LayoutsType) => import("react/jsx-runtime").JSX.Element | null;
|
|
19
19
|
export default Layouts;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { UtilsSettings } from './../../../canvas/constants/app';
|
|
2
|
+
import './ContextMenu.css';
|
|
3
|
+
import type { SelectionModeContextMenu } from './../../../common/types/Mode';
|
|
4
|
+
import type { Point, SelectionType, ShapeEntity } from './../../../common/types/Shapes';
|
|
5
|
+
type ContextMenuType = {
|
|
6
|
+
selectionMode: SelectionModeContextMenu<Point | number>;
|
|
7
|
+
settings: UtilsSettings;
|
|
8
|
+
canvasRef: React.RefObject<HTMLCanvasElement | null>;
|
|
9
|
+
selectAllShapes: () => void;
|
|
10
|
+
closeContextMenu: () => void;
|
|
11
|
+
toggleShapeVisibility: (shapes: ShapeEntity[]) => void;
|
|
12
|
+
toggleShapeLock: (shapes: ShapeEntity[]) => void;
|
|
13
|
+
removeShape: (shapes: ShapeEntity[]) => void;
|
|
14
|
+
duplicateShapes: (shapesToDuplicate: ShapeEntity[], translate?: boolean, selectNewOnes?: boolean) => void;
|
|
15
|
+
setCopiedShape: (shape: React.SetStateAction<SelectionType | undefined>) => void;
|
|
16
|
+
copiedShape: SelectionType | undefined;
|
|
17
|
+
pasteShapes: (shapes: ShapeEntity[]) => void;
|
|
18
|
+
moveShapes: (shapes: ShapeEntity[], action: 'first' | 'last' | 'forward' | 'backward') => void;
|
|
19
|
+
removeShapePoint: (shape: ShapeEntity<'curve' | 'polygon'>, pointIndex: number) => void;
|
|
20
|
+
transformShape: (ctx: CanvasRenderingContext2D, shapes: ShapeEntity[], center: Point, action: 'flipHorizontally' | 'flipVertically' | 'rotateClockwise' | 'rotateCounterclockwise') => void;
|
|
21
|
+
};
|
|
22
|
+
declare const ContextMenu: ({ moveShapes, selectAllShapes, selectionMode, transformShape, settings, canvasRef, closeContextMenu, toggleShapeVisibility, toggleShapeLock, removeShape, duplicateShapes, copiedShape, setCopiedShape, pasteShapes, removeShapePoint }: ContextMenuType) => import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
export default ContextMenu;
|
|
@@ -1,16 +1,9 @@
|
|
|
1
|
-
import type { ShapeType } from './../../../common/types/Shapes';
|
|
2
1
|
import type { ToolsType } from './../../../common/types/tools';
|
|
3
2
|
import './MenuGroup.css';
|
|
4
3
|
type MenuGroupType = {
|
|
5
4
|
activeTool: ToolsType;
|
|
6
5
|
withActionsInMenu: boolean;
|
|
7
|
-
group: {
|
|
8
|
-
tools?: ShapeType[];
|
|
9
|
-
title: string;
|
|
10
|
-
img: string;
|
|
11
|
-
};
|
|
12
6
|
vertical?: boolean;
|
|
13
|
-
alignment?: 'left' | 'center' | 'right';
|
|
14
7
|
title?: string;
|
|
15
8
|
disabled?: boolean;
|
|
16
9
|
img?: string;
|
|
@@ -30,5 +23,5 @@ type MenuGroupType = {
|
|
|
30
23
|
redoAction: () => void;
|
|
31
24
|
clearCanvas: () => void;
|
|
32
25
|
};
|
|
33
|
-
declare const MenuGroup: ({ activeTool, withActionsInMenu, hasActionToUndo, hasActionToRedo, hasActionToClear, undoAction, redoAction, clearCanvas,
|
|
26
|
+
declare const MenuGroup: ({ activeTool, withActionsInMenu, hasActionToUndo, hasActionToRedo, hasActionToClear, undoAction, redoAction, clearCanvas, disabled, withLoadAndSave, withExport, addPicture, loadFile, togglePictureUrlModal, saveFile, toggleExportModal, withUploadPicture, withUrlPicture }: MenuGroupType) => import("react/jsx-runtime").JSX.Element | null;
|
|
34
27
|
export default MenuGroup;
|
|
@@ -7,11 +7,8 @@ type ToolbarGroupType = {
|
|
|
7
7
|
toolsType: CustomTool[];
|
|
8
8
|
vertical: boolean;
|
|
9
9
|
};
|
|
10
|
-
alignment?: 'left' | 'center' | 'right';
|
|
11
|
-
title?: string;
|
|
12
10
|
disabled?: boolean;
|
|
13
|
-
img?: string;
|
|
14
11
|
setActiveToolFromId: (id: string) => void;
|
|
15
12
|
};
|
|
16
|
-
declare const ToolbarGroup: ({ activeTool,
|
|
13
|
+
declare const ToolbarGroup: ({ activeTool, group, disabled, setActiveToolFromId }: ToolbarGroupType) => import("react/jsx-runtime").JSX.Element | null;
|
|
17
14
|
export default ToolbarGroup;
|
|
@@ -16,6 +16,7 @@ export declare const openFileIcon = "<svg><path d=\"M3.417 16.667Q2.729 16.667 2
|
|
|
16
16
|
export declare const pictureIcon = "<svg><path d=\"M4.792 15.083 8.333 11.542 9.833 13.021 11.667 10.708 15.167 15.083ZM6.667 8.417Q5.938 8.417 5.427 7.906Q4.917 7.396 4.917 6.667Q4.917 5.938 5.427 5.427Q5.938 4.917 6.667 4.917Q7.396 4.917 7.906 5.427Q8.417 5.938 8.417 6.667Q8.417 7.396 7.906 7.906Q7.396 8.417 6.667 8.417ZM4.167 18.333Q3.125 18.333 2.396 17.604Q1.667 16.875 1.667 15.833V4.167Q1.667 3.125 2.396 2.396Q3.125 1.667 4.167 1.667H15.833Q16.875 1.667 17.604 2.396Q18.333 3.125 18.333 4.167V15.833Q18.333 16.875 17.604 17.604Q16.875 18.333 15.833 18.333ZM4.167 16.583H15.833Q16.146 16.583 16.365 16.365Q16.583 16.146 16.583 15.833V4.167Q16.583 3.854 16.365 3.635Q16.146 3.417 15.833 3.417H4.167Q3.854 3.417 3.635 3.635Q3.417 3.854 3.417 4.167V15.833Q3.417 16.146 3.635 16.365Q3.854 16.583 4.167 16.583Z\"/></svg>";
|
|
17
17
|
export declare const textIcon = "<svg><path d=\"M8.708 16.667V5.917H4.167V3.333H15.833V5.917H11.292V16.667Z\"/></svg>";
|
|
18
18
|
export declare const arrowIcon = "<svg><path d=\"M7.5 15.833V14.083H12.833L3.333 4.583L4.583 3.333L14.083 12.833V7.5H15.833V15.833Z\"/></svg>";
|
|
19
|
+
export declare const rightChevronIcon = "<svg viewBox=\"0 -960 960 960\"><path d=\"M504-480 320-664l56-56 240 240-240 240-56-56 184-184Z\"/></svg>";
|
|
19
20
|
export declare const cursorIcon = "<svg><path d=\"M8.0145 11.1707C8.38484 10.9914 8.82183 11.1558 8.99959 11.5295L10.7031 15.2591L12.0363 14.6238L10.3254 10.9017C10.1476 10.528 10.3106 10.0795 10.6809 9.90761L10.8883 9.84782L12.5918 9.51148L6.48133 4.33192V12.389L7.82934 11.2903L8.0145 11.1707ZM10.6587 16.9258C10.2883 17.1052 9.84395 16.9482 9.67359 16.5745L8.05894 13.0318L6.19988 14.5416C6.07396 14.6462 5.91842 14.706 5.74066 14.706C5.54423 14.706 5.35584 14.6272 5.21694 14.4871C5.07803 14.3469 5 14.1568 5 13.9586V2.74741C5 2.54919 5.07803 2.35908 5.21694 2.21891C5.35584 2.07874 5.54423 2 5.74066 2C5.91842 2 6.08878 2.06727 6.21469 2.1719L6.2221 2.16443L14.7323 9.36947C15.0508 9.63854 15.0879 10.1094 14.8286 10.4233C14.7175 10.5579 14.562 10.6475 14.4064 10.6774L12.0659 11.1408L13.6954 14.6761C13.888 15.0498 13.7102 15.4908 13.3399 15.6627L10.6587 16.9258Z\"/></svg>";
|
|
20
21
|
export declare const moveIcon = "<svg viewBox=\"0 -960 960 960\"><path d=\"M412-48q-21.95 0-40.98-9Q352-66 338-83L48-434l27-28q17-17 41.5-20.5T162-473l126 74v-381q0-15.3 10.29-25.65Q308.58-816 323.79-816t25.71 10.35Q360-795.3 360-780v300h80v-396q0-15.3 10.29-25.65Q460.58-912 475.79-912t25.71 10.35Q512-891.3 512-876v396h80v-348q0-15.3 10.29-25.65Q612.58-864 627.79-864t25.71 10.35Q664-843.3 664-828v348h80v-252q0-15.3 10.29-25.65Q764.58-768 779.79-768t25.71 10.35Q816-747.3 816-732v540q0 60-42 102T672-48H412Z\"/></svg>";
|
|
21
22
|
export declare const menuIcon = "<svg><path d=\"M2.5 15V13.25H17.5V15ZM2.5 10.875V9.125H17.5V10.875ZM2.5 6.75V5H17.5V6.75Z\"/></svg>";
|
|
@@ -7,9 +7,9 @@ type useDragType = {
|
|
|
7
7
|
layoutDragging: string | undefined;
|
|
8
8
|
setLayoutDragging: (shapeId: string | undefined) => void;
|
|
9
9
|
handleSelect: (shape: ShapeEntity[]) => void;
|
|
10
|
-
|
|
10
|
+
onSwapShapes: (firstShapeId: string, lastShapeId: string) => void;
|
|
11
11
|
};
|
|
12
|
-
declare const useDrag: ({ disabled, ref, shape, layoutDragging, setLayoutDragging, handleSelect,
|
|
12
|
+
declare const useDrag: ({ disabled, ref, shape, layoutDragging, setLayoutDragging, handleSelect, onSwapShapes }: useDragType) => {
|
|
13
13
|
isOver: boolean;
|
|
14
14
|
};
|
|
15
15
|
export default useDrag;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
type UseMenuProps = {
|
|
2
|
+
trigger?: 'click' | 'hover';
|
|
3
|
+
buttonElt: HTMLElement | null;
|
|
4
|
+
};
|
|
5
|
+
declare const useMenu: ({ trigger, buttonElt }: UseMenuProps) => {
|
|
6
|
+
isOpen: boolean;
|
|
7
|
+
trigger: "click" | "hover";
|
|
8
|
+
closeMenu: () => void;
|
|
9
|
+
};
|
|
10
|
+
export default useMenu;
|
package/dist/react-paint.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.react-paint-canvas-box{flex:1;justify-content:center;align-items:center;display:flex}.react-paint-canvas-container{background-color:var(--react-paint-app-canvas-bg);cursor:var(--react-paint-canvas-cursor);background-repeat:repeat;background-size:16px;display:grid;position:relative;overflow:hidden}.react-paint-canvas-container[data-grow=true]{width:100%;height:100%}.react-paint-canvas-drawcanvas{-webkit-user-select:none;user-select:none;touch-action:none;grid-area:1/1;max-width:100%;display:block;position:relative}.react-paint-canvas-drawcanvas:focus:not(:focus-visible){outline:none}.react-paint-canvas-drawcanvas[data-grow=true]{width:100%}.react-paint-canvas-selectioncanvas{-webkit-user-select:none;user-select:none;pointer-events:none;touch-action:none;grid-area:1/1;max-width:100%;display:block;position:relative}.react-paint-canvas-selectioncanvas[data-grow=true]{width:100%}.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-app-row{max-width:100%;aspect-ratio:var(--react-paint-app-row-aspectratio);width:100%;position:relative}.react-paint-app-row[data-grow=false]{max-width:calc(var(--react-paint-app-canvaswidth) * 1px)}.react-paint-app-row[data-shrink=false]{min-width:calc(var(--react-paint-app-canvaswidth) * 1px)}.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-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;max-width:calc(100% - 24px);transition:all var(--react-paint-editor-panel-transition-duration);opacity:0;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-button{vertical-align:middle;box-sizing:border-box;cursor:pointer;border-radius:var(--react-paint-editor-app-font-radius);min-width:32px;height:32px;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;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{display:none}.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:36px;top:unset}.react-paint-editor-layouts-panel.react-paint-editor-layouts-panel.react-paint-editor-layouts-panel[data-edit="0"]{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-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-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;width:20px;height:20px;color:var(--react-paint-editor-colorfield-color-value);border-radius:50%;justify-content:center;align-items:baseline;font-weight:700;display:flex}.react-paint-editor-fontfamily-option{font-family:var(--react-paint-editor-fontfamily-family)}.react-paint-editor-selectfield-wrapper{flex-wrap:wrap;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-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-linetype-option{display:inline-block}.react-paint-editor-linetype-option>span{vertical-align:middle;background:0 0;width:6px;height:2px;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-rangefield{flex-wrap:wrap;align-items:center;max-width:100%;display:inline-flex}.react-paint-editor-rangefield [data-indeterminate="1"]{opacity:.25}.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-shrinkable{text-align:left;flex:1;height:100%;display:flex;position:relative}.react-paint-editor-settings-modal{grid-template-columns:repeat(auto-fill,40px);width:100%}.react-paint-editor-zoom-button{margin:0}.react-paint-editor-zoom-button .react-paint-editor-button-children{justify-content:center}.react-paint-editor-zoom-button-value{min-width:60px}.react-paint-editor-bar-zoom-button-opened.react-paint-editor-bar-zoom-button-opened.react-paint-editor-bar-zoom-button-opened.react-paint-editor-bar-zoom-button-opened{color:var(--react-paint-editor-app-font-selected-color);background:var(--react-paint-editor-app-font-selected-bg)}.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-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:100%;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;min-width:var(--react-paint-editor-toolbar-minwidth);display:flex}.react-paint-editor-toolbar-modal{grid-template-columns:1fr 1fr 1fr}.react-paint-editor-toolbox-export-modal h3{margin-top:8px;margin-bottom:0;font-size:18px}.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-app{color:var(--react-paint-editor-app-font-color);max-width:min(100%, var(--react-paint-editor-app-maxWidth));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%}
|
|
1
|
+
.react-paint-canvas-box{flex:1;justify-content:center;align-items:center;display:flex}.react-paint-canvas-container{background-color:var(--react-paint-app-canvas-bg);cursor:var(--react-paint-canvas-cursor);background-repeat:repeat;background-size:16px;display:grid;position:relative;overflow:hidden}.react-paint-canvas-container[data-grow=true]{width:100%;height:100%}.react-paint-canvas-drawcanvas{-webkit-user-select:none;user-select:none;touch-action:none;grid-area:1/1;max-width:100%;display:block;position:relative}.react-paint-canvas-drawcanvas:focus:not(:focus-visible){outline:none}.react-paint-canvas-drawcanvas[data-grow=true]{width:100%}.react-paint-canvas-selectioncanvas{-webkit-user-select:none;user-select:none;pointer-events:none;touch-action:none;grid-area:1/1;max-width:100%;display:block;position:relative}.react-paint-canvas-selectioncanvas[data-grow=true]{width:100%}.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-app-row{max-width:100%;aspect-ratio:var(--react-paint-app-row-aspectratio);width:100%;position:relative}.react-paint-app-row[data-grow=false]{max-width:calc(var(--react-paint-app-canvaswidth) * 1px)}.react-paint-app-row[data-shrink=false]{min-width:calc(var(--react-paint-app-canvaswidth) * 1px)}.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-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;max-width:calc(100% - 24px);transition:all var(--react-paint-editor-panel-transition-duration);opacity:0;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-button{vertical-align:middle;box-sizing:border-box;cursor:pointer;border-radius:var(--react-paint-editor-app-font-radius);min-width:32px;height:32px;color:var(--react-paint-editor-app-font-color);padding:var(--react-paint-editor-button-padding,0);-webkit-user-select:none;user-select:none;background:0 0;border:none;justify-content:center;align-items:center;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{display:none}.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=right]{top:0;left:100%}.react-paint-editor-panel[data-position=left]{top:0;right: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:36px;top:unset}.react-paint-editor-layouts-panel.react-paint-editor-layouts-panel.react-paint-editor-layouts-panel[data-edit="0"]{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-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-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;width:20px;height:20px;color:var(--react-paint-editor-colorfield-color-value);border-radius:50%;justify-content:center;align-items:baseline;font-weight:700;display:flex}.react-paint-editor-fontfamily-option{font-family:var(--react-paint-editor-fontfamily-family)}.react-paint-editor-selectfield-wrapper{flex-wrap:wrap;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-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-linetype-option{display:inline-block}.react-paint-editor-linetype-option>span{vertical-align:middle;background:0 0;width:6px;height:2px;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-rangefield{flex-wrap:wrap;align-items:center;max-width:100%;display:inline-flex}.react-paint-editor-rangefield [data-indeterminate="1"]{opacity:.25}.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-shrinkable{text-align:left;flex:1;height:100%;display:flex;position:relative}.react-paint-editor-settings-modal{grid-template-columns:repeat(auto-fill,40px);width:100%}.react-paint-editor-zoom-button{margin:0}.react-paint-editor-zoom-button .react-paint-editor-button-children{justify-content:center}.react-paint-editor-zoom-button-value{min-width:60px}.react-paint-editor-bar-zoom-button-opened.react-paint-editor-bar-zoom-button-opened.react-paint-editor-bar-zoom-button-opened.react-paint-editor-bar-zoom-button-opened{color:var(--react-paint-editor-app-font-selected-color);background:var(--react-paint-editor-app-font-selected-bg)}.react-paint-editor-menu{flex-direction:column;display:flex}.react-paint-editor-toolbox-relative{display:inline-block;position:relative}.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:100%;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;min-width:var(--react-paint-editor-toolbar-minwidth);display:flex}.react-paint-editor-toolbar-modal{grid-template-columns:1fr 1fr 1fr}.react-paint-editor-toolbox-export-modal h3{margin-top:8px;margin-bottom:0;font-size:18px}.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-app{color:var(--react-paint-editor-app-font-color);max-width:min(100%, var(--react-paint-editor-app-maxWidth));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-toolbox-contextmenu{transform:var(--react-paint-editor-toolbox-contextmenu-transform);width:160px;top:0;left:0}.react-paint-editor-toolbox-contextmenu-group{flex-direction:column;display:flex;position:relative}
|