@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.
@@ -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 opacity of the canvas background image.
23
- * Value is clamped to the 0–1 range.
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 setBackgroundOpacity(canvas: FabricCanvas, opacity: number): void;
31
+ export declare function setBackgroundContrast(canvas: FabricCanvas, value: number): void;
26
32
  /**
27
- * Get the current opacity of the canvas background image.
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 getBackgroundOpacity(canvas: FabricCanvas): number;
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 opacity when replacing the image. */
79
- preserveOpacity?: boolean;
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 opacity when replacing the image.
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.
@@ -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;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,MAAM,GACd,IAAI,CAKN;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAGjE;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,wEAAwE;IACxE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,yBAAyB,GAClC,OAAO,CAAC,WAAW,CAAC,CAmBtB"}
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"}
@@ -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 step for programmatic zoomIn/zoomOut. */
8
- export declare const DEFAULT_ZOOM_STEP = 0.2;
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. */
@@ -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,oDAAoD;AACpD,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"}
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 `{ preserveOpacity: true }` to keep the current background opacity
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
- preserveOpacity?: boolean;
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;AAGzB,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;IAuOxD,8CAA8C;sBA9KrC,YAAY;IAgLrB,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;qBArP+B,SAAS,GAAG,IAAI;IAuPlD;;;;;;;OAOG;yBA3ES,MAAM,WAAW;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE;IA6E1D,8GAA8G;;IAE9G,4DAA4D;;EAG/D"}
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,EAAQ,MAAM,QAAQ,CAAC;AACzE,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,aAAa,CAAC;AAKrB,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;AAuBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,oBAAoB;IAgHxD,8CAA8C;sBAzGrC,YAAY;IA2GrB,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"}
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: () => import_fabric20.Canvas,
31
- FabricImage: () => import_fabric20.FabricImage,
32
- FabricObject: () => import_fabric20.FabricObject,
33
- Point: () => import_fabric20.Point,
34
- Polygon: () => import_fabric20.Polygon,
35
- Rect: () => import_fabric20.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: () => import_fabric20.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 = 0.2;
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(step = DEFAULT_ZOOM_STEP) {
359
- const z = Math.min(canvas.getZoom() + step, bounds.maxZoom);
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(step = DEFAULT_ZOOM_STEP) {
366
- const z = Math.max(canvas.getZoom() - step, bounds.minZoom);
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 setBackgroundOpacity(canvas, opacity) {
466
+ function setBackgroundContrast(canvas, value) {
466
467
  const bg = getBackgroundImage(canvas);
467
468
  if (!bg) return;
468
- bg.set("opacity", Math.min(1, Math.max(0, opacity)));
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 getBackgroundOpacity(canvas) {
490
+ function getBackgroundContrast(canvas) {
472
491
  const bg = getBackgroundImage(canvas);
473
- return bg?.opacity ?? 1;
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 prevOpacity = options?.preserveOpacity ? getBackgroundOpacity(canvas) : void 0;
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 (prevOpacity !== void 0 && prevOpacity !== 1) {
548
- img.set("opacity", prevOpacity);
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?.preserveOpacity ? { preserveOpacity: true } : void 0;
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 `{ preserveOpacity: true }` to keep the current background opacity
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 import_fabric19 = require("fabric");
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 = import_fabric19.util.transformPoint(center, vt);
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 import_fabric20 = require("fabric");
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,