@bwp-web/canvas 0.7.1 → 0.8.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 +6 -0
- package/dist/background.d.ts.map +1 -1
- package/dist/fabricAugmentation.d.ts +3 -0
- package/dist/fabricAugmentation.d.ts.map +1 -1
- package/dist/hooks/useEditCanvas.d.ts +6 -2
- package/dist/hooks/useEditCanvas.d.ts.map +1 -1
- package/dist/hooks/useViewCanvas.d.ts.map +1 -1
- package/dist/index.cjs +137 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +136 -1
- package/dist/index.js.map +1 -1
- package/dist/overlay/FixedSizeContent.d.ts.map +1 -1
- package/dist/overlay/ObjectOverlay.d.ts.map +1 -1
- package/dist/overlay/OverlayBadge.d.ts +59 -0
- package/dist/overlay/OverlayBadge.d.ts.map +1 -0
- package/dist/overlay/index.d.ts +2 -0
- package/dist/overlay/index.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/background.d.ts
CHANGED
|
@@ -27,6 +27,8 @@ export declare function fitViewportToBackground(canvas: FabricCanvas, options?:
|
|
|
27
27
|
* - **2**: maximum contrast (darks are truly dark, lights truly light).
|
|
28
28
|
*
|
|
29
29
|
* Clamped to the 0–2 range.
|
|
30
|
+
*
|
|
31
|
+
* Fires `background:modified` on the canvas when the contrast actually changes.
|
|
30
32
|
*/
|
|
31
33
|
export declare function setBackgroundContrast(canvas: FabricCanvas, value: number): void;
|
|
32
34
|
/**
|
|
@@ -38,6 +40,8 @@ export declare function setBackgroundContrast(canvas: FabricCanvas, value: numbe
|
|
|
38
40
|
export declare function getBackgroundContrast(canvas: FabricCanvas): number;
|
|
39
41
|
/**
|
|
40
42
|
* Add or remove the Invert filter from the canvas background image.
|
|
43
|
+
*
|
|
44
|
+
* Fires `background:modified` on the canvas when the invert state actually changes.
|
|
41
45
|
*/
|
|
42
46
|
export declare function setBackgroundInverted(canvas: FabricCanvas, inverted: boolean): void;
|
|
43
47
|
/**
|
|
@@ -93,6 +97,8 @@ export interface SetBackgroundImageOptions extends ResizeImageOptions {
|
|
|
93
97
|
* preserve the current background contrast when replacing the image.
|
|
94
98
|
* Omit to load the URL as-is without resizing.
|
|
95
99
|
*
|
|
100
|
+
* Fires `background:modified` on the canvas after the image is set.
|
|
101
|
+
*
|
|
96
102
|
* Returns the created FabricImage for further manipulation.
|
|
97
103
|
*/
|
|
98
104
|
export declare function setBackgroundImage(canvas: FabricCanvas, url: string, options?: SetBackgroundImageOptions): Promise<FabricImage>;
|
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;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,GACZ,IAAI,CAmCN;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAUlE;AAID;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,OAAO,GAChB,IAAI,CAqBN;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;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,yBAAyB,GAClC,OAAO,CAAC,WAAW,CAAC,CA6BtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fabricAugmentation.d.ts","sourceRoot":"","sources":["../src/fabricAugmentation.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC;AAEhB,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC;AAEjC,mDAAmD;AACnD,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,QAAQ,GACR,MAAM,GACN,eAAe,GACf,UAAU,CAAC;AAEf,OAAO,QAAQ,QAAQ,CAAC;IACtB,UAAU,YAAY;QACpB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,IAAI,CAAC,EAAE;YACL,IAAI,EAAE,cAAc,CAAC;YACrB,EAAE,EAAE,MAAM,CAAC;SACZ,CAAC;KACH;IACD,UAAU,MAAM;QACd,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB;CACF"}
|
|
1
|
+
{"version":3,"file":"fabricAugmentation.d.ts","sourceRoot":"","sources":["../src/fabricAugmentation.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC;AAEhB,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC;AAEjC,mDAAmD;AACnD,MAAM,MAAM,cAAc,GACtB,OAAO,GACP,QAAQ,GACR,MAAM,GACN,eAAe,GACf,UAAU,CAAC;AAEf,OAAO,QAAQ,QAAQ,CAAC;IACtB,UAAU,YAAY;QACpB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,IAAI,CAAC,EAAE;YACL,IAAI,EAAE,cAAc,CAAC;YACrB,EAAE,EAAE,MAAM,CAAC;SACZ,CAAC;KACH;IACD,UAAU,MAAM;QACd,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB;IACD,UAAU,YAAY;QACpB,qBAAqB,EAAE,MAAM,CAAC;KAC/B;CACF"}
|
|
@@ -55,8 +55,10 @@ export interface UseEditCanvasOptions {
|
|
|
55
55
|
*/
|
|
56
56
|
backgroundResize?: boolean | ResizeImageOptions;
|
|
57
57
|
/**
|
|
58
|
-
* Track
|
|
59
|
-
*
|
|
58
|
+
* Track canvas mutations and expose an `isDirty` flag.
|
|
59
|
+
* Listens for `object:added`, `object:removed`, `object:modified`, and
|
|
60
|
+
* `background:modified` events. Call `resetDirty()` after a successful
|
|
61
|
+
* save to clear the flag, or `markDirty()` to set it manually.
|
|
60
62
|
* Default: disabled.
|
|
61
63
|
*/
|
|
62
64
|
trackChanges?: boolean;
|
|
@@ -153,6 +155,8 @@ export declare function useEditCanvas(options?: UseEditCanvasOptions): {
|
|
|
153
155
|
isDirty: boolean;
|
|
154
156
|
/** Reset the dirty flag (e.g., after a successful save). */
|
|
155
157
|
resetDirty: () => void;
|
|
158
|
+
/** Manually mark the canvas as dirty (e.g., after a custom operation not tracked automatically). */
|
|
159
|
+
markDirty: () => void;
|
|
156
160
|
/** Undo the last change. Requires `history: true`. */
|
|
157
161
|
undo: () => Promise<void>;
|
|
158
162
|
/** Redo a previously undone change. Requires `history: true`. */
|
|
@@ -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;AAOzB,OAAO,EAGL,KAAK,kBAAkB,EAExB,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,YAAY,CAAC;AACpB,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
|
|
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;AAOzB,OAAO,EAGL,KAAK,kBAAkB,EAExB,MAAM,eAAe,CAAC;AACvB,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,YAAY,CAAC;AACpB,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;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC9B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,cAAc,CAAC;CACpC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,oBAAoB;IAiRxD,8CAA8C;sBArMrC,YAAY;IAuMrB,oDAAoD;;IAEpD,qCAAqC;;IAErC,6CAA6C;;IAE7C,yBAAyB;;QAEvB,wCAAwC;;QAExC,wDAAwD;wBAhDjB,YAAY;QAkDnD,wFAAwF;;QAExF,2DAA2D;;QAE3D,0DAA0D;;QAE1D,uDAAuD;;QAEvD,6DAA6D;;;IAG/D,+DAA+D;;IAE/D;;;;;;;;;;;;;;OAcG;qBAvR+B,SAAS,GAAG,IAAI;IAyRlD;;;;;;;OAOG;yBA7ES,MAAM,WAAW;QAAE,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE;IA+E3D,8GAA8G;;IAE9G,4DAA4D;;IAE5D,oGAAoG;;IAEpG,sDAAsD;;IAQtD,iEAAiE;;IAQjE,mFAAmF;;IAEnF,kFAAkF;;EAGrF"}
|
|
@@ -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,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,aAAa,CAAC;AASrB,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;IAC9B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAC/B;AAUD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,oBAAoB;
|
|
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;AASrB,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;IAC9B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAC/B;AAUD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,oBAAoB;IA0HxD,8CAA8C;sBAjHrC,YAAY;IAmHrB,oDAAoD;;IAEpD,qCAAqC;;IAErC,yBAAyB;;QAEvB,wFAAwF;;QAExF,2DAA2D;;QAE3D,0DAA0D;;QAE1D,uDAAuD;;QAEvD,6DAA6D;;;IAG/D,8DAA8D;yBAnExB,MAAM,SAAS,eAAe;IAqEpE,sFAAsF;8BA5D7E,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IA8DxC,qEAAqE;iCAvC9D,MAAM,SAAS,eAAe;EA0CxC"}
|
package/dist/index.cjs
CHANGED
|
@@ -32,6 +32,7 @@ __export(index_exports, {
|
|
|
32
32
|
FabricObject: () => import_fabric19.FabricObject,
|
|
33
33
|
FixedSizeContent: () => FixedSizeContent,
|
|
34
34
|
ObjectOverlay: () => ObjectOverlay,
|
|
35
|
+
OverlayBadge: () => OverlayBadge,
|
|
35
36
|
OverlayContent: () => OverlayContent,
|
|
36
37
|
Point: () => import_fabric19.Point,
|
|
37
38
|
Polygon: () => import_fabric19.Polygon,
|
|
@@ -517,21 +518,26 @@ function setBackgroundContrast(canvas, value) {
|
|
|
517
518
|
const contrastIdx = currentFilters.findIndex(
|
|
518
519
|
(f) => f instanceof import_fabric4.filters.Contrast
|
|
519
520
|
);
|
|
521
|
+
let changed = false;
|
|
520
522
|
if (contrast === 0) {
|
|
521
523
|
if (contrastIdx >= 0) {
|
|
522
524
|
bg.filters = currentFilters.filter(
|
|
523
525
|
(f) => !(f instanceof import_fabric4.filters.Contrast)
|
|
524
526
|
);
|
|
525
527
|
bg.applyFilters();
|
|
528
|
+
changed = true;
|
|
526
529
|
}
|
|
527
530
|
} else if (contrastIdx >= 0) {
|
|
528
531
|
currentFilters[contrastIdx].contrast = contrast;
|
|
529
532
|
bg.applyFilters();
|
|
533
|
+
changed = true;
|
|
530
534
|
} else {
|
|
531
535
|
bg.filters = [...currentFilters, new import_fabric4.filters.Contrast({ contrast })];
|
|
532
536
|
bg.applyFilters();
|
|
537
|
+
changed = true;
|
|
533
538
|
}
|
|
534
539
|
canvas.requestRenderAll();
|
|
540
|
+
if (changed) canvas.fire("background:modified");
|
|
535
541
|
}
|
|
536
542
|
function getBackgroundContrast(canvas) {
|
|
537
543
|
const bg = getBackgroundImage(canvas);
|
|
@@ -546,14 +552,18 @@ function setBackgroundInverted(canvas, inverted) {
|
|
|
546
552
|
if (!bg) return;
|
|
547
553
|
const currentFilters = bg.filters ?? [];
|
|
548
554
|
const hasInvert = currentFilters.some((f) => f instanceof import_fabric4.filters.Invert);
|
|
555
|
+
let changed = false;
|
|
549
556
|
if (inverted && !hasInvert) {
|
|
550
557
|
bg.filters = [...currentFilters, new import_fabric4.filters.Invert()];
|
|
551
558
|
bg.applyFilters();
|
|
559
|
+
changed = true;
|
|
552
560
|
} else if (!inverted && hasInvert) {
|
|
553
561
|
bg.filters = currentFilters.filter((f) => !(f instanceof import_fabric4.filters.Invert));
|
|
554
562
|
bg.applyFilters();
|
|
563
|
+
changed = true;
|
|
555
564
|
}
|
|
556
565
|
canvas.requestRenderAll();
|
|
566
|
+
if (changed) canvas.fire("background:modified");
|
|
557
567
|
}
|
|
558
568
|
function getBackgroundInverted(canvas) {
|
|
559
569
|
const bg = getBackgroundImage(canvas);
|
|
@@ -619,6 +629,7 @@ async function setBackgroundImage(canvas, url, options) {
|
|
|
619
629
|
setBackgroundContrast(canvas, prevContrast);
|
|
620
630
|
}
|
|
621
631
|
canvas.requestRenderAll();
|
|
632
|
+
canvas.fire("background:modified");
|
|
622
633
|
return img;
|
|
623
634
|
}
|
|
624
635
|
|
|
@@ -2609,6 +2620,7 @@ function useEditCanvas(options) {
|
|
|
2609
2620
|
canvas.on("object:added", () => setIsDirty(true));
|
|
2610
2621
|
canvas.on("object:removed", () => setIsDirty(true));
|
|
2611
2622
|
canvas.on("object:modified", () => setIsDirty(true));
|
|
2623
|
+
canvas.on("background:modified", () => setIsDirty(true));
|
|
2612
2624
|
}
|
|
2613
2625
|
if (opts?.history) {
|
|
2614
2626
|
const syncHistoryState = () => {
|
|
@@ -2622,6 +2634,7 @@ function useEditCanvas(options) {
|
|
|
2622
2634
|
canvas.on("object:added", syncHistoryState);
|
|
2623
2635
|
canvas.on("object:removed", syncHistoryState);
|
|
2624
2636
|
canvas.on("object:modified", syncHistoryState);
|
|
2637
|
+
canvas.on("background:modified", syncHistoryState);
|
|
2625
2638
|
}
|
|
2626
2639
|
if (opts?.vertexEdit !== false) {
|
|
2627
2640
|
const vertexOpts = typeof opts?.vertexEdit === "object" ? opts.vertexEdit : void 0;
|
|
@@ -2753,6 +2766,8 @@ function useEditCanvas(options) {
|
|
|
2753
2766
|
isDirty,
|
|
2754
2767
|
/** Reset the dirty flag (e.g., after a successful save). */
|
|
2755
2768
|
resetDirty: (0, import_react3.useCallback)(() => setIsDirty(false), []),
|
|
2769
|
+
/** Manually mark the canvas as dirty (e.g., after a custom operation not tracked automatically). */
|
|
2770
|
+
markDirty: (0, import_react3.useCallback)(() => setIsDirty(true), []),
|
|
2756
2771
|
/** Undo the last change. Requires `history: true`. */
|
|
2757
2772
|
undo: (0, import_react3.useCallback)(async () => {
|
|
2758
2773
|
const h = historyRef.current;
|
|
@@ -2812,6 +2827,7 @@ function useViewCanvas(options) {
|
|
|
2812
2827
|
canvas.on("object:added", () => {
|
|
2813
2828
|
lockCanvas(canvas);
|
|
2814
2829
|
});
|
|
2830
|
+
canvas.hoverCursor = "pointer";
|
|
2815
2831
|
canvas.on("mouse:wheel", () => {
|
|
2816
2832
|
setZoom(canvas.getZoom());
|
|
2817
2833
|
});
|
|
@@ -3103,7 +3119,6 @@ function ObjectOverlay({
|
|
|
3103
3119
|
alignItems: "center",
|
|
3104
3120
|
justifyContent: "center",
|
|
3105
3121
|
zIndex: 1,
|
|
3106
|
-
overflow: "hidden",
|
|
3107
3122
|
...sx
|
|
3108
3123
|
},
|
|
3109
3124
|
...rest,
|
|
@@ -3244,6 +3259,7 @@ function FixedSizeContent({
|
|
|
3244
3259
|
flexShrink: 0,
|
|
3245
3260
|
width: "max-content",
|
|
3246
3261
|
overflow: "hidden",
|
|
3262
|
+
alignItems: "center",
|
|
3247
3263
|
"& > *": {
|
|
3248
3264
|
maxWidth: "100%",
|
|
3249
3265
|
overflow: "hidden",
|
|
@@ -3257,6 +3273,125 @@ function FixedSizeContent({
|
|
|
3257
3273
|
);
|
|
3258
3274
|
}
|
|
3259
3275
|
|
|
3276
|
+
// src/overlay/OverlayBadge.tsx
|
|
3277
|
+
var import_material4 = require("@mui/material");
|
|
3278
|
+
var import_react11 = require("react");
|
|
3279
|
+
var import_jsx_runtime5 = require("react/jsx-runtime");
|
|
3280
|
+
function toPx(v) {
|
|
3281
|
+
if (v === void 0) return void 0;
|
|
3282
|
+
return typeof v === "number" ? `${v}px` : v;
|
|
3283
|
+
}
|
|
3284
|
+
function deriveAngle(top, right, bottom, left) {
|
|
3285
|
+
const hasTop = top !== void 0;
|
|
3286
|
+
const hasRight = right !== void 0;
|
|
3287
|
+
const hasBottom = bottom !== void 0;
|
|
3288
|
+
const hasLeft = left !== void 0;
|
|
3289
|
+
if (hasTop && hasRight) return 45;
|
|
3290
|
+
if (hasTop && hasLeft) return 135;
|
|
3291
|
+
if (hasBottom && hasRight) return 315;
|
|
3292
|
+
if (hasBottom && hasLeft) return 225;
|
|
3293
|
+
if (hasTop) return 90;
|
|
3294
|
+
if (hasRight) return 0;
|
|
3295
|
+
if (hasBottom) return 270;
|
|
3296
|
+
if (hasLeft) return 180;
|
|
3297
|
+
return 45;
|
|
3298
|
+
}
|
|
3299
|
+
function ellipsePosition(angleDeg) {
|
|
3300
|
+
const rad = angleDeg * Math.PI / 180;
|
|
3301
|
+
return {
|
|
3302
|
+
pctX: 50 + 50 * Math.cos(rad),
|
|
3303
|
+
pctY: 50 - 50 * Math.sin(rad)
|
|
3304
|
+
};
|
|
3305
|
+
}
|
|
3306
|
+
function toNum(v) {
|
|
3307
|
+
return typeof v === "number" ? v : 0;
|
|
3308
|
+
}
|
|
3309
|
+
function OverlayBadge({
|
|
3310
|
+
children,
|
|
3311
|
+
maxScale = 2,
|
|
3312
|
+
minScale = 0.75,
|
|
3313
|
+
top,
|
|
3314
|
+
right,
|
|
3315
|
+
bottom,
|
|
3316
|
+
left,
|
|
3317
|
+
circular = false,
|
|
3318
|
+
sx,
|
|
3319
|
+
...rest
|
|
3320
|
+
}) {
|
|
3321
|
+
const ref = (0, import_react11.useRef)(null);
|
|
3322
|
+
const baseSize = (0, import_react11.useRef)(null);
|
|
3323
|
+
(0, import_react11.useEffect)(() => {
|
|
3324
|
+
const el = ref.current;
|
|
3325
|
+
if (!el) return;
|
|
3326
|
+
const ancestor = el.parentElement;
|
|
3327
|
+
if (!ancestor) return;
|
|
3328
|
+
function update() {
|
|
3329
|
+
requestAnimationFrame(() => {
|
|
3330
|
+
if (!el || !ancestor) return;
|
|
3331
|
+
const containerW = ancestor.clientWidth;
|
|
3332
|
+
const containerH = ancestor.clientHeight;
|
|
3333
|
+
if (containerW <= 0 || containerH <= 0) {
|
|
3334
|
+
el.style.transform = "";
|
|
3335
|
+
return;
|
|
3336
|
+
}
|
|
3337
|
+
if (!baseSize.current) {
|
|
3338
|
+
baseSize.current = { w: containerW, h: containerH };
|
|
3339
|
+
}
|
|
3340
|
+
const ratio = Math.min(
|
|
3341
|
+
containerW / baseSize.current.w,
|
|
3342
|
+
containerH / baseSize.current.h
|
|
3343
|
+
);
|
|
3344
|
+
const ownScale = Math.max(minScale, Math.min(ratio, maxScale));
|
|
3345
|
+
const overlayScale = parseFloat(
|
|
3346
|
+
getComputedStyle(el).getPropertyValue("--overlay-scale")
|
|
3347
|
+
) || 1;
|
|
3348
|
+
const scale = `scale(${ownScale / overlayScale})`;
|
|
3349
|
+
el.style.transform = circular ? `translate(-50%, -50%) ${scale}` : scale;
|
|
3350
|
+
});
|
|
3351
|
+
}
|
|
3352
|
+
const observer = new ResizeObserver(update);
|
|
3353
|
+
observer.observe(ancestor);
|
|
3354
|
+
update();
|
|
3355
|
+
return () => {
|
|
3356
|
+
observer.disconnect();
|
|
3357
|
+
baseSize.current = null;
|
|
3358
|
+
};
|
|
3359
|
+
}, [maxScale, minScale, circular]);
|
|
3360
|
+
const positionSx = circular ? (() => {
|
|
3361
|
+
const angle = deriveAngle(top, right, bottom, left);
|
|
3362
|
+
const { pctX, pctY } = ellipsePosition(angle);
|
|
3363
|
+
const leftOffset = toNum(left) - toNum(right);
|
|
3364
|
+
const topOffset = toNum(top) - toNum(bottom);
|
|
3365
|
+
return {
|
|
3366
|
+
left: `calc(${pctX}% + ${leftOffset}px)`,
|
|
3367
|
+
top: `calc(${pctY}% + ${topOffset}px)`
|
|
3368
|
+
};
|
|
3369
|
+
})() : {
|
|
3370
|
+
top: toPx(top),
|
|
3371
|
+
right: toPx(right),
|
|
3372
|
+
bottom: toPx(bottom),
|
|
3373
|
+
left: toPx(left)
|
|
3374
|
+
};
|
|
3375
|
+
return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
|
3376
|
+
import_material4.Stack,
|
|
3377
|
+
{
|
|
3378
|
+
ref,
|
|
3379
|
+
sx: {
|
|
3380
|
+
position: "absolute",
|
|
3381
|
+
...positionSx,
|
|
3382
|
+
transformOrigin: "center center",
|
|
3383
|
+
pointerEvents: "auto",
|
|
3384
|
+
width: "max-content",
|
|
3385
|
+
height: "max-content",
|
|
3386
|
+
flexShrink: 0,
|
|
3387
|
+
...sx
|
|
3388
|
+
},
|
|
3389
|
+
...rest,
|
|
3390
|
+
children
|
|
3391
|
+
}
|
|
3392
|
+
);
|
|
3393
|
+
}
|
|
3394
|
+
|
|
3260
3395
|
// src/index.ts
|
|
3261
3396
|
var import_fabric19 = require("fabric");
|
|
3262
3397
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -3273,6 +3408,7 @@ var import_fabric19 = require("fabric");
|
|
|
3273
3408
|
FabricObject,
|
|
3274
3409
|
FixedSizeContent,
|
|
3275
3410
|
ObjectOverlay,
|
|
3411
|
+
OverlayBadge,
|
|
3276
3412
|
OverlayContent,
|
|
3277
3413
|
Point,
|
|
3278
3414
|
Polygon,
|