@bwp-web/canvas 0.4.3 → 0.5.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/background.d.ts +16 -8
- package/dist/background.d.ts.map +1 -1
- package/dist/constants.d.ts +2 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/hooks/useEditCanvas.d.ts +2 -2
- package/dist/hooks/useEditCanvas.d.ts.map +1 -1
- package/dist/hooks/useViewCanvas.d.ts.map +1 -1
- package/dist/index.cjs +114 -36
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +103 -26
- package/dist/index.js.map +1 -1
- package/dist/interactions/dragToCreate.d.ts +6 -1
- package/dist/interactions/dragToCreate.d.ts.map +1 -1
- package/dist/serialization.d.ts +13 -0
- package/dist/serialization.d.ts.map +1 -1
- package/dist/styles.d.ts +6 -0
- package/dist/styles.d.ts.map +1 -1
- package/dist/viewport.d.ts +6 -6
- package/dist/viewport.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/background.d.ts
CHANGED
|
@@ -19,15 +19,23 @@ export interface FitViewportOptions {
|
|
|
19
19
|
*/
|
|
20
20
|
export declare function fitViewportToBackground(canvas: FabricCanvas, options?: FitViewportOptions): void;
|
|
21
21
|
/**
|
|
22
|
-
* Set the
|
|
23
|
-
*
|
|
22
|
+
* Set the contrast of the canvas background image.
|
|
23
|
+
*
|
|
24
|
+
* Value is expressed as a 0–2 scale:
|
|
25
|
+
* - **0**: minimum contrast (flat grey).
|
|
26
|
+
* - **1**: normal / unmodified (no filter applied).
|
|
27
|
+
* - **2**: maximum contrast (darks are truly dark, lights truly light).
|
|
28
|
+
*
|
|
29
|
+
* Clamped to the 0–2 range.
|
|
24
30
|
*/
|
|
25
|
-
export declare function
|
|
31
|
+
export declare function setBackgroundContrast(canvas: FabricCanvas, value: number): void;
|
|
26
32
|
/**
|
|
27
|
-
* Get the current
|
|
33
|
+
* Get the current contrast of the canvas background image.
|
|
34
|
+
*
|
|
35
|
+
* Returns a value in the 0–2 range where 1 is normal (no filter).
|
|
28
36
|
* Returns 1 if no background image is set.
|
|
29
37
|
*/
|
|
30
|
-
export declare function
|
|
38
|
+
export declare function getBackgroundContrast(canvas: FabricCanvas): number;
|
|
31
39
|
/**
|
|
32
40
|
* Add or remove the Invert filter from the canvas background image.
|
|
33
41
|
*/
|
|
@@ -75,14 +83,14 @@ export interface ResizeImageOptions {
|
|
|
75
83
|
*/
|
|
76
84
|
export declare function resizeImageUrl(url: string, options?: ResizeImageOptions): Promise<ResizeResult>;
|
|
77
85
|
export interface SetBackgroundImageOptions extends ResizeImageOptions {
|
|
78
|
-
/** Preserve the current background
|
|
79
|
-
|
|
86
|
+
/** Preserve the current background contrast when replacing the image. */
|
|
87
|
+
preserveContrast?: boolean;
|
|
80
88
|
}
|
|
81
89
|
/**
|
|
82
90
|
* Set an image URL as the canvas background image.
|
|
83
91
|
*
|
|
84
92
|
* Pass options to control auto-resize (`maxSize`, `minSize`) and/or
|
|
85
|
-
* preserve the current background
|
|
93
|
+
* preserve the current background contrast when replacing the image.
|
|
86
94
|
* Omit to load the URL as-is without resizing.
|
|
87
95
|
*
|
|
88
96
|
* Returns the created FabricImage for further manipulation.
|
package/dist/background.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"background.d.ts","sourceRoot":"","sources":["../src/background.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,WAAW,EAAW,MAAM,QAAQ,CAAC;AAWtE;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAIpE;AAID,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,IAAI,CAiCN;AAID
|
|
1
|
+
{"version":3,"file":"background.d.ts","sourceRoot":"","sources":["../src/background.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,WAAW,EAAW,MAAM,QAAQ,CAAC;AAWtE;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAIpE;AAID,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,IAAI,CAiCN;AAID;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,GACZ,IAAI,CA6BN;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAUlE;AAID;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,OAAO,GAChB,IAAI,CAgBN;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAInE;AAID,MAAM,WAAW,YAAY;IAC3B,+EAA+E;IAC/E,GAAG,EAAE,MAAM,CAAC;IACZ,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,YAAY,CAAC,CAkDvB;AAID,MAAM,WAAW,yBAA0B,SAAQ,kBAAkB;IACnE,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,yBAAyB,GAClC,OAAO,CAAC,WAAW,CAAC,CAmBtB"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -4,8 +4,8 @@ export declare const DEFAULT_MIN_ZOOM = 0.2;
|
|
|
4
4
|
export declare const DEFAULT_MAX_ZOOM = 10;
|
|
5
5
|
/** Zoom sensitivity multiplier (applied per wheel tick). */
|
|
6
6
|
export declare const DEFAULT_ZOOM_FACTOR = 1.03;
|
|
7
|
-
/** Default
|
|
8
|
-
export declare const DEFAULT_ZOOM_STEP =
|
|
7
|
+
/** Default multiplier for programmatic zoomIn/zoomOut (1.2 = 20% per click). */
|
|
8
|
+
export declare const DEFAULT_ZOOM_STEP = 1.2;
|
|
9
9
|
/** Default viewport padding fraction (5% on each side). */
|
|
10
10
|
export declare const DEFAULT_VIEWPORT_PADDING = 0.05;
|
|
11
11
|
/** Reference canvas dimension for scaling snap margins proportionally. */
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,0BAA0B;AAC1B,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,0BAA0B;AAC1B,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,0BAA0B;AAC1B,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,0BAA0B;AAC1B,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,4DAA4D;AAC5D,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,gFAAgF;AAChF,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,2DAA2D;AAC3D,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAI7C,0EAA0E;AAC1E,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,yFAAyF;AACzF,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,8CAA8C;AAC9C,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAI9C;;;GAGG;AACH,eAAO,MAAM,aAAa,IAAI,CAAC;AAE/B;;GAEG;AACH,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAI1C,oDAAoD;AACpD,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,8EAA8E;AAC9E,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAI1C,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAC9C,eAAO,MAAM,0BAA0B,YAAY,CAAC;AACpD,eAAO,MAAM,4BAA4B,YAAY,CAAC;AACtD,eAAO,MAAM,kCAAkC,IAAI,CAAC"}
|
|
@@ -129,11 +129,11 @@ export declare function useEditCanvas(options?: UseEditCanvasOptions): {
|
|
|
129
129
|
* exceeds the configured limits (opt out via `backgroundResize: false`),
|
|
130
130
|
* and fits the viewport after setting if `autoFitToBackground` is enabled.
|
|
131
131
|
*
|
|
132
|
-
* Pass `{
|
|
132
|
+
* Pass `{ preserveContrast: true }` to keep the current background contrast
|
|
133
133
|
* when replacing the image.
|
|
134
134
|
*/
|
|
135
135
|
setBackground: (url: string, bgOpts?: {
|
|
136
|
-
|
|
136
|
+
preserveContrast?: boolean;
|
|
137
137
|
}) => Promise<import("fabric").FabricImage<Partial<import("fabric").ImageProps>, import("fabric").SerializedImageProps, import("fabric").ObjectEvents>>;
|
|
138
138
|
/** Whether the canvas has been modified since the last `resetDirty()` call. Requires `trackChanges: true`. */
|
|
139
139
|
isDirty: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useEditCanvas.d.ts","sourceRoot":"","sources":["../../src/hooks/useEditCanvas.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,KAAK,YAAY,EAAW,MAAM,QAAQ,CAAC;AAC5E,OAAO,EAEL,KAAK,iBAAiB,EAEtB,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAMrB,OAAO,EAEL,KAAK,sBAAsB,EAE3B,KAAK,mBAAmB,EACzB,MAAM,cAAc,CAAC;AACtB,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"useEditCanvas.d.ts","sourceRoot":"","sources":["../../src/hooks/useEditCanvas.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,KAAK,YAAY,EAAW,MAAM,QAAQ,CAAC;AAC5E,OAAO,EAEL,KAAK,iBAAiB,EAEtB,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAMrB,OAAO,EAEL,KAAK,sBAAsB,EAE3B,KAAK,mBAAmB,EACzB,MAAM,cAAc,CAAC;AACtB,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EAGL,KAAK,kBAAkB,EAExB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,MAAM,WAAW,oBAAoB;IACnC,kGAAkG;IAClG,UAAU,CAAC,EAAE,OAAO,GAAG,iBAAiB,CAAC;IACzC,mIAAmI;IACnI,SAAS,CAAC,EAAE,OAAO,GAAG,sBAAsB,CAAC;IAC7C;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,mBAAmB,CAAC;IAC7C;;;;;OAKG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG,iBAAiB,CAAC;IACzC;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,qEAAqE;IACrE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,GAAG,kBAAkB,CAAC;IAChD;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,oBAAoB;IAyOxD,8CAA8C;sBAhLrC,YAAY;IAkLrB,oDAAoD;;IAEpD,qCAAqC;;IAErC,6CAA6C;;IAE7C,yBAAyB;;QAEvB,wCAAwC;;QAExC,wDAAwD;wBAnDjB,YAAY;QAqDnD,wFAAwF;;QAExF,2DAA2D;;QAE3D,0DAA0D;;QAE1D,uDAAuD;;;IAGzD,+DAA+D;;IAE/D;;;;;;;;;;;;;;OAcG;qBAvP+B,SAAS,GAAG,IAAI;IAyPlD;;;;;;;OAOG;yBA3ES,MAAM,WAAW;QAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE;IA6E3D,8GAA8G;;IAE9G,4DAA4D;;EAG/D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useViewCanvas.d.ts","sourceRoot":"","sources":["../../src/hooks/useViewCanvas.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,KAAK,YAAY,
|
|
1
|
+
{"version":3,"file":"useViewCanvas.d.ts","sourceRoot":"","sources":["../../src/hooks/useViewCanvas.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,aAAa,CAAC;AAQrB,oEAAoE;AACpE,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,kGAAkG;IAClG,UAAU,CAAC,EAAE,OAAO,GAAG,iBAAiB,CAAC;IACzC;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,qEAAqE;IACrE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAUD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,oBAAoB;IAkHxD,8CAA8C;sBA3GrC,YAAY;IA6GrB,oDAAoD;;IAEpD,qCAAqC;;IAErC,yBAAyB;;QAEvB,wFAAwF;;QAExF,2DAA2D;;QAE3D,0DAA0D;;QAE1D,uDAAuD;;;IAGzD,8DAA8D;yBAjExB,MAAM,SAAS,eAAe;IAmEpE,sFAAsF;8BA1D7E,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IA4DxC,qEAAqE;iCArC9D,MAAM,SAAS,eAAe;EAwCxC"}
|
package/dist/index.cjs
CHANGED
|
@@ -27,12 +27,12 @@ __export(index_exports, {
|
|
|
27
27
|
DEFAULT_DRAG_SHAPE_STYLE: () => DEFAULT_DRAG_SHAPE_STYLE,
|
|
28
28
|
DEFAULT_GUIDELINE_SHAPE_STYLE: () => DEFAULT_GUIDELINE_SHAPE_STYLE,
|
|
29
29
|
DEFAULT_SHAPE_STYLE: () => DEFAULT_SHAPE_STYLE,
|
|
30
|
-
FabricCanvas: () =>
|
|
31
|
-
FabricImage: () =>
|
|
32
|
-
FabricObject: () =>
|
|
33
|
-
Point: () =>
|
|
34
|
-
Polygon: () =>
|
|
35
|
-
Rect: () =>
|
|
30
|
+
FabricCanvas: () => import_fabric19.Canvas,
|
|
31
|
+
FabricImage: () => import_fabric19.FabricImage,
|
|
32
|
+
FabricObject: () => import_fabric19.FabricObject,
|
|
33
|
+
Point: () => import_fabric19.Point,
|
|
34
|
+
Polygon: () => import_fabric19.Polygon,
|
|
35
|
+
Rect: () => import_fabric19.Rect,
|
|
36
36
|
createCircle: () => createCircle,
|
|
37
37
|
createCircleAtPoint: () => createCircleAtPoint,
|
|
38
38
|
createPolygon: () => createPolygon,
|
|
@@ -52,11 +52,12 @@ __export(index_exports, {
|
|
|
52
52
|
enableObjectAlignment: () => enableObjectAlignment,
|
|
53
53
|
enablePanAndZoom: () => enablePanAndZoom,
|
|
54
54
|
enableRotationSnap: () => enableRotationSnap,
|
|
55
|
+
enableScaledBorderRadius: () => enableScaledBorderRadius,
|
|
55
56
|
enableScaledStrokes: () => enableScaledStrokes,
|
|
56
57
|
enableVertexEdit: () => enableVertexEdit,
|
|
57
58
|
fitViewportToBackground: () => fitViewportToBackground,
|
|
59
|
+
getBackgroundContrast: () => getBackgroundContrast,
|
|
58
60
|
getBackgroundInverted: () => getBackgroundInverted,
|
|
59
|
-
getBackgroundOpacity: () => getBackgroundOpacity,
|
|
60
61
|
getBackgroundSrc: () => getBackgroundSrc,
|
|
61
62
|
getBaseStrokeWidth: () => getBaseStrokeWidth,
|
|
62
63
|
getSnapPoints: () => getSnapPoints,
|
|
@@ -65,9 +66,9 @@ __export(index_exports, {
|
|
|
65
66
|
resetViewport: () => resetViewport,
|
|
66
67
|
resizeImageUrl: () => resizeImageUrl,
|
|
67
68
|
serializeCanvas: () => serializeCanvas,
|
|
69
|
+
setBackgroundContrast: () => setBackgroundContrast,
|
|
68
70
|
setBackgroundImage: () => setBackgroundImage,
|
|
69
71
|
setBackgroundInverted: () => setBackgroundInverted,
|
|
70
|
-
setBackgroundOpacity: () => setBackgroundOpacity,
|
|
71
72
|
snapCursorPoint: () => snapCursorPoint,
|
|
72
73
|
useCanvasClick: () => useCanvasClick,
|
|
73
74
|
useCanvasEvents: () => useCanvasEvents,
|
|
@@ -75,7 +76,7 @@ __export(index_exports, {
|
|
|
75
76
|
useEditCanvas: () => useEditCanvas,
|
|
76
77
|
useObjectOverlay: () => useObjectOverlay,
|
|
77
78
|
useViewCanvas: () => useViewCanvas,
|
|
78
|
-
util: () =>
|
|
79
|
+
util: () => import_fabric19.util
|
|
79
80
|
});
|
|
80
81
|
module.exports = __toCommonJS(index_exports);
|
|
81
82
|
|
|
@@ -173,7 +174,7 @@ var import_fabric3 = require("fabric");
|
|
|
173
174
|
var DEFAULT_MIN_ZOOM = 0.2;
|
|
174
175
|
var DEFAULT_MAX_ZOOM = 10;
|
|
175
176
|
var DEFAULT_ZOOM_FACTOR = 1.03;
|
|
176
|
-
var DEFAULT_ZOOM_STEP =
|
|
177
|
+
var DEFAULT_ZOOM_STEP = 1.2;
|
|
177
178
|
var DEFAULT_VIEWPORT_PADDING = 0.05;
|
|
178
179
|
var BASE_CANVAS_SIZE = 1e3;
|
|
179
180
|
var DEFAULT_SNAP_MARGIN = 6;
|
|
@@ -355,15 +356,15 @@ function enablePanAndZoom(canvas, options) {
|
|
|
355
356
|
setEnabled(value) {
|
|
356
357
|
enabled = value;
|
|
357
358
|
},
|
|
358
|
-
zoomIn(
|
|
359
|
-
const z = Math.min(canvas.getZoom()
|
|
359
|
+
zoomIn(factor = DEFAULT_ZOOM_STEP) {
|
|
360
|
+
const z = Math.min(canvas.getZoom() * factor, bounds.maxZoom);
|
|
360
361
|
canvas.zoomToPoint(
|
|
361
362
|
new import_fabric3.Point(canvas.getWidth() / 2, canvas.getHeight() / 2),
|
|
362
363
|
z
|
|
363
364
|
);
|
|
364
365
|
},
|
|
365
|
-
zoomOut(
|
|
366
|
-
const z = Math.max(canvas.getZoom()
|
|
366
|
+
zoomOut(factor = DEFAULT_ZOOM_STEP) {
|
|
367
|
+
const z = Math.max(canvas.getZoom() / factor, bounds.minZoom);
|
|
367
368
|
canvas.zoomToPoint(
|
|
368
369
|
new import_fabric3.Point(canvas.getWidth() / 2, canvas.getHeight() / 2),
|
|
369
370
|
z
|
|
@@ -462,15 +463,37 @@ function fitViewportToBackground(canvas, options) {
|
|
|
462
463
|
canvas.setViewportTransform([scale, 0, 0, scale, offsetX, offsetY]);
|
|
463
464
|
canvas.requestRenderAll();
|
|
464
465
|
}
|
|
465
|
-
function
|
|
466
|
+
function setBackgroundContrast(canvas, value) {
|
|
466
467
|
const bg = getBackgroundImage(canvas);
|
|
467
468
|
if (!bg) return;
|
|
468
|
-
|
|
469
|
+
const contrast = Math.min(Math.max(value, 0), 2) - 1;
|
|
470
|
+
const currentFilters = bg.filters ?? [];
|
|
471
|
+
const contrastIdx = currentFilters.findIndex(
|
|
472
|
+
(f) => f instanceof import_fabric4.filters.Contrast
|
|
473
|
+
);
|
|
474
|
+
if (contrast === 0) {
|
|
475
|
+
if (contrastIdx >= 0) {
|
|
476
|
+
bg.filters = currentFilters.filter(
|
|
477
|
+
(f) => !(f instanceof import_fabric4.filters.Contrast)
|
|
478
|
+
);
|
|
479
|
+
bg.applyFilters();
|
|
480
|
+
}
|
|
481
|
+
} else if (contrastIdx >= 0) {
|
|
482
|
+
currentFilters[contrastIdx].contrast = contrast;
|
|
483
|
+
bg.applyFilters();
|
|
484
|
+
} else {
|
|
485
|
+
bg.filters = [...currentFilters, new import_fabric4.filters.Contrast({ contrast })];
|
|
486
|
+
bg.applyFilters();
|
|
487
|
+
}
|
|
469
488
|
canvas.requestRenderAll();
|
|
470
489
|
}
|
|
471
|
-
function
|
|
490
|
+
function getBackgroundContrast(canvas) {
|
|
472
491
|
const bg = getBackgroundImage(canvas);
|
|
473
|
-
|
|
492
|
+
if (!bg) return 1;
|
|
493
|
+
const contrastFilter = bg.filters?.find(
|
|
494
|
+
(f) => f instanceof import_fabric4.filters.Contrast
|
|
495
|
+
);
|
|
496
|
+
return 1 + (contrastFilter?.contrast ?? 0);
|
|
474
497
|
}
|
|
475
498
|
function setBackgroundInverted(canvas, inverted) {
|
|
476
499
|
const bg = getBackgroundImage(canvas);
|
|
@@ -536,7 +559,7 @@ function resizeImageUrl(url, options) {
|
|
|
536
559
|
});
|
|
537
560
|
}
|
|
538
561
|
async function setBackgroundImage(canvas, url, options) {
|
|
539
|
-
const
|
|
562
|
+
const prevContrast = options?.preserveContrast ? getBackgroundContrast(canvas) : void 0;
|
|
540
563
|
let imageUrl = url;
|
|
541
564
|
if (options !== void 0) {
|
|
542
565
|
const result = await resizeImageUrl(url, options);
|
|
@@ -544,8 +567,8 @@ async function setBackgroundImage(canvas, url, options) {
|
|
|
544
567
|
}
|
|
545
568
|
const img = await import_fabric4.FabricImage.fromURL(imageUrl, { crossOrigin: "anonymous" });
|
|
546
569
|
canvas.backgroundImage = img;
|
|
547
|
-
if (
|
|
548
|
-
|
|
570
|
+
if (prevContrast !== void 0 && prevContrast !== 1) {
|
|
571
|
+
setBackgroundContrast(canvas, prevContrast);
|
|
549
572
|
}
|
|
550
573
|
canvas.requestRenderAll();
|
|
551
574
|
return img;
|
|
@@ -1463,6 +1486,11 @@ function enableDragToCreate(canvas, factory, options) {
|
|
|
1463
1486
|
if (width < MIN_DRAG_SIZE && height < MIN_DRAG_SIZE) {
|
|
1464
1487
|
canvas.requestRenderAll();
|
|
1465
1488
|
previewRect = null;
|
|
1489
|
+
if (options?.clickFactory) {
|
|
1490
|
+
const obj2 = options.clickFactory(canvas, { x: startX, y: startY });
|
|
1491
|
+
restoreViewport(options?.viewport);
|
|
1492
|
+
options?.onCreated?.(obj2);
|
|
1493
|
+
}
|
|
1466
1494
|
return;
|
|
1467
1495
|
}
|
|
1468
1496
|
const obj = factory(canvas, { startX, startY, width, height });
|
|
@@ -2101,6 +2129,8 @@ function enableVertexEdit(canvas, polygon, options, onExit) {
|
|
|
2101
2129
|
// src/serialization.ts
|
|
2102
2130
|
var import_fabric16 = require("fabric");
|
|
2103
2131
|
var strokeBaseMap = /* @__PURE__ */ new WeakMap();
|
|
2132
|
+
var borderRadiusBaseMap = /* @__PURE__ */ new WeakMap();
|
|
2133
|
+
var VIEW_BORDER_RADIUS = 4;
|
|
2104
2134
|
function enableScaledStrokes(canvas) {
|
|
2105
2135
|
function applyScaledStrokes() {
|
|
2106
2136
|
const zoom = canvas.getZoom();
|
|
@@ -2125,6 +2155,28 @@ function enableScaledStrokes(canvas) {
|
|
|
2125
2155
|
});
|
|
2126
2156
|
};
|
|
2127
2157
|
}
|
|
2158
|
+
function enableScaledBorderRadius(canvas) {
|
|
2159
|
+
function applyScaledBorderRadius() {
|
|
2160
|
+
canvas.forEachObject((obj) => {
|
|
2161
|
+
if (!(obj instanceof import_fabric16.Rect)) return;
|
|
2162
|
+
if (!borderRadiusBaseMap.has(obj)) return;
|
|
2163
|
+
const rx = VIEW_BORDER_RADIUS / (obj.scaleX ?? 1);
|
|
2164
|
+
const ry = VIEW_BORDER_RADIUS / (obj.scaleY ?? 1);
|
|
2165
|
+
obj.set({ rx, ry });
|
|
2166
|
+
});
|
|
2167
|
+
}
|
|
2168
|
+
canvas.on("before:render", applyScaledBorderRadius);
|
|
2169
|
+
return () => {
|
|
2170
|
+
canvas.off("before:render", applyScaledBorderRadius);
|
|
2171
|
+
canvas.forEachObject((obj) => {
|
|
2172
|
+
if (!(obj instanceof import_fabric16.Rect)) return;
|
|
2173
|
+
const base = borderRadiusBaseMap.get(obj);
|
|
2174
|
+
if (base !== void 0) {
|
|
2175
|
+
obj.set({ rx: base.rx, ry: base.ry });
|
|
2176
|
+
}
|
|
2177
|
+
});
|
|
2178
|
+
};
|
|
2179
|
+
}
|
|
2128
2180
|
function getBaseStrokeWidth(obj) {
|
|
2129
2181
|
return strokeBaseMap.get(obj) ?? obj.strokeWidth ?? 0;
|
|
2130
2182
|
}
|
|
@@ -2150,14 +2202,28 @@ function serializeCanvas(canvas, options) {
|
|
|
2150
2202
|
obj.strokeWidth = base;
|
|
2151
2203
|
}
|
|
2152
2204
|
});
|
|
2205
|
+
const appliedRadii = /* @__PURE__ */ new Map();
|
|
2206
|
+
canvas.forEachObject((obj) => {
|
|
2207
|
+
if (!(obj instanceof import_fabric16.Rect)) return;
|
|
2208
|
+
const base = borderRadiusBaseMap.get(obj);
|
|
2209
|
+
if (base !== void 0) {
|
|
2210
|
+
appliedRadii.set(obj, { rx: obj.rx ?? 0, ry: obj.ry ?? 0 });
|
|
2211
|
+
obj.set({ rx: base.rx, ry: base.ry });
|
|
2212
|
+
}
|
|
2213
|
+
});
|
|
2153
2214
|
const json = canvas.toObject(properties);
|
|
2215
|
+
delete json.backgroundColor;
|
|
2154
2216
|
scaledWidths.forEach((scaled, obj) => {
|
|
2155
2217
|
obj.strokeWidth = scaled;
|
|
2156
2218
|
});
|
|
2219
|
+
appliedRadii.forEach((radii, obj) => {
|
|
2220
|
+
obj.set({ rx: radii.rx, ry: radii.ry });
|
|
2221
|
+
});
|
|
2157
2222
|
return json;
|
|
2158
2223
|
}
|
|
2159
2224
|
async function loadCanvas(canvas, json, options) {
|
|
2160
2225
|
await canvas.loadFromJSON(json);
|
|
2226
|
+
canvas.backgroundColor = "";
|
|
2161
2227
|
if (options?.filter) {
|
|
2162
2228
|
const toRemove = [];
|
|
2163
2229
|
canvas.forEachObject((obj) => {
|
|
@@ -2165,11 +2231,28 @@ async function loadCanvas(canvas, json, options) {
|
|
|
2165
2231
|
});
|
|
2166
2232
|
for (const obj of toRemove) canvas.remove(obj);
|
|
2167
2233
|
}
|
|
2234
|
+
canvas.forEachObject((obj) => {
|
|
2235
|
+
if (obj.originX === "center" && obj.originY === "center") return;
|
|
2236
|
+
const center = obj.getCenterPoint();
|
|
2237
|
+
obj.set({
|
|
2238
|
+
originX: "center",
|
|
2239
|
+
originY: "center",
|
|
2240
|
+
left: center.x,
|
|
2241
|
+
top: center.y
|
|
2242
|
+
});
|
|
2243
|
+
obj.setCoords();
|
|
2244
|
+
});
|
|
2168
2245
|
canvas.forEachObject((obj) => {
|
|
2169
2246
|
obj.set(DEFAULT_CONTROL_STYLE);
|
|
2170
2247
|
if (obj.shapeType === "circle" && obj instanceof import_fabric16.Rect) {
|
|
2171
2248
|
restoreCircleConstraints(obj);
|
|
2172
2249
|
}
|
|
2250
|
+
if (obj instanceof import_fabric16.Rect && obj.shapeType !== "circle" && obj.data?.type !== "DEVICE") {
|
|
2251
|
+
borderRadiusBaseMap.set(obj, { rx: obj.rx ?? 0, ry: obj.ry ?? 0 });
|
|
2252
|
+
const rx = VIEW_BORDER_RADIUS / (obj.scaleX ?? 1);
|
|
2253
|
+
const ry = VIEW_BORDER_RADIUS / (obj.scaleY ?? 1);
|
|
2254
|
+
obj.set({ rx, ry });
|
|
2255
|
+
}
|
|
2173
2256
|
});
|
|
2174
2257
|
canvas.requestRenderAll();
|
|
2175
2258
|
return canvas.getObjects();
|
|
@@ -2221,6 +2304,7 @@ function useEditCanvas(options) {
|
|
|
2221
2304
|
if (options?.scaledStrokes !== false) {
|
|
2222
2305
|
enableScaledStrokes(canvas);
|
|
2223
2306
|
}
|
|
2307
|
+
enableScaledBorderRadius(canvas);
|
|
2224
2308
|
if (options?.keyboardShortcuts !== false) {
|
|
2225
2309
|
keyboardCleanupRef.current = enableKeyboardShortcuts(canvas);
|
|
2226
2310
|
}
|
|
@@ -2327,7 +2411,7 @@ function useEditCanvas(options) {
|
|
|
2327
2411
|
async (url, bgOpts) => {
|
|
2328
2412
|
const canvas = canvasRef.current;
|
|
2329
2413
|
if (!canvas) throw new Error("Canvas not ready");
|
|
2330
|
-
const resizeOpts = options?.backgroundResize !== false ? typeof options?.backgroundResize === "object" ? { ...options.backgroundResize, ...bgOpts } : { ...bgOpts } : bgOpts?.
|
|
2414
|
+
const resizeOpts = options?.backgroundResize !== false ? typeof options?.backgroundResize === "object" ? { ...options.backgroundResize, ...bgOpts } : { ...bgOpts } : bgOpts?.preserveContrast ? { preserveContrast: true } : void 0;
|
|
2331
2415
|
const img = await setBackgroundImage(canvas, url, resizeOpts);
|
|
2332
2416
|
if (options?.autoFitToBackground !== false) {
|
|
2333
2417
|
fitViewportToBackground(canvas);
|
|
@@ -2385,7 +2469,7 @@ function useEditCanvas(options) {
|
|
|
2385
2469
|
* exceeds the configured limits (opt out via `backgroundResize: false`),
|
|
2386
2470
|
* and fits the viewport after setting if `autoFitToBackground` is enabled.
|
|
2387
2471
|
*
|
|
2388
|
-
* Pass `{
|
|
2472
|
+
* Pass `{ preserveContrast: true }` to keep the current background contrast
|
|
2389
2473
|
* when replacing the image.
|
|
2390
2474
|
*/
|
|
2391
2475
|
setBackground,
|
|
@@ -2398,18 +2482,10 @@ function useEditCanvas(options) {
|
|
|
2398
2482
|
|
|
2399
2483
|
// src/hooks/useViewCanvas.ts
|
|
2400
2484
|
var import_react3 = require("react");
|
|
2401
|
-
var import_fabric18 = require("fabric");
|
|
2402
|
-
var VIEW_BORDER_RADIUS = 4;
|
|
2403
2485
|
function lockCanvas(canvas) {
|
|
2404
2486
|
canvas.selection = false;
|
|
2405
2487
|
canvas.forEachObject((obj) => {
|
|
2406
2488
|
obj.selectable = false;
|
|
2407
|
-
obj.evented = false;
|
|
2408
|
-
if (obj instanceof import_fabric18.Rect && obj.shapeType !== "circle" && obj.data?.type !== "DEVICE") {
|
|
2409
|
-
const rx = VIEW_BORDER_RADIUS / (obj.scaleX ?? 1);
|
|
2410
|
-
const ry = VIEW_BORDER_RADIUS / (obj.scaleY ?? 1);
|
|
2411
|
-
obj.set({ rx, ry });
|
|
2412
|
-
}
|
|
2413
2489
|
});
|
|
2414
2490
|
}
|
|
2415
2491
|
function useViewCanvas(options) {
|
|
@@ -2422,6 +2498,7 @@ function useViewCanvas(options) {
|
|
|
2422
2498
|
if (options?.scaledStrokes !== false) {
|
|
2423
2499
|
enableScaledStrokes(canvas);
|
|
2424
2500
|
}
|
|
2501
|
+
enableScaledBorderRadius(canvas);
|
|
2425
2502
|
if (options?.panAndZoom !== false) {
|
|
2426
2503
|
const panAndZoomOpts = typeof options?.panAndZoom === "object" ? options.panAndZoom : {};
|
|
2427
2504
|
viewportRef.current = enablePanAndZoom(canvas, {
|
|
@@ -2671,7 +2748,7 @@ function useCanvasClick(canvasRef, onClick, options) {
|
|
|
2671
2748
|
|
|
2672
2749
|
// src/hooks/useObjectOverlay.ts
|
|
2673
2750
|
var import_react7 = require("react");
|
|
2674
|
-
var
|
|
2751
|
+
var import_fabric18 = require("fabric");
|
|
2675
2752
|
function useObjectOverlay(canvasRef, object, options) {
|
|
2676
2753
|
const containerRef = (0, import_react7.useRef)(null);
|
|
2677
2754
|
const optionsRef = (0, import_react7.useRef)(options);
|
|
@@ -2688,7 +2765,7 @@ function useObjectOverlay(canvasRef, object, options) {
|
|
|
2688
2765
|
const center = object.getCenterPoint();
|
|
2689
2766
|
const actualWidth = (object.width ?? 0) * (object.scaleX ?? 1);
|
|
2690
2767
|
const actualHeight = (object.height ?? 0) * (object.scaleY ?? 1);
|
|
2691
|
-
const screenCoords =
|
|
2768
|
+
const screenCoords = import_fabric18.util.transformPoint(center, vt);
|
|
2692
2769
|
const screenWidth = actualWidth * zoom;
|
|
2693
2770
|
const screenHeight = actualHeight * zoom;
|
|
2694
2771
|
el.style.left = `${screenCoords.x - screenWidth / 2}px`;
|
|
@@ -2730,7 +2807,7 @@ function useObjectOverlay(canvasRef, object, options) {
|
|
|
2730
2807
|
}
|
|
2731
2808
|
|
|
2732
2809
|
// src/index.ts
|
|
2733
|
-
var
|
|
2810
|
+
var import_fabric19 = require("fabric");
|
|
2734
2811
|
// Annotate the CommonJS export names for ESM import in node:
|
|
2735
2812
|
0 && (module.exports = {
|
|
2736
2813
|
Canvas,
|
|
@@ -2765,11 +2842,12 @@ var import_fabric20 = require("fabric");
|
|
|
2765
2842
|
enableObjectAlignment,
|
|
2766
2843
|
enablePanAndZoom,
|
|
2767
2844
|
enableRotationSnap,
|
|
2845
|
+
enableScaledBorderRadius,
|
|
2768
2846
|
enableScaledStrokes,
|
|
2769
2847
|
enableVertexEdit,
|
|
2770
2848
|
fitViewportToBackground,
|
|
2849
|
+
getBackgroundContrast,
|
|
2771
2850
|
getBackgroundInverted,
|
|
2772
|
-
getBackgroundOpacity,
|
|
2773
2851
|
getBackgroundSrc,
|
|
2774
2852
|
getBaseStrokeWidth,
|
|
2775
2853
|
getSnapPoints,
|
|
@@ -2778,9 +2856,9 @@ var import_fabric20 = require("fabric");
|
|
|
2778
2856
|
resetViewport,
|
|
2779
2857
|
resizeImageUrl,
|
|
2780
2858
|
serializeCanvas,
|
|
2859
|
+
setBackgroundContrast,
|
|
2781
2860
|
setBackgroundImage,
|
|
2782
2861
|
setBackgroundInverted,
|
|
2783
|
-
setBackgroundOpacity,
|
|
2784
2862
|
snapCursorPoint,
|
|
2785
2863
|
useCanvasClick,
|
|
2786
2864
|
useCanvasEvents,
|