@bwp-web/canvas 0.8.0 → 0.8.2

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/index.d.ts CHANGED
@@ -11,6 +11,10 @@ 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 { EditCanvasProvider, useEditCanvasContext } from './context';
15
+ export type { EditCanvasProviderProps, EditCanvasContextValue, } from './context';
16
+ export { ViewCanvasProvider, useViewCanvasContext } from './context';
17
+ export type { ViewCanvasProviderProps, ViewCanvasContextValue, } from './context';
14
18
  export { ObjectOverlay } from './overlay';
15
19
  export type { ObjectOverlayProps } from './overlay';
16
20
  export { OverlayContent } from './overlay';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
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
 
@@ -2116,7 +2126,8 @@ function enableVertexEdit(canvas, polygon, options, onExit) {
2116
2126
  // src/serialization.ts
2117
2127
  import {
2118
2128
  FabricImage as FabricImage2,
2119
- Rect as Rect5
2129
+ Rect as Rect5,
2130
+ filters as filters2
2120
2131
  } from "fabric";
2121
2132
  var strokeBaseMap = /* @__PURE__ */ new WeakMap();
2122
2133
  var borderRadiusBaseMap = /* @__PURE__ */ new WeakMap();
@@ -2309,6 +2320,10 @@ async function loadCanvas(canvas, json, options) {
2309
2320
  });
2310
2321
  bg.setCoords();
2311
2322
  }
2323
+ if (bg.filters?.some((f) => f instanceof filters2.Invert)) {
2324
+ bg.filters = bg.filters.filter((f) => !(f instanceof filters2.Invert));
2325
+ bg.applyFilters();
2326
+ }
2312
2327
  }
