@mhamz.01/easyflow-whiteboard 2.149.0 → 2.151.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,wBAqpBG"}
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,wBA2qBG"}
@@ -17,6 +17,8 @@ export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTask
17
17
  const localTasksRef = useRef(localTasks);
18
18
  const localDocumentsRef = useRef(localDocuments);
19
19
  const selectedIdsRef = useRef(selectedIds);
20
+ const isHtmlSelectingRef = useRef(false);
21
+ const isSelectionBoxActiveRef = useRef(false);
20
22
  localTasksRef.current = localTasks;
21
23
  localDocumentsRef.current = localDocuments;
22
24
  selectedIdsRef.current = selectedIds;
@@ -153,17 +155,37 @@ export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTask
153
155
  activeObjects.includes(target); // ← target must be IN the selection, not just any click
154
156
  if (isClickingIntoActiveSelection)
155
157
  return;
158
+ if (isSelectionBoxActiveRef.current)
159
+ return;
156
160
  setSelectedIds(new Set());
157
161
  };
158
162
  // const handleSelectionCleared = () => {
159
163
  // setSelectedIds(new Set());
160
164
  // };
165
+ const handleFabricSelectionCreated = () => {
166
+ if (isHtmlSelectingRef.current)
167
+ return; // ← skip if HTML node initiated this
168
+ if (isSelectionBoxActiveRef.current)
169
+ return; // ← add this
170
+ setSelectedIds(new Set());
171
+ };
172
+ const handleFabricSelectionUpdated = () => {
173
+ if (isHtmlSelectingRef.current)
174
+ return; // ← skip if HTML node initiated this
175
+ if (isSelectionBoxActiveRef.current)
176
+ return; // ← add this
177
+ setSelectedIds(new Set());
178
+ };
161
179
  canvas.on("object:moving", handleObjectMoving);
162
180
  canvas.on("mouse:down", handleMouseDown);
181
+ canvas.on("selection:created", handleFabricSelectionCreated); // ← add
182
+ canvas.on("selection:updated", handleFabricSelectionUpdated); // ← add
163
183
  // canvas.on("selection:cleared", handleSelectionCleared);
164
184
  return () => {
165
185
  canvas.off("object:moving", handleObjectMoving);
166
186
  canvas.off("mouse:down", handleMouseDown);
187
+ canvas.off("selection:created", handleFabricSelectionCreated); // ← add
188
+ canvas.off("selection:updated", handleFabricSelectionUpdated); // ← add
167
189
  // canvas.off("selection:cleared", handleSelectionCleared);
168
190
  if (fabricMoveRafRef.current !== null) {
169
191
  cancelAnimationFrame(fabricMoveRafRef.current);
@@ -193,8 +215,11 @@ export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTask
193
215
  };
194
216
  // ── Selection box detection ──────────────────────────────────────────────────
195
217
  useEffect(() => {
196
- if (!selectionBox)
218
+ if (!selectionBox) {
219
+ isSelectionBoxActiveRef.current = false;
197
220
  return;
221
+ }
222
+ isSelectionBoxActiveRef.current = true;
198
223
  // ── O(n) single pass — no sort, no join, no extra allocations ──
199
224
  const newSelected = new Set();
200
225
  for (const task of localTasksRef.current) {
@@ -389,8 +414,10 @@ export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTask
389
414
  const handleSelect = (id, e) => {
390
415
  const canvas = fabricCanvas?.current;
391
416
  if (canvas) {
417
+ isHtmlSelectingRef.current = true; // ← guard: we're initiating this
392
418
  canvas.discardActiveObject();
393
419
  canvas.requestRenderAll();
420
+ isHtmlSelectingRef.current = false; // ← reset immediately
394
421
  }
395
422
  if (e?.shiftKey || e?.ctrlKey || e?.metaKey) {
396
423
  setSelectedIds((prev) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mhamz.01/easyflow-whiteboard",
3
- "version": "2.149.0",
3
+ "version": "2.151.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",