@mhamz.01/easyflow-whiteboard 2.138.0 → 2.140.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.
@@ -1 +1 @@
1
- {"version":3,"file":"custom-node-overlay-layer.d.ts","sourceRoot":"","sources":["../../../src/components/node/custom-node-overlay-layer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAI9C,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,MAAM,CAAC;IACxC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,UAAU,uBAAuB;IAC/B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACxC,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,YAAY,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACzE,qBAAqB,CAAC,EAAE,YAAY,EAAE,CAAC;IACvC,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;;AAaD,wBA6pBG"}
1
+ {"version":3,"file":"custom-node-overlay-layer.d.ts","sourceRoot":"","sources":["../../../src/components/node/custom-node-overlay-layer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAI9C,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,MAAM,CAAC;IACxC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,UAAU,uBAAuB;IAC/B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACxC,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,YAAY,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACzE,qBAAqB,CAAC,EAAE,YAAY,EAAE,CAAC;IACvC,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;;AAaD,wBAkpBG"}
@@ -282,8 +282,8 @@ export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTask
282
282
  itemIds: itemsToDrag,
283
283
  startPositions,
284
284
  canvasObjectsStartPos,
285
- offsetX: clickWorldX, // Now stored as World Units
286
- offsetY: clickWorldY, // Now stored as World Units
285
+ offsetX: worldOffsetX, // was clickWorldX, should be the offset
286
+ offsetY: worldOffsetY, // was clickWorldY
287
287
  };
288
288
  if (!selectedIdsRef.current.has(itemId) && dragStateRef.current.itemIds.length === 0) {
289
289
  setSelectedIds(new Set([itemId]));
@@ -323,14 +323,18 @@ export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTask
323
323
  const currentWorldY = (pointer.clientY - liveVpY) / liveZoom;
324
324
  // 4. Calculate where the "Anchor" node should be in World Units
325
325
  // (Current Mouse World - Initial World Offset from Start)
326
- const deltaX = currentWorldX - offsetX;
327
- const deltaY = currentWorldY - offsetY;
326
+ // const deltaX = currentWorldX - offsetX;
327
+ // const deltaY = currentWorldY - offsetY;
328
328
  // 5. Calculate the Movement Delta in World Units
329
329
  // We compare where the first item started vs where it is now.
330
330
  const firstId = itemIds[0];
331
331
  const firstStart = startPositions.get(firstId);
332
332
  if (!firstStart)
333
333
  return;
334
+ const anchorTargetX = currentWorldX - offsetX;
335
+ const anchorTargetY = currentWorldY - offsetY;
336
+ const deltaX = anchorTargetX - firstStart.x;
337
+ const deltaY = anchorTargetY - firstStart.y;
334
338
  // 6. Update HTML Nodes (Batching these into one state update)
335
339
  setLocalTasks((prev) => prev.map((t) => itemIds.includes(t.id)
336
340
  ? {
@@ -439,20 +443,13 @@ export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTask
439
443
  }, [onTasksUpdate, onDocumentsUpdate]); // Issue 9: only stable callbacks
440
444
  // ── Render helper ────────────────────────────────────────────────────────────
441
445
  const renderItem = (id, x, y, children) => {
442
- const screenX = x * canvasZoom;
443
- const screenY = y * canvasZoom;
444
- // 1. Detect if the user is interacting with the canvas at all
445
446
  const isDragging = dragging?.itemIds.includes(id);
446
447
  return (_jsx("div", { className: "pointer-events-auto absolute", style: {
447
448
  left: 0,
448
449
  top: 0,
449
- // 2. Use translate3d for GPU performance
450
- transform: `translate3d(${x}px, ${y}px, 0) scale(${canvasZoom})`,
450
+ transform: `translate3d(${x}px, ${y}px, 0)`, // world units only
451
451
  transformOrigin: "top left",
452
- // 3. THE FIX: Remove transition entirely during any viewport change
453
- // Any 'ease' during zoom causes the "shaking" behavior.
454
452
  transition: "none",
455
- // 4. Optimization
456
453
  willChange: "transform",
457
454
  zIndex: isDragging ? 1000 : 1,
458
455
  }, children: children }, id));
@@ -461,7 +458,7 @@ export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTask
461
458
  if (e.target === e.currentTarget)
462
459
  setSelectedIds(new Set());
463
460
  }, children: _jsxs("div", { className: "absolute top-0 left-0 pointer-events-none", style: {
464
- transform: `translate(${canvasViewport.x}px, ${canvasViewport.y}px)`,
461
+ transform: `translate(${canvasViewport.x}px, ${canvasViewport.y}px) scale(${canvasZoom})`,
465
462
  transformOrigin: "top left",
466
463
  }, children: [localTasks.map((task) => renderItem(task.id, task.x, task.y, _jsx(TaskNode, { ...task, isSelected: selectedIds.has(task.id), onSelect: handleSelect, onDragStart: handleDragStart, onStatusChange: handleStatusChange, zoom: 1 }))), localDocuments.map((doc) => renderItem(doc.id, doc.x, doc.y, _jsx(DocumentNode, { ...doc, isSelected: selectedIds.has(doc.id), onSelect: handleSelect, onDragStart: handleDragStart })))] }) }));
467
464
  }, (prev, next) => {
@@ -58,7 +58,7 @@ const MemoizedOverlayWrapper = React.memo(function OverlayWrapper({ tasks, docum
58
58
  canvas.on("after:render", updateViewport);
59
59
  updateViewport(); // Initial sync
60
60
  return () => {
61
- canvas.off("viewport:changed", updateViewport);
61
+ canvas.off("after:render", updateViewport); // ← was "viewport:changed", must match registration
62
62
  };
63
63
  }, [fabricCanvasRef, canvasReady]);
64
64
  return (_jsx(CanvasOverlayLayer, { tasks: tasks, documents: documents, onTasksUpdate: onTasksUpdate, onDocumentsUpdate: onDocumentsUpdate, canvasZoom: canvasZoom, canvasViewport: canvasViewport, selectionBox: selectionBox, selectedCanvasObjects: selectedCanvasObjects, fabricCanvas: fabricCanvasRef, canvasReady: canvasReady }));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mhamz.01/easyflow-whiteboard",
3
- "version": "2.138.0",
3
+ "version": "2.140.0",
4
4
  "description": "A feature-rich whiteboard component built with Fabric.js and React",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",