@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/index.d.ts
CHANGED
|
@@ -17,6 +17,8 @@ export { OverlayContent } from './overlay';
|
|
|
17
17
|
export type { OverlayContentProps } from './overlay';
|
|
18
18
|
export { FixedSizeContent } from './overlay';
|
|
19
19
|
export type { FixedSizeContentProps } from './overlay';
|
|
20
|
+
export { OverlayBadge } from './overlay';
|
|
21
|
+
export type { OverlayBadgeProps } from './overlay';
|
|
20
22
|
export type { Point2D, ShapeStyleOptions, SnappingOptions, InteractionModeOptions, SnappableInteractionOptions, DragBounds, ModeSetup, CanvasJSON, } from './types';
|
|
21
23
|
export type { ObjectDataType } from './fabricAugmentation';
|
|
22
24
|
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;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,YAAY,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,YAAY,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -434,21 +434,26 @@ function setBackgroundContrast(canvas, value) {
|
|
|
434
434
|
const contrastIdx = currentFilters.findIndex(
|
|
435
435
|
(f) => f instanceof filters.Contrast
|
|
436
436
|
);
|
|
437
|
+
let changed = false;
|
|
437
438
|
if (contrast === 0) {
|
|
438
439
|
if (contrastIdx >= 0) {
|
|
439
440
|
bg.filters = currentFilters.filter(
|
|
440
441
|
(f) => !(f instanceof filters.Contrast)
|
|
441
442
|
);
|
|
442
443
|
bg.applyFilters();
|
|
444
|
+
changed = true;
|
|
443
445
|
}
|
|
444
446
|
} else if (contrastIdx >= 0) {
|
|
445
447
|
currentFilters[contrastIdx].contrast = contrast;
|
|
446
448
|
bg.applyFilters();
|
|
449
|
+
changed = true;
|
|
447
450
|
} else {
|
|
448
451
|
bg.filters = [...currentFilters, new filters.Contrast({ contrast })];
|
|
449
452
|
bg.applyFilters();
|
|
453
|
+
changed = true;
|
|
450
454
|
}
|
|
451
455
|
canvas.requestRenderAll();
|
|
456
|
+
if (changed) canvas.fire("background:modified");
|
|
452
457
|
}
|
|
453
458
|
function getBackgroundContrast(canvas) {
|
|
454
459
|
const bg = getBackgroundImage(canvas);
|
|
@@ -463,14 +468,18 @@ function setBackgroundInverted(canvas, inverted) {
|
|
|
463
468
|
if (!bg) return;
|
|
464
469
|
const currentFilters = bg.filters ?? [];
|
|
465
470
|
const hasInvert = currentFilters.some((f) => f instanceof filters.Invert);
|
|
471
|
+
let changed = false;
|
|
466
472
|
if (inverted && !hasInvert) {
|
|
467
473
|
bg.filters = [...currentFilters, new filters.Invert()];
|
|
468
474
|
bg.applyFilters();
|
|
475
|
+
changed = true;
|
|
469
476
|
} else if (!inverted && hasInvert) {
|
|
470
477
|
bg.filters = currentFilters.filter((f) => !(f instanceof filters.Invert));
|
|
471
478
|
bg.applyFilters();
|
|
479
|
+
changed = true;
|
|
472
480
|
}
|
|
473
481
|
canvas.requestRenderAll();
|
|
482
|
+
if (changed) canvas.fire("background:modified");
|
|
474
483
|
}
|
|
475
484
|
function getBackgroundInverted(canvas) {
|
|
476
485
|
const bg = getBackgroundImage(canvas);
|
|
@@ -536,6 +545,7 @@ async function setBackgroundImage(canvas, url, options) {
|
|
|
536
545
|
setBackgroundContrast(canvas, prevContrast);
|
|
537
546
|
}
|
|
538
547
|
canvas.requestRenderAll();
|
|
548
|
+
canvas.fire("background:modified");
|
|
539
549
|
return img;
|
|
540
550
|
}
|
|
541
551
|
|
|
@@ -2540,6 +2550,7 @@ function useEditCanvas(options) {
|
|
|
2540
2550
|
canvas.on("object:added", () => setIsDirty(true));
|
|
2541
2551
|
canvas.on("object:removed", () => setIsDirty(true));
|
|
2542
2552
|
canvas.on("object:modified", () => setIsDirty(true));
|
|
2553
|
+
canvas.on("background:modified", () => setIsDirty(true));
|
|
2543
2554
|
}
|
|
2544
2555
|
if (opts?.history) {
|
|
2545
2556
|
const syncHistoryState = () => {
|
|
@@ -2553,6 +2564,7 @@ function useEditCanvas(options) {
|
|
|
2553
2564
|
canvas.on("object:added", syncHistoryState);
|
|
2554
2565
|
canvas.on("object:removed", syncHistoryState);
|
|
2555
2566
|
canvas.on("object:modified", syncHistoryState);
|
|
2567
|
+
canvas.on("background:modified", syncHistoryState);
|
|
2556
2568
|
}
|
|
2557
2569
|
if (opts?.vertexEdit !== false) {
|
|
2558
2570
|
const vertexOpts = typeof opts?.vertexEdit === "object" ? opts.vertexEdit : void 0;
|
|
@@ -2684,6 +2696,8 @@ function useEditCanvas(options) {
|
|
|
2684
2696
|
isDirty,
|
|
2685
2697
|
/** Reset the dirty flag (e.g., after a successful save). */
|
|
2686
2698
|
resetDirty: useCallback(() => setIsDirty(false), []),
|
|
2699
|
+
/** Manually mark the canvas as dirty (e.g., after a custom operation not tracked automatically). */
|
|
2700
|
+
markDirty: useCallback(() => setIsDirty(true), []),
|
|
2687
2701
|
/** Undo the last change. Requires `history: true`. */
|
|
2688
2702
|
undo: useCallback(async () => {
|
|
2689
2703
|
const h = historyRef.current;
|
|
@@ -2743,6 +2757,7 @@ function useViewCanvas(options) {
|
|
|
2743
2757
|
canvas.on("object:added", () => {
|
|
2744
2758
|
lockCanvas(canvas);
|
|
2745
2759
|
});
|
|
2760
|
+
canvas.hoverCursor = "pointer";
|
|
2746
2761
|
canvas.on("mouse:wheel", () => {
|
|
2747
2762
|
setZoom(canvas.getZoom());
|
|
2748
2763
|
});
|
|
@@ -3034,7 +3049,6 @@ function ObjectOverlay({
|
|
|
3034
3049
|
alignItems: "center",
|
|
3035
3050
|
justifyContent: "center",
|
|
3036
3051
|
zIndex: 1,
|
|
3037
|
-
overflow: "hidden",
|
|
3038
3052
|
...sx
|
|
3039
3053
|
},
|
|
3040
3054
|
...rest,
|
|
@@ -3175,6 +3189,7 @@ function FixedSizeContent({
|
|
|
3175
3189
|
flexShrink: 0,
|
|
3176
3190
|
width: "max-content",
|
|
3177
3191
|
overflow: "hidden",
|
|
3192
|
+
alignItems: "center",
|
|
3178
3193
|
"& > *": {
|
|
3179
3194
|
maxWidth: "100%",
|
|
3180
3195
|
overflow: "hidden",
|
|
@@ -3188,6 +3203,125 @@ function FixedSizeContent({
|
|
|
3188
3203
|
);
|
|
3189
3204
|
}
|
|
3190
3205
|
|
|
3206
|
+
// src/overlay/OverlayBadge.tsx
|
|
3207
|
+
import { Stack as Stack4 } from "@mui/material";
|
|
3208
|
+
import { useEffect as useEffect9, useRef as useRef10 } from "react";
|
|
3209
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
3210
|
+
function toPx(v) {
|
|
3211
|
+
if (v === void 0) return void 0;
|
|
3212
|
+
return typeof v === "number" ? `${v}px` : v;
|
|
3213
|
+
}
|
|
3214
|
+
function deriveAngle(top, right, bottom, left) {
|
|
3215
|
+
const hasTop = top !== void 0;
|
|
3216
|
+
const hasRight = right !== void 0;
|
|
3217
|
+
const hasBottom = bottom !== void 0;
|
|
3218
|
+
const hasLeft = left !== void 0;
|
|
3219
|
+
if (hasTop && hasRight) return 45;
|
|
3220
|
+
if (hasTop && hasLeft) return 135;
|
|
3221
|
+
if (hasBottom && hasRight) return 315;
|
|
3222
|
+
if (hasBottom && hasLeft) return 225;
|
|
3223
|
+
if (hasTop) return 90;
|
|
3224
|
+
if (hasRight) return 0;
|
|
3225
|
+
if (hasBottom) return 270;
|
|
3226
|
+
if (hasLeft) return 180;
|
|
3227
|
+
return 45;
|
|
3228
|
+
}
|
|
3229
|
+
function ellipsePosition(angleDeg) {
|
|
3230
|
+
const rad = angleDeg * Math.PI / 180;
|
|
3231
|
+
return {
|
|
3232
|
+
pctX: 50 + 50 * Math.cos(rad),
|
|
3233
|
+
pctY: 50 - 50 * Math.sin(rad)
|
|
3234
|
+
};
|
|
3235
|
+
}
|
|
3236
|
+
function toNum(v) {
|
|
3237
|
+
return typeof v === "number" ? v : 0;
|
|
3238
|
+
}
|
|
3239
|
+
function OverlayBadge({
|
|
3240
|
+
children,
|
|
3241
|
+
maxScale = 2,
|
|
3242
|
+
minScale = 0.75,
|
|
3243
|
+
top,
|
|
3244
|
+
right,
|
|
3245
|
+
bottom,
|
|
3246
|
+
left,
|
|
3247
|
+
circular = false,
|
|
3248
|
+
sx,
|
|
3249
|
+
...rest
|
|
3250
|
+
}) {
|
|
3251
|
+
const ref = useRef10(null);
|
|
3252
|
+
const baseSize = useRef10(null);
|
|
3253
|
+
useEffect9(() => {
|
|
3254
|
+
const el = ref.current;
|
|
3255
|
+
if (!el) return;
|
|
3256
|
+
const ancestor = el.parentElement;
|
|
3257
|
+
if (!ancestor) return;
|
|
3258
|
+
function update() {
|
|
3259
|
+
requestAnimationFrame(() => {
|
|
3260
|
+
if (!el || !ancestor) return;
|
|
3261
|
+
const containerW = ancestor.clientWidth;
|
|
3262
|
+
const containerH = ancestor.clientHeight;
|
|
3263
|
+
if (containerW <= 0 || containerH <= 0) {
|
|
3264
|
+
el.style.transform = "";
|
|
3265
|
+
return;
|
|
3266
|
+
}
|
|
3267
|
+
if (!baseSize.current) {
|
|
3268
|
+
baseSize.current = { w: containerW, h: containerH };
|
|
3269
|
+
}
|
|
3270
|
+
const ratio = Math.min(
|
|
3271
|
+
containerW / baseSize.current.w,
|
|
3272
|
+
containerH / baseSize.current.h
|
|
3273
|
+
);
|
|
3274
|
+
const ownScale = Math.max(minScale, Math.min(ratio, maxScale));
|
|
3275
|
+
const overlayScale = parseFloat(
|
|
3276
|
+
getComputedStyle(el).getPropertyValue("--overlay-scale")
|
|
3277
|
+
) || 1;
|
|
3278
|
+
const scale = `scale(${ownScale / overlayScale})`;
|
|
3279
|
+
el.style.transform = circular ? `translate(-50%, -50%) ${scale}` : scale;
|
|
3280
|
+
});
|
|
3281
|
+
}
|
|
3282
|
+
const observer = new ResizeObserver(update);
|
|
3283
|
+
observer.observe(ancestor);
|
|
3284
|
+
update();
|
|
3285
|
+
return () => {
|
|
3286
|
+
observer.disconnect();
|
|
3287
|
+
baseSize.current = null;
|
|
3288
|
+
};
|
|
3289
|
+
}, [maxScale, minScale, circular]);
|
|
3290
|
+
const positionSx = circular ? (() => {
|
|
3291
|
+
const angle = deriveAngle(top, right, bottom, left);
|
|
3292
|
+
const { pctX, pctY } = ellipsePosition(angle);
|
|
3293
|
+
const leftOffset = toNum(left) - toNum(right);
|
|
3294
|
+
const topOffset = toNum(top) - toNum(bottom);
|
|
3295
|
+
return {
|
|
3296
|
+
left: `calc(${pctX}% + ${leftOffset}px)`,
|
|
3297
|
+
top: `calc(${pctY}% + ${topOffset}px)`
|
|
3298
|
+
};
|
|
3299
|
+
})() : {
|
|
3300
|
+
top: toPx(top),
|
|
3301
|
+
right: toPx(right),
|
|
3302
|
+
bottom: toPx(bottom),
|
|
3303
|
+
left: toPx(left)
|
|
3304
|
+
};
|
|
3305
|
+
return /* @__PURE__ */ jsx5(
|
|
3306
|
+
Stack4,
|
|
3307
|
+
{
|
|
3308
|
+
ref,
|
|
3309
|
+
sx: {
|
|
3310
|
+
position: "absolute",
|
|
3311
|
+
...positionSx,
|
|
3312
|
+
transformOrigin: "center center",
|
|
3313
|
+
pointerEvents: "auto",
|
|
3314
|
+
width: "max-content",
|
|
3315
|
+
height: "max-content",
|
|
3316
|
+
flexShrink: 0,
|
|
3317
|
+
...sx
|
|
3318
|
+
},
|
|
3319
|
+
...rest,
|
|
3320
|
+
children
|
|
3321
|
+
}
|
|
3322
|
+
);
|
|
3323
|
+
}
|
|
3324
|
+
|
|
3191
3325
|
// src/index.ts
|
|
3192
3326
|
import {
|
|
3193
3327
|
Canvas as Canvas2,
|
|
@@ -3211,6 +3345,7 @@ export {
|
|
|
3211
3345
|
FabricObject5 as FabricObject,
|
|
3212
3346
|
FixedSizeContent,
|
|
3213
3347
|
ObjectOverlay,
|
|
3348
|
+
OverlayBadge,
|
|
3214
3349
|
OverlayContent,
|
|
3215
3350
|
Point9 as Point,
|
|
3216
3351
|
Polygon5 as Polygon,
|