@bwp-web/canvas 0.4.3 → 0.5.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/index.d.ts CHANGED
@@ -40,7 +40,7 @@ export type { CursorSnapResult, CursorSnapOptions, GuidelineStyle, } from './ali
40
40
  export { deleteObjects, enableKeyboardShortcuts } from './keyboard';
41
41
  export { enableScaledStrokes, serializeCanvas, loadCanvas, getBaseStrokeWidth, } from './serialization';
42
42
  export type { SerializeOptions, LoadCanvasOptions } from './serialization';
43
- export { fitViewportToBackground, getBackgroundSrc, setBackgroundOpacity, getBackgroundOpacity, setBackgroundInverted, getBackgroundInverted, resizeImageUrl, setBackgroundImage, } from './background';
43
+ export { fitViewportToBackground, getBackgroundSrc, setBackgroundContrast, getBackgroundContrast, setBackgroundInverted, getBackgroundInverted, resizeImageUrl, setBackgroundImage, } from './background';
44
44
  export type { FitViewportOptions, ResizeResult, ResizeImageOptions, SetBackgroundImageOptions, } from './background';
45
45
  export { DEFAULT_CONTROL_STYLE, DEFAULT_SHAPE_STYLE, DEFAULT_CIRCLE_STYLE, DEFAULT_DRAG_SHAPE_STYLE, DEFAULT_GUIDELINE_SHAPE_STYLE, DEFAULT_ALIGNMENT_STYLE, } from './styles';
46
46
  export { Canvas as FabricCanvas, FabricObject, FabricImage, Rect, Polygon, Point, util, } from 'fabric';
