@mhamz.01/easyflow-whiteboard 2.150.0 → 2.152.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;IACtB,qBAAqB,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,IAAI,CAAC,CAAC;CAC5D;;AAaD,wBAqqBG"}
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;IACtB,qBAAqB,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,IAAI,CAAC,CAAC;CAC5D;;AAaD,wBAyrBG"}
@@ -18,6 +18,8 @@ export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTask
18
18
  const localDocumentsRef = useRef(localDocuments);
19
19
  const selectedIdsRef = useRef(selectedIds);
20
20
  const isHtmlSelectingRef = useRef(false);
21
+ const isSelectionBoxActiveRef = useRef(false);
22
+ const htmlNodesSelectedByBoxRef = useRef(false);
21
23
  localTasksRef.current = localTasks;
22
24
  localDocumentsRef.current = localDocuments;
23
25
  selectedIdsRef.current = selectedIds;
@@ -154,6 +156,9 @@ export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTask
154
156
  activeObjects.includes(target); // ← target must be IN the selection, not just any click
155
157
  if (isClickingIntoActiveSelection)
156
158
  return;
159
+ if (isSelectionBoxActiveRef.current)
160
+ return;
161
+ htmlNodesSelectedByBoxRef.current = false;
157
162
  setSelectedIds(new Set());
158
163
  };
159
164
  // const handleSelectionCleared = () => {
@@ -162,11 +167,19 @@ export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTask
162
167
  const handleFabricSelectionCreated = () => {
163
168
  if (isHtmlSelectingRef.current)
164
169
  return; // ← skip if HTML node initiated this
170
+ if (isSelectionBoxActiveRef.current)
171
+ return; // ← add this
172
+ if (htmlNodesSelectedByBoxRef.current)
173
+ return;
165
174
  setSelectedIds(new Set());
166
175
  };
167
176
  const handleFabricSelectionUpdated = () => {
168
177
  if (isHtmlSelectingRef.current)
169
178
  return; // ← skip if HTML node initiated this
179
+ if (isSelectionBoxActiveRef.current)
180
+ return; // ← add this
181
+ if (htmlNodesSelectedByBoxRef.current)
182
+ return;
170
183
  setSelectedIds(new Set());
171
184
  };
172
185
  canvas.on("object:moving", handleObjectMoving);
@@ -208,8 +221,11 @@ export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTask
208
221
  };
209
222
  // ── Selection box detection ──────────────────────────────────────────────────
210
223
  useEffect(() => {
211
- if (!selectionBox)
224
+ if (!selectionBox) {
225
+ isSelectionBoxActiveRef.current = false;
212
226
  return;
227
+ }
228
+ isSelectionBoxActiveRef.current = true;
213
229
  // ── O(n) single pass — no sort, no join, no extra allocations ──
214
230
  const newSelected = new Set();
215
231
  for (const task of localTasksRef.current) {
@@ -222,13 +238,17 @@ export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTask
222
238
  }
223
239
  // ── O(n) equality check: size first (fast path), then membership ──
224
240
  setSelectedIds((prev) => {
225
- if (prev.size !== newSelected.size)
241
+ if (prev.size !== newSelected.size) {
242
+ htmlNodesSelectedByBoxRef.current = newSelected.size > 0; // ← track if any HTML nodes selected
226
243
  return newSelected;
244
+ }
227
245
  for (const id of newSelected) {
228
- if (!prev.has(id))
229
- return newSelected; // found a difference, swap
246
+ if (!prev.has(id)) {
247
+ htmlNodesSelectedByBoxRef.current = newSelected.size > 0;
248
+ return newSelected;
249
+ }
230
250
  }
231
- return prev; // identical — return same reference, no re-render
251
+ return prev;
232
252
  });
233
253
  }, [selectionBox, localTasks, localDocuments, canvasZoom, canvasViewport]);
234
254
  // ── Drag start (HTML Node side) ──────────────────────────────────────────────
@@ -409,6 +429,7 @@ export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTask
409
429
  canvas.requestRenderAll();
410
430
  isHtmlSelectingRef.current = false; // ← reset immediately
411
431
  }
432
+ htmlNodesSelectedByBoxRef.current = false;
412
433
  if (e?.shiftKey || e?.ctrlKey || e?.metaKey) {
413
434
  setSelectedIds((prev) => {
414
435
  const next = new Set(prev);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mhamz.01/easyflow-whiteboard",
3
- "version": "2.150.0",
3
+ "version": "2.152.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",