@bwp-web/canvas 0.4.1 → 0.4.3
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/Canvas.d.ts +11 -1
- package/dist/Canvas/Canvas.d.ts.map +1 -1
- package/dist/background.d.ts +15 -3
- package/dist/background.d.ts.map +1 -1
- package/dist/hooks/index.d.ts +8 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/shared.d.ts +3 -2
- package/dist/hooks/shared.d.ts.map +1 -1
- package/dist/hooks/useCanvasClick.d.ts +27 -0
- package/dist/hooks/useCanvasClick.d.ts.map +1 -0
- package/dist/hooks/useCanvasEvents.d.ts +35 -0
- package/dist/hooks/useCanvasEvents.d.ts.map +1 -0
- package/dist/hooks/useCanvasTooltip.d.ts +45 -0
- package/dist/hooks/useCanvasTooltip.d.ts.map +1 -0
- package/dist/hooks/useEditCanvas.d.ts +18 -1
- package/dist/hooks/useEditCanvas.d.ts.map +1 -1
- package/dist/hooks/useObjectOverlay.d.ts +49 -0
- package/dist/hooks/useObjectOverlay.d.ts.map +1 -0
- package/dist/hooks/useViewCanvas.d.ts +3 -1
- package/dist/hooks/useViewCanvas.d.ts.map +1 -1
- package/dist/index.cjs +471 -102
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +13 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +399 -32
- package/dist/index.js.map +1 -1
- package/dist/interactions/dragToCreate.d.ts +2 -0
- package/dist/interactions/dragToCreate.d.ts.map +1 -1
- package/dist/interactions/drawToCreate.d.ts +7 -1
- package/dist/interactions/drawToCreate.d.ts.map +1 -1
- package/dist/serialization.d.ts +12 -1
- package/dist/serialization.d.ts.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/viewport.d.ts +12 -1
- package/dist/viewport.d.ts.map +1 -1
- package/package.json +6 -5
package/dist/Canvas/Canvas.d.ts
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
import { Canvas as FabricCanvas } from 'fabric';
|
|
2
|
-
import { CSSProperties } from 'react';
|
|
2
|
+
import { type CSSProperties } from 'react';
|
|
3
3
|
export interface CanvasProps {
|
|
4
|
+
/**
|
|
5
|
+
* Canvas width in pixels. When both `width` and `height` are provided,
|
|
6
|
+
* the canvas uses fixed dimensions. When omitted, the canvas auto-fills
|
|
7
|
+
* its parent container and resizes with it.
|
|
8
|
+
*/
|
|
4
9
|
width?: number;
|
|
10
|
+
/**
|
|
11
|
+
* Canvas height in pixels. When both `width` and `height` are provided,
|
|
12
|
+
* the canvas uses fixed dimensions. When omitted, the canvas auto-fills
|
|
13
|
+
* its parent container and resizes with it.
|
|
14
|
+
*/
|
|
5
15
|
height?: number;
|
|
6
16
|
className?: string;
|
|
7
17
|
style?: CSSProperties;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Canvas.d.ts","sourceRoot":"","sources":["../../src/Canvas/Canvas.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,aAAa,EAAqB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Canvas.d.ts","sourceRoot":"","sources":["../../src/Canvas/Canvas.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,KAAK,aAAa,EAAqB,MAAM,OAAO,CAAC;AAG9D,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;CAC1C;AAED,wBAAgB,MAAM,CAAC,EACrB,KAAK,EACL,MAAM,EACN,SAAS,EACT,KAAK,EACL,OAAO,GACR,EAAE,WAAW,2CAqEb"}
|
package/dist/background.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { Canvas as FabricCanvas, FabricImage } from 'fabric';
|
|
2
|
+
/**
|
|
3
|
+
* Get the source URL of the canvas background image, or `null` if no
|
|
4
|
+
* background image is set.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getBackgroundSrc(canvas: FabricCanvas): string | null;
|
|
2
7
|
export interface FitViewportOptions {
|
|
3
8
|
/**
|
|
4
9
|
* Fraction of the canvas to leave as empty margin around the image.
|
|
@@ -69,11 +74,18 @@ export interface ResizeImageOptions {
|
|
|
69
74
|
* ```
|
|
70
75
|
*/
|
|
71
76
|
export declare function resizeImageUrl(url: string, options?: ResizeImageOptions): Promise<ResizeResult>;
|
|
77
|
+
export interface SetBackgroundImageOptions extends ResizeImageOptions {
|
|
78
|
+
/** Preserve the current background opacity when replacing the image. */
|
|
79
|
+
preserveOpacity?: boolean;
|
|
80
|
+
}
|
|
72
81
|
/**
|
|
73
82
|
* Set an image URL as the canvas background image.
|
|
74
|
-
*
|
|
75
|
-
*
|
|
83
|
+
*
|
|
84
|
+
* Pass options to control auto-resize (`maxSize`, `minSize`) and/or
|
|
85
|
+
* preserve the current background opacity when replacing the image.
|
|
86
|
+
* Omit to load the URL as-is without resizing.
|
|
87
|
+
*
|
|
76
88
|
* Returns the created FabricImage for further manipulation.
|
|
77
89
|
*/
|
|
78
|
-
export declare function setBackgroundImage(canvas: FabricCanvas, url: string,
|
|
90
|
+
export declare function setBackgroundImage(canvas: FabricCanvas, url: string, options?: SetBackgroundImageOptions): Promise<FabricImage>;
|
|
79
91
|
//# sourceMappingURL=background.d.ts.map
|
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;
|
|
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"}
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -2,4 +2,12 @@ export { useEditCanvas } from './useEditCanvas';
|
|
|
2
2
|
export type { UseEditCanvasOptions } from './useEditCanvas';
|
|
3
3
|
export { useViewCanvas } from './useViewCanvas';
|
|
4
4
|
export type { UseViewCanvasOptions, ViewObjectStyle } from './useViewCanvas';
|
|
5
|
+
export { useCanvasEvents } from './useCanvasEvents';
|
|
6
|
+
export type { CanvasEventHandlers } from './useCanvasEvents';
|
|
7
|
+
export { useCanvasTooltip } from './useCanvasTooltip';
|
|
8
|
+
export type { UseCanvasTooltipOptions, CanvasTooltipState, } from './useCanvasTooltip';
|
|
9
|
+
export { useCanvasClick } from './useCanvasClick';
|
|
10
|
+
export type { UseCanvasClickOptions } from './useCanvasClick';
|
|
11
|
+
export { useObjectOverlay } from './useObjectOverlay';
|
|
12
|
+
export type { UseObjectOverlayOptions } from './useObjectOverlay';
|
|
5
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EACV,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/hooks/shared.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type RefObject } from 'react';
|
|
2
|
-
import { Canvas as FabricCanvas } from 'fabric';
|
|
3
|
-
import { type ViewportController } from '../viewport';
|
|
2
|
+
import { Canvas as FabricCanvas, type FabricObject } from 'fabric';
|
|
3
|
+
import { type PanToObjectOptions, type ViewportController } from '../viewport';
|
|
4
4
|
/** Sync React zoom state with the canvas zoom level. */
|
|
5
5
|
export declare function syncZoom(canvasRef: RefObject<FabricCanvas | null>, setZoom: (z: number) => void): void;
|
|
6
6
|
/**
|
|
@@ -11,6 +11,7 @@ export declare function createViewportActions(canvasRef: RefObject<FabricCanvas
|
|
|
11
11
|
resetViewport: () => void;
|
|
12
12
|
zoomIn: (step?: number) => void;
|
|
13
13
|
zoomOut: (step?: number) => void;
|
|
14
|
+
panToObject: (object: FabricObject, panOpts?: PanToObjectOptions) => void;
|
|
14
15
|
};
|
|
15
16
|
/**
|
|
16
17
|
* Resolve whether alignment should be enabled based on the master toggle
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/hooks/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/hooks/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACxB,MAAM,aAAa,CAAC;AAGrB,wDAAwD;AACxD,wBAAgB,QAAQ,CACtB,SAAS,EAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,EACzC,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAC3B,IAAI,CAGN;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,EACzC,WAAW,EAAE,SAAS,CAAC,kBAAkB,GAAG,IAAI,CAAC,EACjD,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI;;oBAaL,MAAM;qBAKL,MAAM;0BAKD,YAAY,YAAY,kBAAkB;EAKxE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,eAAe,EAAE,OAAO,GAAG,SAAS,EACpC,aAAa,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAC1C,OAAO,CAGT"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type RefObject } from 'react';
|
|
2
|
+
import type { Canvas as FabricCanvas, FabricObject } from 'fabric';
|
|
3
|
+
export interface UseCanvasClickOptions {
|
|
4
|
+
/** Maximum movement in pixels before the gesture is treated as a pan. Default: 5. */
|
|
5
|
+
threshold?: number;
|
|
6
|
+
/** Maximum duration in milliseconds for the gesture to count as a click. Default: 300. */
|
|
7
|
+
maxDuration?: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Distinguish clicks from pan gestures on a canvas.
|
|
11
|
+
*
|
|
12
|
+
* On view-mode canvases where pan is always active, a regular Fabric `mouse:up`
|
|
13
|
+
* fires for both clicks and drag-to-pan. This hook tracks pointer movement and
|
|
14
|
+
* timing to determine whether the user intended a click or a pan, then calls
|
|
15
|
+
* `onClick` only for genuine clicks.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* useCanvasClick(view.canvasRef, (target) => {
|
|
20
|
+
* if (target?.data?.id) {
|
|
21
|
+
* navigate(`/locations/${target.data.id}`);
|
|
22
|
+
* }
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare function useCanvasClick(canvasRef: RefObject<FabricCanvas | null>, onClick: (target: FabricObject | undefined) => void, options?: UseCanvasClickOptions): void;
|
|
27
|
+
//# sourceMappingURL=useCanvasClick.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCanvasClick.d.ts","sourceRoot":"","sources":["../../src/hooks/useCanvasClick.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC1D,OAAO,KAAK,EACV,MAAM,IAAI,YAAY,EAEtB,YAAY,EACb,MAAM,QAAQ,CAAC;AAEhB,MAAM,WAAW,qBAAqB;IACpC,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0FAA0F;IAC1F,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,EACzC,OAAO,EAAE,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,KAAK,IAAI,EACnD,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CA2DN"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type RefObject } from 'react';
|
|
2
|
+
import type { Canvas as FabricCanvas, CanvasEvents } from 'fabric';
|
|
3
|
+
/**
|
|
4
|
+
* A map of Fabric canvas event names to their handler functions.
|
|
5
|
+
*
|
|
6
|
+
* Each key is a valid `CanvasEvents` event name and each handler receives the
|
|
7
|
+
* correctly-typed event payload. Set a handler to `undefined` to skip it.
|
|
8
|
+
*
|
|
9
|
+
* Common events include:
|
|
10
|
+
* - `'object:added'`, `'object:removed'`, `'object:modified'`
|
|
11
|
+
* - `'mouse:over'`, `'mouse:out'`, `'mouse:down'`, `'mouse:up'`, `'mouse:move'`
|
|
12
|
+
* - `'mouse:wheel'`, `'after:render'`
|
|
13
|
+
* - `'selection:created'`, `'selection:updated'`, `'selection:cleared'`
|
|
14
|
+
*/
|
|
15
|
+
export type CanvasEventHandlers = {
|
|
16
|
+
[K in keyof CanvasEvents]?: (event: CanvasEvents[K]) => void;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Subscribe to Fabric canvas events with automatic cleanup.
|
|
20
|
+
*
|
|
21
|
+
* Handlers are stored in a ref so they always call the latest version without
|
|
22
|
+
* re-subscribing. The hook subscribes once when the canvas becomes available
|
|
23
|
+
* (child `<Canvas>` effects fire before parent effects) and cleans up on unmount.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* useCanvasEvents(editor.canvasRef, {
|
|
28
|
+
* 'object:added': (e) => updateList(),
|
|
29
|
+
* 'object:modified': () => setDirty(true),
|
|
30
|
+
* 'object:removed': () => updateList(),
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function useCanvasEvents(canvasRef: RefObject<FabricCanvas | null>, events: CanvasEventHandlers): void;
|
|
35
|
+
//# sourceMappingURL=useCanvasEvents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCanvasEvents.d.ts","sourceRoot":"","sources":["../../src/hooks/useCanvasEvents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,IAAI,YAAY,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEnE;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,mBAAmB,GAAG;KAC/B,CAAC,IAAI,MAAM,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI;CAC7D,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,EACzC,MAAM,EAAE,mBAAmB,GAC1B,IAAI,CA8BN"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type RefObject } from 'react';
|
|
2
|
+
import type { Canvas as FabricCanvas, FabricObject } from 'fabric';
|
|
3
|
+
export interface UseCanvasTooltipOptions<T> {
|
|
4
|
+
/** Extract tooltip content from a hovered object. Return `null` to skip the tooltip. */
|
|
5
|
+
getContent: (obj: FabricObject) => T | null;
|
|
6
|
+
}
|
|
7
|
+
export interface CanvasTooltipState<T> {
|
|
8
|
+
/** Whether the tooltip is currently visible. */
|
|
9
|
+
visible: boolean;
|
|
10
|
+
/** The content extracted from the hovered object, or `null` when hidden. */
|
|
11
|
+
content: T | null;
|
|
12
|
+
/** Screen-space position (relative to the canvas container) for the tooltip. */
|
|
13
|
+
position: {
|
|
14
|
+
x: number;
|
|
15
|
+
y: number;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Track mouse hover over canvas objects and return tooltip state.
|
|
20
|
+
*
|
|
21
|
+
* Listens to `mouse:over`, `mouse:out`, `after:render`, and `mouse:wheel` to
|
|
22
|
+
* maintain a reactive tooltip state. The returned position is in screen-space
|
|
23
|
+
* coordinates relative to the canvas container element — suitable for absolute
|
|
24
|
+
* positioning of a tooltip component.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```tsx
|
|
28
|
+
* const tooltip = useCanvasTooltip(view.canvasRef, {
|
|
29
|
+
* getContent: (obj) => obj.data ? { id: obj.data.id, type: obj.data.type } : null,
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* return (
|
|
33
|
+
* <>
|
|
34
|
+
* <Canvas onReady={view.onReady} />
|
|
35
|
+
* {tooltip.visible && (
|
|
36
|
+
* <div style={{ position: 'absolute', left: tooltip.position.x, top: tooltip.position.y }}>
|
|
37
|
+
* {tooltip.content?.id}
|
|
38
|
+
* </div>
|
|
39
|
+
* )}
|
|
40
|
+
* </>
|
|
41
|
+
* );
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function useCanvasTooltip<T>(canvasRef: RefObject<FabricCanvas | null>, options: UseCanvasTooltipOptions<T>): CanvasTooltipState<T>;
|
|
45
|
+
//# sourceMappingURL=useCanvasTooltip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCanvasTooltip.d.ts","sourceRoot":"","sources":["../../src/hooks/useCanvasTooltip.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACpE,OAAO,KAAK,EACV,MAAM,IAAI,YAAY,EAEtB,YAAY,EACb,MAAM,QAAQ,CAAC;AAEhB,MAAM,WAAW,uBAAuB,CAAC,CAAC;IACxC,wFAAwF;IACxF,UAAU,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,CAAC,GAAG,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,gDAAgD;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,4EAA4E;IAC5E,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;IAClB,gFAAgF;IAChF,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACpC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,SAAS,EAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,EACzC,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC,GAClC,kBAAkB,CAAC,CAAC,CAAC,CA0EvB"}
|
|
@@ -53,6 +53,12 @@ export interface UseEditCanvasOptions {
|
|
|
53
53
|
* Pass `false` to disable. Default: enabled (maxSize: 4096, minSize: 480).
|
|
54
54
|
*/
|
|
55
55
|
backgroundResize?: boolean | ResizeImageOptions;
|
|
56
|
+
/**
|
|
57
|
+
* Track object add/remove/modify events and expose an `isDirty` flag.
|
|
58
|
+
* Call `resetDirty()` after a successful save to clear the flag.
|
|
59
|
+
* Default: disabled.
|
|
60
|
+
*/
|
|
61
|
+
trackChanges?: boolean;
|
|
56
62
|
}
|
|
57
63
|
/**
|
|
58
64
|
* Hook that provides a batteries-included canvas experience with full
|
|
@@ -97,6 +103,8 @@ export declare function useEditCanvas(options?: UseEditCanvasOptions): {
|
|
|
97
103
|
zoomIn: (step?: number) => void;
|
|
98
104
|
/** Zoom out from the canvas center. Default step: 0.2. */
|
|
99
105
|
zoomOut: (step?: number) => void;
|
|
106
|
+
/** Pan the viewport to center on a specific object. */
|
|
107
|
+
panToObject: (object: FabricObject, panOpts?: import("../viewport").PanToObjectOptions) => void;
|
|
100
108
|
};
|
|
101
109
|
/** Whether vertex edit mode is currently active (reactive). */
|
|
102
110
|
isEditingVertices: boolean;
|
|
@@ -120,7 +128,16 @@ export declare function useEditCanvas(options?: UseEditCanvasOptions): {
|
|
|
120
128
|
* Set a background image from a URL. Automatically resizes if the image
|
|
121
129
|
* exceeds the configured limits (opt out via `backgroundResize: false`),
|
|
122
130
|
* and fits the viewport after setting if `autoFitToBackground` is enabled.
|
|
131
|
+
*
|
|
132
|
+
* Pass `{ preserveOpacity: true }` to keep the current background opacity
|
|
133
|
+
* when replacing the image.
|
|
123
134
|
*/
|
|
124
|
-
setBackground: (url: string
|
|
135
|
+
setBackground: (url: string, bgOpts?: {
|
|
136
|
+
preserveOpacity?: boolean;
|
|
137
|
+
}) => Promise<import("fabric").FabricImage<Partial<import("fabric").ImageProps>, import("fabric").SerializedImageProps, import("fabric").ObjectEvents>>;
|
|
138
|
+
/** Whether the canvas has been modified since the last `resetDirty()` call. Requires `trackChanges: true`. */
|
|
139
|
+
isDirty: boolean;
|
|
140
|
+
/** Reset the dirty flag (e.g., after a successful save). */
|
|
141
|
+
resetDirty: () => void;
|
|
125
142
|
};
|
|
126
143
|
//# sourceMappingURL=useEditCanvas.d.ts.map
|
|
@@ -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,
|
|
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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type RefObject } from 'react';
|
|
2
|
+
import type { Canvas as FabricCanvas, FabricObject } from 'fabric';
|
|
3
|
+
export interface UseObjectOverlayOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Automatically scale the overlay content so it fits within the object
|
|
6
|
+
* bounds at the current zoom level.
|
|
7
|
+
* Default: false.
|
|
8
|
+
*/
|
|
9
|
+
autoScaleContent?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* CSS selector for a text element inside the overlay. When
|
|
12
|
+
* `autoScaleContent` is enabled and the computed scale drops below a
|
|
13
|
+
* threshold, elements matching this selector are hidden (via
|
|
14
|
+
* `display: none`) so only icons remain visible.
|
|
15
|
+
* Default: undefined (no text hiding).
|
|
16
|
+
*/
|
|
17
|
+
textSelector?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Minimum content scale at which `textSelector` elements remain visible.
|
|
20
|
+
* Below this threshold, matched elements are hidden.
|
|
21
|
+
* Default: 0.5.
|
|
22
|
+
*/
|
|
23
|
+
textMinScale?: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Position a DOM element over a Fabric canvas object, kept in sync with
|
|
27
|
+
* pan, zoom, move, scale, and rotate transforms.
|
|
28
|
+
*
|
|
29
|
+
* Returns a ref to attach to the overlay container element. The element
|
|
30
|
+
* must be positioned absolutely within a relative-positioned parent that
|
|
31
|
+
* wraps the `<Canvas>` component.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```tsx
|
|
35
|
+
* const overlayRef = useObjectOverlay(canvasRef, object, {
|
|
36
|
+
* autoScaleContent: true,
|
|
37
|
+
* textSelector: '.desk-text',
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* return (
|
|
41
|
+
* <div ref={overlayRef} style={{ position: 'absolute', pointerEvents: 'none' }}>
|
|
42
|
+
* <CanvasDeskIcon />
|
|
43
|
+
* <span className="desk-text">{name}</span>
|
|
44
|
+
* </div>
|
|
45
|
+
* );
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare function useObjectOverlay(canvasRef: RefObject<FabricCanvas | null>, object: FabricObject | null | undefined, options?: UseObjectOverlayOptions): RefObject<HTMLDivElement | null>;
|
|
49
|
+
//# sourceMappingURL=useObjectOverlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useObjectOverlay.d.ts","sourceRoot":"","sources":["../../src/hooks/useObjectOverlay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,IAAI,YAAY,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGnE,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,EACzC,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,EACvC,OAAO,CAAC,EAAE,uBAAuB,GAChC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAuElC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Canvas as FabricCanvas } from 'fabric';
|
|
1
|
+
import { Canvas as FabricCanvas, type FabricObject } from 'fabric';
|
|
2
2
|
import { type PanAndZoomOptions } from '../viewport';
|
|
3
3
|
/** Visual properties that can be updated on view-canvas objects. */
|
|
4
4
|
export interface ViewObjectStyle {
|
|
@@ -55,6 +55,8 @@ export declare function useViewCanvas(options?: UseViewCanvasOptions): {
|
|
|
55
55
|
zoomIn: (step?: number) => void;
|
|
56
56
|
/** Zoom out from the canvas center. Default step: 0.2. */
|
|
57
57
|
zoomOut: (step?: number) => void;
|
|
58
|
+
/** Pan the viewport to center on a specific object. */
|
|
59
|
+
panToObject: (object: FabricObject, panOpts?: import("../viewport").PanToObjectOptions) => void;
|
|
58
60
|
};
|
|
59
61
|
/** Update a single object's visual style by its `data.id`. */
|
|
60
62
|
setObjectStyle: (id: string, style: ViewObjectStyle) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useViewCanvas.d.ts","sourceRoot":"","sources":["../../src/hooks/useViewCanvas.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,IAAI,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,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"}
|