@@ -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":"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,SAAS,CAAC;AAC3C,YAAY,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAGvD,YAAY,EACV,OAAO,EACP,iBAAiB,EACjB,eAAe,EACf,sBAAsB,EACtB,2BAA2B,EAC3B,UAAU,EACV,SAAS,GACV,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,aAAa,GACd,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAE1E,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACzE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEpE,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,yBAAyB,EACzB,WAAW,GACZ,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAGpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC7D,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACxE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,YAAY,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,GACf,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAGpE,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,UAAU,EACV,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAG3E,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,6BAA6B,EAC7B,uBAAuB,GACxB,MAAM,UAAU,CAAC;AAKlB,OAAO,EACL,MAAM,IAAI,YAAY,EACtB,YAAY,EACZ,WAAW,EACX,IAAI,EACJ,OAAO,EACP,KAAK,EACL,IAAI,GACL,MAAM,QAAQ,CAAC"}
package/dist/index.js CHANGED
@@ -94,7 +94,7 @@ import {
94
94
  var DEFAULT_MIN_ZOOM = 0.2;
95
95
  var DEFAULT_MAX_ZOOM = 10;
96
96
  var DEFAULT_ZOOM_FACTOR = 1.03;
97
- var DEFAULT_ZOOM_STEP = 0.2;
97
+ var DEFAULT_ZOOM_STEP = 1.2;
98
98
  var DEFAULT_VIEWPORT_PADDING = 0.05;
99
99
  var BASE_CANVAS_SIZE = 1e3;
100
100
  var DEFAULT_SNAP_MARGIN = 6;
@@ -276,15 +276,15 @@ function enablePanAndZoom(canvas, options) {
276
276
  setEnabled(value) {
277
277
  enabled = value;
278
278
  },
279
- zoomIn(step = DEFAULT_ZOOM_STEP) {
280
- const z = Math.min(canvas.getZoom() + step, bounds.maxZoom);
279
+ zoomIn(factor = DEFAULT_ZOOM_STEP) {
280
+ const z = Math.min(canvas.getZoom() * factor, bounds.maxZoom);
281
281
  canvas.zoomToPoint(
282
282
  new Point(canvas.getWidth() / 2, canvas.getHeight() / 2),
283
283
  z
284
284
  );
285
285
  },
286
- zoomOut(step = DEFAULT_ZOOM_STEP) {
287
- const z = Math.max(canvas.getZoom() - step, bounds.minZoom);
286
+ zoomOut(factor = DEFAULT_ZOOM_STEP) {
287
+ const z = Math.max(canvas.getZoom() / factor, bounds.minZoom);
288
288
  canvas.zoomToPoint(
289
289
  new Point(canvas.getWidth() / 2, canvas.getHeight() / 2),
290
290
  z
@@ -383,15 +383,37 @@ function fitViewportToBackground(canvas, options) {
383
383
  canvas.setViewportTransform([scale, 0, 0, scale, offsetX, offsetY]);
384
384
  canvas.requestRenderAll();
385
385
  }
386
- function setBackgroundOpacity(canvas, opacity) {
386
+ function setBackgroundContrast(canvas, value) {
387
387
  const bg = getBackgroundImage(canvas);
388
388
  if (!bg) return;
389
- bg.set("opacity", Math.min(1, Math.max(0, opacity)));
389
+ const contrast = Math.min(Math.max(value, 0), 2) - 1;
390
+ const currentFilters = bg.filters ?? [];
391
+ const contrastIdx = currentFilters.findIndex(
392
+ (f) => f instanceof filters.Contrast
393
+ );
394
+ if (contrast === 0) {
395
+ if (contrastIdx >= 0) {
396
+ bg.filters = currentFilters.filter(
397
+ (f) => !(f instanceof filters.Contrast)
398
+ );
399
+ bg.applyFilters();
400
+ }
401
+ } else if (contrastIdx >= 0) {
402
+ currentFilters[contrastIdx].contrast = contrast;
403
+ bg.applyFilters();
404
+ } else {
405
+ bg.filters = [...currentFilters, new filters.Contrast({ contrast })];
406
+ bg.applyFilters();
407
+ }
390
408
  canvas.requestRenderAll();
391
409
  }
392
- function getBackgroundOpacity(canvas) {
410
+ function getBackgroundContrast(canvas) {
393
411
  const bg = getBackgroundImage(canvas);
394
- return bg?.opacity ?? 1;
412
+ if (!bg) return 1;
413
+ const contrastFilter = bg.filters?.find(
414
+ (f) => f instanceof filters.Contrast
415
+ );
416
+ return 1 + (contrastFilter?.contrast ?? 0);
395
417
  }
396
418
  function setBackgroundInverted(canvas, inverted) {
397
419
  const bg = getBackgroundImage(canvas);
@@ -457,7 +479,7 @@ function resizeImageUrl(url, options) {
457
479
  });
458
480
  }
459
481
  async function setBackgroundImage(canvas, url, options) {
460
- const prevOpacity = options?.preserveOpacity ? getBackgroundOpacity(canvas) : void 0;
482
+ const prevContrast = options?.preserveContrast ? getBackgroundContrast(canvas) : void 0;
461
483
  let imageUrl = url;
462
484
  if (options !== void 0) {
463
485
  const result = await resizeImageUrl(url, options);
@@ -465,8 +487,8 @@ async function setBackgroundImage(canvas, url, options) {
465
487
  }
466
488
  const img = await FabricImage.fromURL(imageUrl, { crossOrigin: "anonymous" });
467
489
  canvas.backgroundImage = img;
468
- if (prevOpacity !== void 0 && prevOpacity !== 1) {
469
- img.set("opacity", prevOpacity);
490
+ if (prevContrast !== void 0 && prevContrast !== 1) {
491
+ setBackgroundContrast(canvas, prevContrast);
470
492
  }
471
493
  canvas.requestRenderAll();
472
494
  return img;
@@ -2083,6 +2105,7 @@ function serializeCanvas(canvas, options) {
2083
2105
  }
2084
2106
  });
2085
2107
  const json = canvas.toObject(properties);
2108
+ delete json.backgroundColor;
2086
2109
  scaledWidths.forEach((scaled, obj) => {
2087
2110
  obj.strokeWidth = scaled;
2088
2111
  });
@@ -2097,6 +2120,17 @@ async function loadCanvas(canvas, json, options) {
2097
2120
  });
2098
2121
  for (const obj of toRemove) canvas.remove(obj);
2099
2122
  }
2123
+ canvas.forEachObject((obj) => {
2124
+ if (obj.originX === "center" && obj.originY === "center") return;
2125
+ const center = obj.getCenterPoint();
2126
+ obj.set({
2127
+ originX: "center",
2128
+ originY: "center",
2129
+ left: center.x,
2130
+ top: center.y
2131
+ });
2132
+ obj.setCoords();
2133
+ });
2100
2134
  canvas.forEachObject((obj) => {
2101
2135
  obj.set(DEFAULT_CONTROL_STYLE);
2102
2136
  if (obj.shapeType === "circle" && obj instanceof Rect5) {
@@ -2259,7 +2293,7 @@ function useEditCanvas(options) {
2259
2293
  async (url, bgOpts) => {
2260
2294
  const canvas = canvasRef.current;
2261
2295
  if (!canvas) throw new Error("Canvas not ready");
2262
- const resizeOpts = options?.backgroundResize !== false ? typeof options?.backgroundResize === "object" ? { ...options.backgroundResize, ...bgOpts } : { ...bgOpts } : bgOpts?.preserveOpacity ? { preserveOpacity: true } : void 0;
2296
+ const resizeOpts = options?.backgroundResize !== false ? typeof options?.backgroundResize === "object" ? { ...options.backgroundResize, ...bgOpts } : { ...bgOpts } : bgOpts?.preserveContrast ? { preserveContrast: true } : void 0;
2263
2297
  const img = await setBackgroundImage(canvas, url, resizeOpts);
2264
2298
  if (options?.autoFitToBackground !== false) {
2265
2299
  fitViewportToBackground(canvas);
@@ -2317,7 +2351,7 @@ function useEditCanvas(options) {
2317
2351
  * exceeds the configured limits (opt out via `backgroundResize: false`),
2318
2352
  * and fits the viewport after setting if `autoFitToBackground` is enabled.
2319
2353
  *
2320
- * Pass `{ preserveOpacity: true }` to keep the current background opacity
2354
+ * Pass `{ preserveContrast: true }` to keep the current background contrast
2321
2355
  * when replacing the image.
2322
2356
  */
2323
2357
  setBackground,
@@ -2707,8 +2741,8 @@ export {
2707
2741
  enableScaledStrokes,
2708
2742
  enableVertexEdit,
2709
2743
  fitViewportToBackground,
2744
+ getBackgroundContrast,
2710
2745
  getBackgroundInverted,
2711
- getBackgroundOpacity,
2712
2746
  getBackgroundSrc,
2713
2747
  getBaseStrokeWidth,
2714
2748
  getSnapPoints,
@@ -2717,9 +2751,9 @@ export {
2717
2751
  resetViewport,
2718
2752
  resizeImageUrl,
2719
2753
  serializeCanvas,
2754
+ setBackgroundContrast,
2720
2755
  setBackgroundImage,
2721
2756
  setBackgroundInverted,
2722
- setBackgroundOpacity,
2723
2757
  snapCursorPoint,
2724
2758
  useCanvasClick,
2725
2759
  useCanvasEvents,