2313
2328
  if (options?.filter) {
2314
2329
  const toRemove = [];
@@ -2540,6 +2555,7 @@ function useEditCanvas(options) {
2540
2555
  canvas.on("object:added", () => setIsDirty(true));
2541
2556
  canvas.on("object:removed", () => setIsDirty(true));
2542
2557
  canvas.on("object:modified", () => setIsDirty(true));
2558
+ canvas.on("background:modified", () => setIsDirty(true));
2543
2559
  }
2544
2560
  if (opts?.history) {
2545
2561
  const syncHistoryState = () => {
@@ -2553,6 +2569,7 @@ function useEditCanvas(options) {
2553
2569
  canvas.on("object:added", syncHistoryState);
2554
2570
  canvas.on("object:removed", syncHistoryState);
2555
2571
  canvas.on("object:modified", syncHistoryState);
2572
+ canvas.on("background:modified", syncHistoryState);
2556
2573
  }
2557
2574
  if (opts?.vertexEdit !== false) {
2558
2575
  const vertexOpts = typeof opts?.vertexEdit === "object" ? opts.vertexEdit : void 0;
@@ -2684,6 +2701,8 @@ function useEditCanvas(options) {
2684
2701
  isDirty,
2685
2702
  /** Reset the dirty flag (e.g., after a successful save). */
2686
2703
  resetDirty: useCallback(() => setIsDirty(false), []),
2704
+ /** Manually mark the canvas as dirty (e.g., after a custom operation not tracked automatically). */
2705
+ markDirty: useCallback(() => setIsDirty(true), []),
2687
2706
  /** Undo the last change. Requires `history: true`. */
2688
2707
  undo: useCallback(async () => {
2689
2708
  const h = historyRef.current;
@@ -2743,6 +2762,7 @@ function useViewCanvas(options) {
2743
2762
  canvas.on("object:added", () => {
2744
2763
  lockCanvas(canvas);
2745
2764
  });
2765
+ canvas.hoverCursor = "pointer";
2746
2766
  canvas.on("mouse:wheel", () => {
2747
2767
  setZoom(canvas.getZoom());
2748
2768
  });
@@ -2976,11 +2996,53 @@ function useCanvasClick(canvasRef, onClick, options) {
2976
2996
  }, [canvasRef]);
2977
2997
  }
2978
2998
 
2999
+ // src/context/EditCanvasContext.tsx
3000
+ import { createContext, useContext } from "react";
3001
+ import { jsx as jsx2 } from "react/jsx-runtime";
3002
+ var EditCanvasContext = createContext(null);
3003
+ function EditCanvasProvider({
3004
+ options,
3005
+ children
3006
+ }) {
3007
+ const canvas = useEditCanvas(options);
3008
+ return /* @__PURE__ */ jsx2(EditCanvasContext.Provider, { value: canvas, children });
3009
+ }
3010
+ function useEditCanvasContext() {
3011
+ const ctx = useContext(EditCanvasContext);
3012
+ if (ctx === null) {
3013
+ throw new Error(
3014
+ "useEditCanvasContext must be used within an <EditCanvasProvider>"
3015
+ );
3016
+ }
3017
+ return ctx;
3018
+ }
3019
+
3020
+ // src/context/ViewCanvasContext.tsx
3021
+ import { createContext as createContext2, useContext as useContext2 } from "react";
3022
+ import { jsx as jsx3 } from "react/jsx-runtime";
3023
+ var ViewCanvasContext = createContext2(null);
3024
+ function ViewCanvasProvider({
3025
+ options,
3026
+ children
3027
+ }) {
3028
+ const canvas = useViewCanvas(options);
3029
+ return /* @__PURE__ */ jsx3(ViewCanvasContext.Provider, { value: canvas, children });
3030
+ }
3031
+ function useViewCanvasContext() {
3032
+ const ctx = useContext2(ViewCanvasContext);
3033
+ if (ctx === null) {
3034
+ throw new Error(
3035
+ "useViewCanvasContext must be used within a <ViewCanvasProvider>"
3036
+ );
3037
+ }
3038
+ return ctx;
3039
+ }
3040
+
2979
3041
  // src/overlay/ObjectOverlay.tsx
2980
3042
  import { useEffect as useEffect6, useRef as useRef7 } from "react";
2981
3043
  import { Stack } from "@mui/material";
2982
3044
  import { util as util4 } from "fabric";
2983
- import { jsx as jsx2 } from "react/jsx-runtime";
3045
+ import { jsx as jsx4 } from "react/jsx-runtime";
2984
3046
  function ObjectOverlay({
2985
3047
  canvasRef,
2986
3048
  object,
@@ -3024,7 +3086,7 @@ function ObjectOverlay({
3024
3086
  };
3025
3087
  }, [canvasRef, object]);
3026
3088
  if (!object) return null;
3027
- return /* @__PURE__ */ jsx2(
3089
+ return /* @__PURE__ */ jsx4(
3028
3090
  Stack,
3029
3091
  {
3030
3092
  ref: stackRef,
@@ -3045,7 +3107,7 @@ function ObjectOverlay({
3045
3107
  // src/overlay/OverlayContent.tsx
3046
3108
  import { Stack as Stack2 } from "@mui/material";
3047
3109
  import { useEffect as useEffect7, useRef as useRef8 } from "react";
3048
- import { jsx as jsx3 } from "react/jsx-runtime";
3110
+ import { jsx as jsx5 } from "react/jsx-runtime";
3049
3111
  function OverlayContent({
3050
3112
  children,
3051
3113
  padding = 4,
@@ -3084,7 +3146,7 @@ function OverlayContent({
3084
3146
  fit();
3085
3147
  return () => observer.disconnect();
3086
3148
  }, [padding, maxScale]);
3087
- return /* @__PURE__ */ jsx3(
3149
+ return /* @__PURE__ */ jsx5(
3088
3150
  Stack2,
3089
3151
  {
3090
3152
  ref: outerRef,
@@ -3097,7 +3159,7 @@ function OverlayContent({
3097
3159
  ...sx
3098
3160
  },
3099
3161
  ...rest,
3100
- children: /* @__PURE__ */ jsx3(
3162
+ children: /* @__PURE__ */ jsx5(
3101
3163
  Stack2,
3102
3164
  {
3103
3165
  ref: innerRef,
@@ -3117,7 +3179,7 @@ function OverlayContent({
3117
3179
  // src/overlay/FixedSizeContent.tsx
3118
3180
  import { Stack as Stack3 } from "@mui/material";
3119
3181
  import { useEffect as useEffect8, useRef as useRef9 } from "react";
3120
- import { jsx as jsx4 } from "react/jsx-runtime";
3182
+ import { jsx as jsx6 } from "react/jsx-runtime";
3121
3183
  function FixedSizeContent({
3122
3184
  children,
3123
3185
  hideOnOverflow = true,
@@ -3164,7 +3226,7 @@ function FixedSizeContent({
3164
3226
  check();
3165
3227
  return () => observer.disconnect();
3166
3228
  }, [hideOnOverflow, truncationPadding]);
3167
- return /* @__PURE__ */ jsx4(
3229
+ return /* @__PURE__ */ jsx6(
3168
3230
  Stack3,
3169
3231
  {
3170
3232
  ref,
@@ -3191,11 +3253,36 @@ function FixedSizeContent({
3191
3253
  // src/overlay/OverlayBadge.tsx
3192
3254
  import { Stack as Stack4 } from "@mui/material";
3193
3255
  import { useEffect as useEffect9, useRef as useRef10 } from "react";
3194
- import { jsx as jsx5 } from "react/jsx-runtime";
3256
+ import { jsx as jsx7 } from "react/jsx-runtime";
3195
3257
  function toPx(v) {
3196
3258
  if (v === void 0) return void 0;
3197
3259
  return typeof v === "number" ? `${v}px` : v;
3198
3260
  }
3261
+ function deriveAngle(top, right, bottom, left) {
3262
+ const hasTop = top !== void 0;
3263
+ const hasRight = right !== void 0;
3264
+ const hasBottom = bottom !== void 0;
3265
+ const hasLeft = left !== void 0;
3266
+ if (hasTop && hasRight) return 45;
3267
+ if (hasTop && hasLeft) return 135;
3268
+ if (hasBottom && hasRight) return 315;
3269
+ if (hasBottom && hasLeft) return 225;
3270
+ if (hasTop) return 90;
3271
+ if (hasRight) return 0;
3272
+ if (hasBottom) return 270;
3273
+ if (hasLeft) return 180;
3274
+ return 45;
3275
+ }
3276
+ function ellipsePosition(angleDeg) {
3277
+ const rad = angleDeg * Math.PI / 180;
3278
+ return {
3279
+ pctX: 50 + 50 * Math.cos(rad),
3280
+ pctY: 50 - 50 * Math.sin(rad)
3281
+ };
3282
+ }
3283
+ function toNum(v) {
3284
+ return typeof v === "number" ? v : 0;
3285
+ }
3199
3286
  function OverlayBadge({
3200
3287
  children,
3201
3288
  maxScale = 2,
@@ -3204,6 +3291,7 @@ function OverlayBadge({
3204
3291
  right,
3205
3292
  bottom,
3206
3293
  left,
3294
+ circular = false,
3207
3295
  sx,
3208
3296
  ...rest
3209
3297
  }) {
@@ -3234,7 +3322,8 @@ function OverlayBadge({
3234
3322
  const overlayScale = parseFloat(
3235
3323
  getComputedStyle(el).getPropertyValue("--overlay-scale")
3236
3324
  ) || 1;
3237
- el.style.transform = `scale(${ownScale / overlayScale})`;
3325
+ const scale = `scale(${ownScale / overlayScale})`;
3326
+ el.style.transform = circular ? `translate(-50%, -50%) ${scale}` : scale;
3238
3327
  });
3239
3328
  }
3240
3329
  const observer = new ResizeObserver(update);
@@ -3244,17 +3333,29 @@ function OverlayBadge({
3244
3333
  observer.disconnect();
3245
3334
  baseSize.current = null;
3246
3335
  };
3247
- }, [maxScale, minScale]);
3248
- return /* @__PURE__ */ jsx5(
3336
+ }, [maxScale, minScale, circular]);
3337
+ const positionSx = circular ? (() => {
3338
+ const angle = deriveAngle(top, right, bottom, left);
3339
+ const { pctX, pctY } = ellipsePosition(angle);
3340
+ const leftOffset = toNum(left) - toNum(right);
3341
+ const topOffset = toNum(top) - toNum(bottom);
3342
+ return {
3343
+ left: `calc(${pctX}% + ${leftOffset}px)`,
3344
+ top: `calc(${pctY}% + ${topOffset}px)`
3345
+ };
3346
+ })() : {
3347
+ top: toPx(top),
3348
+ right: toPx(right),
3349
+ bottom: toPx(bottom),
3350
+ left: toPx(left)
3351
+ };
3352
+ return /* @__PURE__ */ jsx7(
3249
3353
  Stack4,
3250
3354
  {
3251
3355
  ref,
3252
3356
  sx: {
3253
3357
  position: "absolute",
3254
- top: toPx(top),
3255
- right: toPx(right),
3256
- bottom: toPx(bottom),
3257
- left: toPx(left),
3358
+ ...positionSx,
3258
3359
  transformOrigin: "center center",
3259
3360
  pointerEvents: "auto",
3260
3361
  width: "max-content",
@@ -3286,6 +3387,7 @@ export {
3286
3387
  DEFAULT_DRAG_SHAPE_STYLE,
3287
3388
  DEFAULT_GUIDELINE_SHAPE_STYLE,
3288
3389
  DEFAULT_SHAPE_STYLE,
3390
+ EditCanvasProvider,
3289
3391
  Canvas2 as FabricCanvas,
3290
3392
  FabricImage3 as FabricImage,
3291
3393
  FabricObject5 as FabricObject,
@@ -3296,6 +3398,7 @@ export {
3296
3398
  Point9 as Point,
3297
3399
  Polygon5 as Polygon,
3298
3400
  Rect6 as Rect,
3401
+ ViewCanvasProvider,
3299
3402
  createCircle,
3300
3403
  createCircleAtPoint,
3301
3404
  createHistoryTracker,
@@ -3338,7 +3441,9 @@ export {
3338
3441
  useCanvasEvents,
3339
3442
  useCanvasTooltip,
3340
3443
  useEditCanvas,
3444
+ useEditCanvasContext,
3341
3445
  useViewCanvas,
3446
+ useViewCanvasContext,
3342
3447
  util5 as util
3343
3448
  };
3344
3449
  //# sourceMappingURL=index.js.map