@bwp-web/canvas 0.6.2 → 0.7.0
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/hooks/index.d.ts +0 -2
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/index.cjs +185 -35
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +182 -34
- package/dist/index.js.map +1 -1
- package/dist/overlay/FixedSizeContent.d.ts +51 -0
- package/dist/overlay/FixedSizeContent.d.ts.map +1 -0
- package/dist/overlay/ObjectOverlay.d.ts +33 -0
- package/dist/overlay/ObjectOverlay.d.ts.map +1 -0
- package/dist/overlay/OverlayContent.d.ts +26 -0
- package/dist/overlay/OverlayContent.d.ts.map +1 -0
- package/dist/overlay/index.d.ts +7 -0
- package/dist/overlay/index.d.ts.map +1 -0
- package/package.json +1 -1
- package/dist/hooks/useObjectOverlay.d.ts +0 -50
- package/dist/hooks/useObjectOverlay.d.ts.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -11,8 +11,12 @@ export { useCanvasTooltip } from './hooks';
|
|
|
11
11
|
export type { UseCanvasTooltipOptions, CanvasTooltipState } from './hooks';
|
|
12
12
|
export { useCanvasClick } from './hooks';
|
|
13
13
|
export type { UseCanvasClickOptions } from './hooks';
|
|
14
|
-
export {
|
|
15
|
-
export type {
|
|
14
|
+
export { ObjectOverlay } from './overlay';
|
|
15
|
+
export type { ObjectOverlayProps } from './overlay';
|
|
16
|
+
export { OverlayContent } from './overlay';
|
|
17
|
+
export type { OverlayContentProps } from './overlay';
|
|
18
|
+
export { FixedSizeContent } from './overlay';
|
|
19
|
+
export type { FixedSizeContentProps } from './overlay';
|
|
16
20
|
export type { Point2D, ShapeStyleOptions, SnappingOptions, InteractionModeOptions, SnappableInteractionOptions, DragBounds, ModeSetup, CanvasJSON, } from './types';
|
|
17
21
|
export type { ObjectDataType } from './fabricAugmentation';
|
|
18
22
|
export { createRectangle, createRectangleAtPoint, editRectangle, } from './shapes';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,sBAAsB,CAAC;AAG9B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAG5C,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,YAAY,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,YAAY,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,YAAY,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -2976,18 +2976,24 @@ function useCanvasClick(canvasRef, onClick, options) {
|
|
|
2976
2976
|
}, [canvasRef]);
|
|
2977
2977
|
}
|
|
2978
2978
|
|
|
2979
|
-
// src/
|
|
2979
|
+
// src/overlay/ObjectOverlay.tsx
|
|
2980
2980
|
import { useEffect as useEffect6, useRef as useRef7 } from "react";
|
|
2981
|
+
import { Stack } from "@mui/material";
|
|
2981
2982
|
import { util as util4 } from "fabric";
|
|
2982
|
-
|
|
2983
|
-
|
|
2984
|
-
|
|
2985
|
-
|
|
2983
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
2984
|
+
function ObjectOverlay({
|
|
2985
|
+
canvasRef,
|
|
2986
|
+
object,
|
|
2987
|
+
sx,
|
|
2988
|
+
children,
|
|
2989
|
+
...rest
|
|
2990
|
+
}) {
|
|
2991
|
+
const stackRef = useRef7(null);
|
|
2986
2992
|
useEffect6(() => {
|
|
2987
2993
|
const canvas = canvasRef.current;
|
|
2988
2994
|
if (!canvas || !object) return;
|
|
2989
2995
|
function update() {
|
|
2990
|
-
const el =
|
|
2996
|
+
const el = stackRef.current;
|
|
2991
2997
|
if (!el || !canvas || !object) return;
|
|
2992
2998
|
const zoom = canvas.getZoom();
|
|
2993
2999
|
const vt = canvas.viewportTransform;
|
|
@@ -2999,32 +3005,11 @@ function useObjectOverlay(canvasRef, object, options) {
|
|
|
2999
3005
|
const screenWidth = actualWidth * zoom;
|
|
3000
3006
|
const screenHeight = actualHeight * zoom;
|
|
3001
3007
|
const angle = object.angle ?? 0;
|
|
3002
|
-
|
|
3003
|
-
|
|
3004
|
-
|
|
3005
|
-
|
|
3006
|
-
|
|
3007
|
-
el.style.height = `${actualHeight}px`;
|
|
3008
|
-
el.style.transformOrigin = "center center";
|
|
3009
|
-
el.style.transform = angle !== 0 ? `scale(${zoom}) rotate(${angle}deg)` : `scale(${zoom})`;
|
|
3010
|
-
el.style.rotate = "";
|
|
3011
|
-
el.style.setProperty("--overlay-scale", String(zoom));
|
|
3012
|
-
if (opts?.textSelector) {
|
|
3013
|
-
const textMinScale = opts?.textMinScale ?? 0.5;
|
|
3014
|
-
const textEls = el.querySelectorAll(opts.textSelector);
|
|
3015
|
-
const display = zoom < textMinScale ? "none" : "";
|
|
3016
|
-
textEls.forEach((t) => {
|
|
3017
|
-
t.style.display = display;
|
|
3018
|
-
});
|
|
3019
|
-
}
|
|
3020
|
-
} else {
|
|
3021
|
-
el.style.left = `${screenCoords.x - screenWidth / 2}px`;
|
|
3022
|
-
el.style.top = `${screenCoords.y - screenHeight / 2}px`;
|
|
3023
|
-
el.style.width = `${screenWidth}px`;
|
|
3024
|
-
el.style.height = `${screenHeight}px`;
|
|
3025
|
-
el.style.transform = "";
|
|
3026
|
-
el.style.rotate = angle !== 0 ? `${angle}deg` : "";
|
|
3027
|
-
}
|
|
3008
|
+
el.style.left = `${screenCoords.x - screenWidth / 2}px`;
|
|
3009
|
+
el.style.top = `${screenCoords.y - screenHeight / 2}px`;
|
|
3010
|
+
el.style.width = `${screenWidth}px`;
|
|
3011
|
+
el.style.height = `${screenHeight}px`;
|
|
3012
|
+
el.style.transform = angle !== 0 ? `rotate(${angle}deg)` : "";
|
|
3028
3013
|
}
|
|
3029
3014
|
update();
|
|
3030
3015
|
canvas.on("after:render", update);
|
|
@@ -3038,7 +3023,168 @@ function useObjectOverlay(canvasRef, object, options) {
|
|
|
3038
3023
|
object.off("rotating", update);
|
|
3039
3024
|
};
|
|
3040
3025
|
}, [canvasRef, object]);
|
|
3041
|
-
return
|
|
3026
|
+
if (!object) return null;
|
|
3027
|
+
return /* @__PURE__ */ jsx2(
|
|
3028
|
+
Stack,
|
|
3029
|
+
{
|
|
3030
|
+
ref: stackRef,
|
|
3031
|
+
sx: {
|
|
3032
|
+
position: "absolute",
|
|
3033
|
+
pointerEvents: "none",
|
|
3034
|
+
alignItems: "center",
|
|
3035
|
+
justifyContent: "center",
|
|
3036
|
+
zIndex: 1,
|
|
3037
|
+
overflow: "hidden",
|
|
3038
|
+
...sx
|
|
3039
|
+
},
|
|
3040
|
+
...rest,
|
|
3041
|
+
children
|
|
3042
|
+
}
|
|
3043
|
+
);
|
|
3044
|
+
}
|
|
3045
|
+
|
|
3046
|
+
// src/overlay/OverlayContent.tsx
|
|
3047
|
+
import { Stack as Stack2 } from "@mui/material";
|
|
3048
|
+
import { useEffect as useEffect7, useRef as useRef8 } from "react";
|
|
3049
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
3050
|
+
function OverlayContent({
|
|
3051
|
+
children,
|
|
3052
|
+
padding = 4,
|
|
3053
|
+
maxScale = 2,
|
|
3054
|
+
sx,
|
|
3055
|
+
...rest
|
|
3056
|
+
}) {
|
|
3057
|
+
const outerRef = useRef8(null);
|
|
3058
|
+
const innerRef = useRef8(null);
|
|
3059
|
+
useEffect7(() => {
|
|
3060
|
+
const outer = outerRef.current;
|
|
3061
|
+
const inner = innerRef.current;
|
|
3062
|
+
if (!outer || !inner) return;
|
|
3063
|
+
function fit() {
|
|
3064
|
+
if (!outer || !inner) return;
|
|
3065
|
+
const containerW = outer.clientWidth;
|
|
3066
|
+
const containerH = outer.clientHeight;
|
|
3067
|
+
const natW = inner.scrollWidth;
|
|
3068
|
+
const natH = inner.scrollHeight;
|
|
3069
|
+
if (natW === 0 || natH === 0 || containerW <= 0 || containerH <= 0) {
|
|
3070
|
+
inner.style.transform = "";
|
|
3071
|
+
inner.style.removeProperty("--overlay-scale");
|
|
3072
|
+
return;
|
|
3073
|
+
}
|
|
3074
|
+
const scale = Math.min(
|
|
3075
|
+
containerW / (natW + padding * 2),
|
|
3076
|
+
containerH / (natH + padding * 2),
|
|
3077
|
+
maxScale
|
|
3078
|
+
);
|
|
3079
|
+
inner.style.transform = `scale(${scale})`;
|
|
3080
|
+
inner.style.setProperty("--overlay-scale", String(scale));
|
|
3081
|
+
}
|
|
3082
|
+
const observer = new ResizeObserver(fit);
|
|
3083
|
+
observer.observe(outer);
|
|
3084
|
+
observer.observe(inner);
|
|
3085
|
+
fit();
|
|
3086
|
+
return () => observer.disconnect();
|
|
3087
|
+
}, [padding, maxScale]);
|
|
3088
|
+
return /* @__PURE__ */ jsx3(
|
|
3089
|
+
Stack2,
|
|
3090
|
+
{
|
|
3091
|
+
ref: outerRef,
|
|
3092
|
+
sx: {
|
|
3093
|
+
width: "100%",
|
|
3094
|
+
height: "100%",
|
|
3095
|
+
alignItems: "center",
|
|
3096
|
+
justifyContent: "center",
|
|
3097
|
+
overflow: "hidden",
|
|
3098
|
+
...sx
|
|
3099
|
+
},
|
|
3100
|
+
...rest,
|
|
3101
|
+
children: /* @__PURE__ */ jsx3(
|
|
3102
|
+
Stack2,
|
|
3103
|
+
{
|
|
3104
|
+
ref: innerRef,
|
|
3105
|
+
sx: {
|
|
3106
|
+
transformOrigin: "center center",
|
|
3107
|
+
flexShrink: 0,
|
|
3108
|
+
width: "max-content"
|
|
3109
|
+
},
|
|
3110
|
+
children
|
|
3111
|
+
}
|
|
3112
|
+
)
|
|
3113
|
+
}
|
|
3114
|
+
);
|
|
3115
|
+
}
|
|
3116
|
+
|
|
3117
|
+
// src/overlay/FixedSizeContent.tsx
|
|
3118
|
+
import { Stack as Stack3 } from "@mui/material";
|
|
3119
|
+
import { useEffect as useEffect8, useRef as useRef9 } from "react";
|
|
3120
|
+
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
3121
|
+
function FixedSizeContent({
|
|
3122
|
+
children,
|
|
3123
|
+
hideOnOverflow = true,
|
|
3124
|
+
truncationPadding = 4,
|
|
3125
|
+
sx,
|
|
3126
|
+
...rest
|
|
3127
|
+
}) {
|
|
3128
|
+
const ref = useRef9(null);
|
|
3129
|
+
const totalContentHeightRef = useRef9(0);
|
|
3130
|
+
useEffect8(() => {
|
|
3131
|
+
const el = ref.current;
|
|
3132
|
+
if (!el) return;
|
|
3133
|
+
let clipAncestor = el.parentElement;
|
|
3134
|
+
while (clipAncestor) {
|
|
3135
|
+
if (getComputedStyle(clipAncestor).overflow === "hidden") break;
|
|
3136
|
+
clipAncestor = clipAncestor.parentElement;
|
|
3137
|
+
}
|
|
3138
|
+
if (!clipAncestor) return;
|
|
3139
|
+
const ancestor = clipAncestor;
|
|
3140
|
+
totalContentHeightRef.current = el.parentElement?.scrollHeight ?? 0;
|
|
3141
|
+
function check() {
|
|
3142
|
+
requestAnimationFrame(() => {
|
|
3143
|
+
if (!el) return;
|
|
3144
|
+
const containerRect = ancestor.getBoundingClientRect();
|
|
3145
|
+
el.style.maxWidth = `${Math.max(0, containerRect.width - truncationPadding * 2)}px`;
|
|
3146
|
+
if (!hideOnOverflow) return;
|
|
3147
|
+
const fits = containerRect.height >= totalContentHeightRef.current;
|
|
3148
|
+
if (fits && el.style.display === "none") {
|
|
3149
|
+
el.style.display = "";
|
|
3150
|
+
totalContentHeightRef.current = el.parentElement?.scrollHeight ?? 0;
|
|
3151
|
+
if (containerRect.height < totalContentHeightRef.current) {
|
|
3152
|
+
el.style.display = "none";
|
|
3153
|
+
}
|
|
3154
|
+
} else if (!fits && el.style.display !== "none") {
|
|
3155
|
+
el.style.display = "none";
|
|
3156
|
+
}
|
|
3157
|
+
if (el.style.display !== "none") {
|
|
3158
|
+
totalContentHeightRef.current = el.parentElement?.scrollHeight ?? 0;
|
|
3159
|
+
}
|
|
3160
|
+
});
|
|
3161
|
+
}
|
|
3162
|
+
const observer = new ResizeObserver(check);
|
|
3163
|
+
observer.observe(ancestor);
|
|
3164
|
+
check();
|
|
3165
|
+
return () => observer.disconnect();
|
|
3166
|
+
}, [hideOnOverflow, truncationPadding]);
|
|
3167
|
+
return /* @__PURE__ */ jsx4(
|
|
3168
|
+
Stack3,
|
|
3169
|
+
{
|
|
3170
|
+
ref,
|
|
3171
|
+
sx: {
|
|
3172
|
+
transform: "scale(calc(1 / var(--overlay-scale, 1)))",
|
|
3173
|
+
transformOrigin: "center center",
|
|
3174
|
+
flexShrink: 0,
|
|
3175
|
+
width: "max-content",
|
|
3176
|
+
overflow: "hidden",
|
|
3177
|
+
"& > *": {
|
|
3178
|
+
maxWidth: "100%",
|
|
3179
|
+
overflow: "hidden",
|
|
3180
|
+
textOverflow: "ellipsis"
|
|
3181
|
+
},
|
|
3182
|
+
...sx
|
|
3183
|
+
},
|
|
3184
|
+
...rest,
|
|
3185
|
+
children
|
|
3186
|
+
}
|
|
3187
|
+
);
|
|
3042
3188
|
}
|
|
3043
3189
|
|
|
3044
3190
|
// src/index.ts
|
|
@@ -3062,6 +3208,9 @@ export {
|
|
|
3062
3208
|
Canvas2 as FabricCanvas,
|
|
3063
3209
|
FabricImage3 as FabricImage,
|
|
3064
3210
|
FabricObject5 as FabricObject,
|
|
3211
|
+
FixedSizeContent,
|
|
3212
|
+
ObjectOverlay,
|
|
3213
|
+
OverlayContent,
|
|
3065
3214
|
Point9 as Point,
|
|
3066
3215
|
Polygon5 as Polygon,
|
|
3067
3216
|
Rect6 as Rect,
|
|
@@ -3107,7 +3256,6 @@ export {
|
|
|
3107
3256
|
useCanvasEvents,
|
|
3108
3257
|
useCanvasTooltip,
|
|
3109
3258
|
useEditCanvas,
|
|
3110
|
-
useObjectOverlay,
|
|
3111
3259
|
useViewCanvas,
|
|
3112
3260
|
util5 as util
|
|
3113
3261
|
};
|