canvu-react 0.4.47 → 0.4.49

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.
Files changed (51) hide show
  1. package/dist/{asset-hydration-Dc7fsnTG.d.ts → asset-hydration-BSjiek7Q.d.ts} +2 -2
  2. package/dist/{asset-hydration-Cy_2FyV5.d.cts → asset-hydration-F6aM5C7x.d.cts} +2 -2
  3. package/dist/{asset-store-TzOPvlgn.d.cts → asset-store-35ysK28r.d.cts} +1 -1
  4. package/dist/{asset-store-DQPRZEcy.d.ts → asset-store-D_FjW_CN.d.ts} +1 -1
  5. package/dist/chatbot.d.cts +6 -6
  6. package/dist/chatbot.d.ts +6 -6
  7. package/dist/index.cjs +49 -1
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.cts +53 -9
  10. package/dist/index.d.ts +53 -9
  11. package/dist/index.js +49 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/{link-item-DwzXOwU5.d.cts → link-item-BMV3VUCr.d.cts} +1 -1
  14. package/dist/{link-item-IW4GTnxl.d.ts → link-item-COoNNvCu.d.ts} +1 -1
  15. package/dist/native.cjs +59 -10
  16. package/dist/native.cjs.map +1 -1
  17. package/dist/native.d.cts +6 -6
  18. package/dist/native.d.ts +6 -6
  19. package/dist/native.js +59 -10
  20. package/dist/native.js.map +1 -1
  21. package/dist/react.cjs +259 -18
  22. package/dist/react.cjs.map +1 -1
  23. package/dist/react.d.cts +29 -13
  24. package/dist/react.d.ts +29 -13
  25. package/dist/react.js +259 -18
  26. package/dist/react.js.map +1 -1
  27. package/dist/realtime.cjs +3 -1
  28. package/dist/realtime.cjs.map +1 -1
  29. package/dist/realtime.d.cts +8 -8
  30. package/dist/realtime.d.ts +8 -8
  31. package/dist/realtime.js +3 -1
  32. package/dist/realtime.js.map +1 -1
  33. package/dist/realtimeNative.d.cts +4 -4
  34. package/dist/realtimeNative.d.ts +4 -4
  35. package/dist/{shape-builders-Cyh8zvDG.d.ts → shape-builders-BCOAG0pS.d.ts} +1 -1
  36. package/dist/{shape-builders-CKEMjivV.d.cts → shape-builders-BmLS8CNh.d.cts} +1 -1
  37. package/dist/tldraw.cjs +3 -1
  38. package/dist/tldraw.cjs.map +1 -1
  39. package/dist/tldraw.d.cts +1 -1
  40. package/dist/tldraw.d.ts +1 -1
  41. package/dist/tldraw.js +3 -1
  42. package/dist/tldraw.js.map +1 -1
  43. package/dist/{types-BUPc2Zgw.d.cts → types-6HszqSa5.d.cts} +1 -1
  44. package/dist/{types-B7xZAKVJ.d.ts → types-BAEHaIYO.d.ts} +43 -6
  45. package/dist/{types-B82WiQQh.d.ts → types-BMMPUak7.d.ts} +1 -1
  46. package/dist/{types-BQUbxMgz.d.cts → types-BOQLWyCw.d.cts} +1 -1
  47. package/dist/{types-CYtq9Pr9.d.ts → types-BtWbGOqh.d.ts} +1 -1
  48. package/dist/{types-BCCvY6ie.d.cts → types-fJNwEnHf.d.cts} +35 -1
  49. package/dist/{types-BCCvY6ie.d.ts → types-fJNwEnHf.d.ts} +35 -1
  50. package/dist/{types-C4wI3Jyc.d.cts → types-uzeExFkd.d.cts} +43 -6
  51. package/package.json +1 -1
package/dist/react.d.cts CHANGED
@@ -1,18 +1,19 @@
1
- import { I as IndexedDbImageStore } from './asset-hydration-Cy_2FyV5.cjs';
2
- export { H as HydratedSceneItemsWithAssetsResult, h as hydrateSceneItemsWithAssets } from './asset-hydration-Cy_2FyV5.cjs';
3
- import { V as VectorSceneItem } from './types-BCCvY6ie.cjs';
4
- import { V as VectorViewportAssetKind, a as VectorViewportAssetStore } from './asset-store-TzOPvlgn.cjs';
5
- export { b as VectorViewportAssetHydrationRequest, c as VectorViewportAssetResolveRequest, d as VectorViewportAssetResolveResult, e as VectorViewportAssetUploadRequest, f as VectorViewportAssetUploadResult } from './asset-store-TzOPvlgn.cjs';
6
- import { B as BoardComponentPosition, V as VectorToolDefinition, C as CanvasPlugin, a as VectorSelectionInspector } from './types-C4wI3Jyc.cjs';
7
- export { b as CanvasPluginComponentProps, c as CanvasPluginContribution, d as CanvasPluginItemsChangeMiddlewareContext, e as CanvasPluginRenderContext, f as CanvuChromeActiveToolStyle, g as CanvuChromeContext, h as CanvuChromeContextValue, i as CanvuChromeSelectionStyleChange, j as CanvuPluginContext, k as CanvuPluginContextValue, l as CanvuPluginViewportSnapshot, m as CustomShapePlacementOptions, P as PlacementPreview, n as VectorCanvasSpacePosition, o as VectorSelectionInspectorProps, p as VectorViewport, q as VectorViewportHandle, r as VectorViewportProps, W as WorldPointerDownDetail, s as createCanvuPlugin, t as getBoardPositionStyle, u as useCanvuChromeContext, v as useCanvuDocumentContext, w as useCanvuPluginContext, x as useCanvuPluginContribution, y as useCanvuResolvedTools, z as useCanvuViewportContext } from './types-C4wI3Jyc.cjs';
1
+ import { V as VectorSceneItem } from './types-fJNwEnHf.cjs';
2
+ export { C as CustomShapeResizeHandles, b as ResizeHandleId } from './types-fJNwEnHf.cjs';
3
+ import { I as IndexedDbImageStore } from './asset-hydration-F6aM5C7x.cjs';
4
+ export { H as HydratedSceneItemsWithAssetsResult, h as hydrateSceneItemsWithAssets } from './asset-hydration-F6aM5C7x.cjs';
5
+ import { V as VectorViewportAssetKind, a as VectorViewportAssetStore } from './asset-store-35ysK28r.cjs';
6
+ export { b as VectorViewportAssetHydrationRequest, c as VectorViewportAssetResolveRequest, d as VectorViewportAssetResolveResult, e as VectorViewportAssetUploadRequest, f as VectorViewportAssetUploadResult } from './asset-store-35ysK28r.cjs';
7
+ import { B as BoardComponentPosition, V as VectorToolDefinition, C as CustomShapePlacementOptions, a as CanvasPlugin, b as VectorSelectionInspector } from './types-uzeExFkd.cjs';
8
+ export { c as CanvasPluginComponentProps, d as CanvasPluginContribution, e as CanvasPluginItemsChangeMiddlewareContext, f as CanvasPluginRenderContext, g as CanvuChromeActiveToolStyle, h as CanvuChromeContext, i as CanvuChromeContextValue, j as CanvuChromeSelectionStyleChange, k as CanvuPluginContext, l as CanvuPluginContextValue, m as CanvuPluginViewportSnapshot, P as PlacementPreview, S as SelectModeItemClickDetail, n as SelectModeItemClickResult, o as VectorCanvasSpacePosition, p as VectorSelectionInspectorProps, q as VectorViewport, r as VectorViewportHandle, s as VectorViewportProps, W as WorldPointerDownDetail, t as createCanvuPlugin, u as getBoardPositionStyle, v as useCanvuChromeContext, w as useCanvuDocumentContext, x as useCanvuPluginContext, y as useCanvuPluginContribution, z as useCanvuResolvedTools, A as useCanvuViewportContext } from './types-uzeExFkd.cjs';
8
9
  import * as react_jsx_runtime from 'react/jsx-runtime';
9
10
  import * as react from 'react';
10
11
  import { CSSProperties, ReactNode, ReactElement, SVGProps } from 'react';
11
- import { C as Camera2D } from './shape-builders-CKEMjivV.cjs';
12
- import { V as VectorCanvasPersistenceAdapter, a as VectorCanvasRemoteAdapter } from './types-BUPc2Zgw.cjs';
13
- export { b as VectorCanvasSnapshot } from './types-BUPc2Zgw.cjs';
14
- import './link-item-DwzXOwU5.cjs';
15
- import './types-BQUbxMgz.cjs';
12
+ import { C as Camera2D } from './shape-builders-BmLS8CNh.cjs';
13
+ import { V as VectorCanvasPersistenceAdapter, a as VectorCanvasRemoteAdapter } from './types-6HszqSa5.cjs';
14
+ export { b as VectorCanvasSnapshot } from './types-6HszqSa5.cjs';
15
+ import './link-item-BMV3VUCr.cjs';
16
+ import './types-BOQLWyCw.cjs';
16
17
 
17
18
  /**
18
19
  * Extra context for each item created by {@link ingestAssetFilesToSceneItems}.
@@ -391,6 +392,21 @@ type CreateToolPluginOptions = VectorToolDefinition & {
391
392
  height: number;
392
393
  };
393
394
  }) => VectorSceneItem;
395
+ /**
396
+ * Whether items created by this tool should become selected immediately after placement.
397
+ *
398
+ * Defaults to `true`. Set to `false` for clickable custom tools such as pins,
399
+ * reactions, or cards that should act without showing selection handles on placement.
400
+ */
401
+ selectAfterCreate?: CustomShapePlacementOptions["selectAfterCreate"];
402
+ /**
403
+ * Handles plain clicks on this tool's items while the viewport is in select mode.
404
+ *
405
+ * Resize and rotate handles still take priority. Returning `"handled"` marks the
406
+ * click as owned by the tool; dragging past the tap threshold still falls back to
407
+ * normal move behavior.
408
+ */
409
+ onSelectModeItemClick?: CustomShapePlacementOptions["onSelectModeItemClick"];
394
410
  /**
395
411
  * Optional tool list transform applied after this tool is merged.
396
412
  *
@@ -715,4 +731,4 @@ type VectorToolbarWithStatics = ((props: VectorToolbarProps) => ReactElement) &
715
731
  */
716
732
  declare const VectorToolbar: VectorToolbarWithStatics;
717
733
 
718
- export { BoardComponentPosition, CanvasPlugin, type CreateLocalStoragePersistenceAdapterOptions, type CreateToolPluginOptions, DEFAULT_OVERFLOW_TOOL_IDS, DEFAULT_VECTOR_CANVAS_STORAGE_KEY, DEFAULT_VECTOR_TOOLS, IconArchitecturalCloud, IconArrow, IconDraw, IconEllipse, IconHand, IconImage, IconLaser, IconLine, IconRect, IconSelect, IconText, ImagesMenu, type ImagesMenuLabels, type ImagesMenuProps, type IngestAssetFileError, type IngestAssetFilesToSceneItemsOptions, type IngestAssetFilesToSceneItemsResult, type IngestedAssetItemContext, NavMenu, type NavMenuMinimapProps, type NavMenuProps, type NavMenuUndoRedoProps, type NavMenuZoomControlsProps, ShapeContextMenu, type ShapeContextMenuProps, type UseVectorCanvasDocumentOptions, type UseVectorCanvasDocumentResult, VectorCanvas, VectorCanvasBody, VectorCanvasHeader, VectorCanvasMain, VectorCanvasPersistenceAdapter, VectorCanvasRemoteAdapter, VectorCanvasRoot, type VectorCanvasSlotProps, type VectorCanvasSpaceProps, VectorCanvasToolbar, type VectorCanvasToolbarProps, VectorCanvasViewportSurface, VectorSelectionInspector, VectorToolDefinition, VectorToolbar, type VectorToolbarOverflowProps, type VectorToolbarProps, type VectorToolbarRenderContext, type VectorToolbarToolLockProps, type VectorToolbarToolProps, VectorViewportAssetKind, VectorViewportAssetStore, createIndexedDbPersistenceAdapter, createLocalStoragePersistenceAdapter, createNoopPersistenceAdapter, createToolPlugin, cursorForVectorToolId, ingestAssetFilesToSceneItems, useVectorCanvasDocument };
734
+ export { BoardComponentPosition, CanvasPlugin, type CreateLocalStoragePersistenceAdapterOptions, type CreateToolPluginOptions, CustomShapePlacementOptions, DEFAULT_OVERFLOW_TOOL_IDS, DEFAULT_VECTOR_CANVAS_STORAGE_KEY, DEFAULT_VECTOR_TOOLS, IconArchitecturalCloud, IconArrow, IconDraw, IconEllipse, IconHand, IconImage, IconLaser, IconLine, IconRect, IconSelect, IconText, ImagesMenu, type ImagesMenuLabels, type ImagesMenuProps, type IngestAssetFileError, type IngestAssetFilesToSceneItemsOptions, type IngestAssetFilesToSceneItemsResult, type IngestedAssetItemContext, NavMenu, type NavMenuMinimapProps, type NavMenuProps, type NavMenuUndoRedoProps, type NavMenuZoomControlsProps, ShapeContextMenu, type ShapeContextMenuProps, type UseVectorCanvasDocumentOptions, type UseVectorCanvasDocumentResult, VectorCanvas, VectorCanvasBody, VectorCanvasHeader, VectorCanvasMain, VectorCanvasPersistenceAdapter, VectorCanvasRemoteAdapter, VectorCanvasRoot, type VectorCanvasSlotProps, type VectorCanvasSpaceProps, VectorCanvasToolbar, type VectorCanvasToolbarProps, VectorCanvasViewportSurface, VectorSelectionInspector, VectorToolDefinition, VectorToolbar, type VectorToolbarOverflowProps, type VectorToolbarProps, type VectorToolbarRenderContext, type VectorToolbarToolLockProps, type VectorToolbarToolProps, VectorViewportAssetKind, VectorViewportAssetStore, createIndexedDbPersistenceAdapter, createLocalStoragePersistenceAdapter, createNoopPersistenceAdapter, createToolPlugin, cursorForVectorToolId, ingestAssetFilesToSceneItems, useVectorCanvasDocument };
package/dist/react.d.ts CHANGED
@@ -1,18 +1,19 @@
1
- import { I as IndexedDbImageStore } from './asset-hydration-Dc7fsnTG.js';
2
- export { H as HydratedSceneItemsWithAssetsResult, h as hydrateSceneItemsWithAssets } from './asset-hydration-Dc7fsnTG.js';
3
- import { V as VectorSceneItem } from './types-BCCvY6ie.js';
4
- import { V as VectorViewportAssetKind, a as VectorViewportAssetStore } from './asset-store-DQPRZEcy.js';
5
- export { b as VectorViewportAssetHydrationRequest, c as VectorViewportAssetResolveRequest, d as VectorViewportAssetResolveResult, e as VectorViewportAssetUploadRequest, f as VectorViewportAssetUploadResult } from './asset-store-DQPRZEcy.js';
6
- import { B as BoardComponentPosition, V as VectorToolDefinition, C as CanvasPlugin, a as VectorSelectionInspector } from './types-B7xZAKVJ.js';
7
- export { b as CanvasPluginComponentProps, c as CanvasPluginContribution, d as CanvasPluginItemsChangeMiddlewareContext, e as CanvasPluginRenderContext, f as CanvuChromeActiveToolStyle, g as CanvuChromeContext, h as CanvuChromeContextValue, i as CanvuChromeSelectionStyleChange, j as CanvuPluginContext, k as CanvuPluginContextValue, l as CanvuPluginViewportSnapshot, m as CustomShapePlacementOptions, P as PlacementPreview, n as VectorCanvasSpacePosition, o as VectorSelectionInspectorProps, p as VectorViewport, q as VectorViewportHandle, r as VectorViewportProps, W as WorldPointerDownDetail, s as createCanvuPlugin, t as getBoardPositionStyle, u as useCanvuChromeContext, v as useCanvuDocumentContext, w as useCanvuPluginContext, x as useCanvuPluginContribution, y as useCanvuResolvedTools, z as useCanvuViewportContext } from './types-B7xZAKVJ.js';
1
+ import { V as VectorSceneItem } from './types-fJNwEnHf.js';
2
+ export { C as CustomShapeResizeHandles, b as ResizeHandleId } from './types-fJNwEnHf.js';
3
+ import { I as IndexedDbImageStore } from './asset-hydration-BSjiek7Q.js';
4
+ export { H as HydratedSceneItemsWithAssetsResult, h as hydrateSceneItemsWithAssets } from './asset-hydration-BSjiek7Q.js';
5
+ import { V as VectorViewportAssetKind, a as VectorViewportAssetStore } from './asset-store-D_FjW_CN.js';
6
+ export { b as VectorViewportAssetHydrationRequest, c as VectorViewportAssetResolveRequest, d as VectorViewportAssetResolveResult, e as VectorViewportAssetUploadRequest, f as VectorViewportAssetUploadResult } from './asset-store-D_FjW_CN.js';
7
+ import { B as BoardComponentPosition, V as VectorToolDefinition, C as CustomShapePlacementOptions, a as CanvasPlugin, b as VectorSelectionInspector } from './types-BAEHaIYO.js';
8
+ export { c as CanvasPluginComponentProps, d as CanvasPluginContribution, e as CanvasPluginItemsChangeMiddlewareContext, f as CanvasPluginRenderContext, g as CanvuChromeActiveToolStyle, h as CanvuChromeContext, i as CanvuChromeContextValue, j as CanvuChromeSelectionStyleChange, k as CanvuPluginContext, l as CanvuPluginContextValue, m as CanvuPluginViewportSnapshot, P as PlacementPreview, S as SelectModeItemClickDetail, n as SelectModeItemClickResult, o as VectorCanvasSpacePosition, p as VectorSelectionInspectorProps, q as VectorViewport, r as VectorViewportHandle, s as VectorViewportProps, W as WorldPointerDownDetail, t as createCanvuPlugin, u as getBoardPositionStyle, v as useCanvuChromeContext, w as useCanvuDocumentContext, x as useCanvuPluginContext, y as useCanvuPluginContribution, z as useCanvuResolvedTools, A as useCanvuViewportContext } from './types-BAEHaIYO.js';
8
9
  import * as react_jsx_runtime from 'react/jsx-runtime';
9
10
  import * as react from 'react';
10
11
  import { CSSProperties, ReactNode, ReactElement, SVGProps } from 'react';
11
- import { C as Camera2D } from './shape-builders-Cyh8zvDG.js';
12
- import { V as VectorCanvasPersistenceAdapter, a as VectorCanvasRemoteAdapter } from './types-CYtq9Pr9.js';
13
- export { b as VectorCanvasSnapshot } from './types-CYtq9Pr9.js';
14
- import './link-item-IW4GTnxl.js';
15
- import './types-B82WiQQh.js';
12
+ import { C as Camera2D } from './shape-builders-BCOAG0pS.js';
13
+ import { V as VectorCanvasPersistenceAdapter, a as VectorCanvasRemoteAdapter } from './types-BtWbGOqh.js';
14
+ export { b as VectorCanvasSnapshot } from './types-BtWbGOqh.js';
15
+ import './link-item-COoNNvCu.js';
16
+ import './types-BMMPUak7.js';
16
17
 
17
18
  /**
18
19
  * Extra context for each item created by {@link ingestAssetFilesToSceneItems}.
@@ -391,6 +392,21 @@ type CreateToolPluginOptions = VectorToolDefinition & {
391
392
  height: number;
392
393
  };
393
394
  }) => VectorSceneItem;
395
+ /**
396
+ * Whether items created by this tool should become selected immediately after placement.
397
+ *
398
+ * Defaults to `true`. Set to `false` for clickable custom tools such as pins,
399
+ * reactions, or cards that should act without showing selection handles on placement.
400
+ */
401
+ selectAfterCreate?: CustomShapePlacementOptions["selectAfterCreate"];
402
+ /**
403
+ * Handles plain clicks on this tool's items while the viewport is in select mode.
404
+ *
405
+ * Resize and rotate handles still take priority. Returning `"handled"` marks the
406
+ * click as owned by the tool; dragging past the tap threshold still falls back to
407
+ * normal move behavior.
408
+ */
409
+ onSelectModeItemClick?: CustomShapePlacementOptions["onSelectModeItemClick"];
394
410
  /**
395
411
  * Optional tool list transform applied after this tool is merged.
396
412
  *
@@ -715,4 +731,4 @@ type VectorToolbarWithStatics = ((props: VectorToolbarProps) => ReactElement) &
715
731
  */
716
732
  declare const VectorToolbar: VectorToolbarWithStatics;
717
733
 
718
- export { BoardComponentPosition, CanvasPlugin, type CreateLocalStoragePersistenceAdapterOptions, type CreateToolPluginOptions, DEFAULT_OVERFLOW_TOOL_IDS, DEFAULT_VECTOR_CANVAS_STORAGE_KEY, DEFAULT_VECTOR_TOOLS, IconArchitecturalCloud, IconArrow, IconDraw, IconEllipse, IconHand, IconImage, IconLaser, IconLine, IconRect, IconSelect, IconText, ImagesMenu, type ImagesMenuLabels, type ImagesMenuProps, type IngestAssetFileError, type IngestAssetFilesToSceneItemsOptions, type IngestAssetFilesToSceneItemsResult, type IngestedAssetItemContext, NavMenu, type NavMenuMinimapProps, type NavMenuProps, type NavMenuUndoRedoProps, type NavMenuZoomControlsProps, ShapeContextMenu, type ShapeContextMenuProps, type UseVectorCanvasDocumentOptions, type UseVectorCanvasDocumentResult, VectorCanvas, VectorCanvasBody, VectorCanvasHeader, VectorCanvasMain, VectorCanvasPersistenceAdapter, VectorCanvasRemoteAdapter, VectorCanvasRoot, type VectorCanvasSlotProps, type VectorCanvasSpaceProps, VectorCanvasToolbar, type VectorCanvasToolbarProps, VectorCanvasViewportSurface, VectorSelectionInspector, VectorToolDefinition, VectorToolbar, type VectorToolbarOverflowProps, type VectorToolbarProps, type VectorToolbarRenderContext, type VectorToolbarToolLockProps, type VectorToolbarToolProps, VectorViewportAssetKind, VectorViewportAssetStore, createIndexedDbPersistenceAdapter, createLocalStoragePersistenceAdapter, createNoopPersistenceAdapter, createToolPlugin, cursorForVectorToolId, ingestAssetFilesToSceneItems, useVectorCanvasDocument };
734
+ export { BoardComponentPosition, CanvasPlugin, type CreateLocalStoragePersistenceAdapterOptions, type CreateToolPluginOptions, CustomShapePlacementOptions, DEFAULT_OVERFLOW_TOOL_IDS, DEFAULT_VECTOR_CANVAS_STORAGE_KEY, DEFAULT_VECTOR_TOOLS, IconArchitecturalCloud, IconArrow, IconDraw, IconEllipse, IconHand, IconImage, IconLaser, IconLine, IconRect, IconSelect, IconText, ImagesMenu, type ImagesMenuLabels, type ImagesMenuProps, type IngestAssetFileError, type IngestAssetFilesToSceneItemsOptions, type IngestAssetFilesToSceneItemsResult, type IngestedAssetItemContext, NavMenu, type NavMenuMinimapProps, type NavMenuProps, type NavMenuUndoRedoProps, type NavMenuZoomControlsProps, ShapeContextMenu, type ShapeContextMenuProps, type UseVectorCanvasDocumentOptions, type UseVectorCanvasDocumentResult, VectorCanvas, VectorCanvasBody, VectorCanvasHeader, VectorCanvasMain, VectorCanvasPersistenceAdapter, VectorCanvasRemoteAdapter, VectorCanvasRoot, type VectorCanvasSlotProps, type VectorCanvasSpaceProps, VectorCanvasToolbar, type VectorCanvasToolbarProps, VectorCanvasViewportSurface, VectorSelectionInspector, VectorToolDefinition, VectorToolbar, type VectorToolbarOverflowProps, type VectorToolbarProps, type VectorToolbarRenderContext, type VectorToolbarToolLockProps, type VectorToolbarToolProps, VectorViewportAssetKind, VectorViewportAssetStore, createIndexedDbPersistenceAdapter, createLocalStoragePersistenceAdapter, createNoopPersistenceAdapter, createToolPlugin, cursorForVectorToolId, ingestAssetFilesToSceneItems, useVectorCanvasDocument };
package/dist/react.js CHANGED
@@ -3355,7 +3355,9 @@ function ToolPluginComponent({
3355
3355
  pluginId,
3356
3356
  tool,
3357
3357
  toolTransform,
3358
- createItem
3358
+ createItem,
3359
+ selectAfterCreate,
3360
+ onSelectModeItemClick
3359
3361
  }) {
3360
3362
  const contribution = useMemo(
3361
3363
  () => ({
@@ -3364,17 +3366,25 @@ function ToolPluginComponent({
3364
3366
  customPlacements: createItem ? [
3365
3367
  {
3366
3368
  toolId: tool.id,
3367
- createItem
3369
+ createItem,
3370
+ selectAfterCreate,
3371
+ onSelectModeItemClick
3368
3372
  }
3369
3373
  ] : void 0
3370
3374
  }),
3371
- [createItem, tool, toolTransform]
3375
+ [createItem, onSelectModeItemClick, selectAfterCreate, tool, toolTransform]
3372
3376
  );
3373
3377
  useCanvuPluginContribution(pluginId, contribution);
3374
3378
  return null;
3375
3379
  }
3376
3380
  function createToolPlugin(options) {
3377
- const { createItem, toolTransform, ...tool } = options;
3381
+ const {
3382
+ createItem,
3383
+ toolTransform,
3384
+ selectAfterCreate,
3385
+ onSelectModeItemClick,
3386
+ ...tool
3387
+ } = options;
3378
3388
  const pluginId = `canvu.plugin.tool:${tool.id}`;
3379
3389
  return createCanvuPlugin({
3380
3390
  id: pluginId,
@@ -3385,7 +3395,9 @@ function createToolPlugin(options) {
3385
3395
  pluginId,
3386
3396
  tool,
3387
3397
  toolTransform,
3388
- createItem
3398
+ createItem,
3399
+ selectAfterCreate,
3400
+ onSelectModeItemClick
3389
3401
  }
3390
3402
  );
3391
3403
  }
@@ -5986,7 +5998,43 @@ init_shape_builders();
5986
5998
 
5987
5999
  // src/interaction/resize-handles.ts
5988
6000
  init_rect();
5989
- var HANDLE_IDS = ["nw", "n", "ne", "e", "se", "s", "sw", "w"];
6001
+ init_link_item();
6002
+ var ALL_RESIZE_HANDLES = [
6003
+ "nw",
6004
+ "n",
6005
+ "ne",
6006
+ "e",
6007
+ "se",
6008
+ "s",
6009
+ "sw",
6010
+ "w"
6011
+ ];
6012
+ var CORNER_RESIZE_HANDLES = [
6013
+ "nw",
6014
+ "ne",
6015
+ "se",
6016
+ "sw"
6017
+ ];
6018
+ function dedupeHandles(handles) {
6019
+ const allowed = new Set(handles);
6020
+ return ALL_RESIZE_HANDLES.filter((handle) => allowed.has(handle));
6021
+ }
6022
+ function resolveCustomResizeHandles(handles) {
6023
+ if (handles === "corners") return CORNER_RESIZE_HANDLES;
6024
+ if (handles === "all" || handles === void 0) return ALL_RESIZE_HANDLES;
6025
+ return dedupeHandles(handles);
6026
+ }
6027
+ function resolveResizeHandlesForItem(item) {
6028
+ if (!item) return ALL_RESIZE_HANDLES;
6029
+ if (getLinkData(item)) return CORNER_RESIZE_HANDLES;
6030
+ if (item.toolKind === "custom") {
6031
+ return resolveCustomResizeHandles(item.customResizeHandles);
6032
+ }
6033
+ return ALL_RESIZE_HANDLES;
6034
+ }
6035
+ function itemAllowsResizeHandle(item, handle) {
6036
+ return resolveResizeHandlesForItem(item).includes(handle);
6037
+ }
5990
6038
  function getHandleWorldPosition(bounds, id) {
5991
6039
  const r = normalizeRect(bounds);
5992
6040
  const cx = r.x + r.width / 2;
@@ -6010,7 +6058,7 @@ function getHandleWorldPosition(bounds, id) {
6010
6058
  return { x: r.x, y: cy };
6011
6059
  }
6012
6060
  }
6013
- function hitTestResizeHandle(bounds, worldX, worldY, radiusWorld, rotationRad = 0) {
6061
+ function hitTestResizeHandle(bounds, worldX, worldY, radiusWorld, rotationRad = 0, handles = ALL_RESIZE_HANDLES) {
6014
6062
  const r = normalizeRect(bounds);
6015
6063
  const pl = worldToItemLocal(
6016
6064
  worldX,
@@ -6024,7 +6072,7 @@ function hitTestResizeHandle(bounds, worldX, worldY, radiusWorld, rotationRad =
6024
6072
  const localBounds = { x: 0, y: 0, width: r.width, height: r.height };
6025
6073
  let best = null;
6026
6074
  let bestD = radiusWorld;
6027
- for (const id of HANDLE_IDS) {
6075
+ for (const id of handles) {
6028
6076
  const p = getHandleWorldPosition(localBounds, id);
6029
6077
  const d = Math.hypot(pl.x - p.x, pl.y - p.y);
6030
6078
  if (d <= bestD) {
@@ -6656,6 +6704,9 @@ function moveItemByDelta(item, dx, dy) {
6656
6704
  }
6657
6705
  function resizeItemByHandle(item, start, handle, currentWorld) {
6658
6706
  const sb = normalizeRect(start.bounds);
6707
+ if (!itemAllowsResizeHandle(item, handle)) {
6708
+ return item;
6709
+ }
6659
6710
  const newBoundsRaw = computeNewBoundsForResize(item, sb, handle, currentWorld);
6660
6711
  const nb = normalizeRect(newBoundsRaw);
6661
6712
  const k = item.toolKind;
@@ -6916,6 +6967,14 @@ function formatItemPlacementTransform(item) {
6916
6967
  const cy = r.height / 2;
6917
6968
  return `translate(${item.x}, ${item.y}) translate(${cx}, ${cy}) rotate(${deg}) translate(${-cx}, ${-cy})`;
6918
6969
  }
6970
+ function itemClassName(item) {
6971
+ const kind = item.toolKind ?? "unknown";
6972
+ const classes = [`canvu-item`, `canvu-item--${kind}`];
6973
+ if (item.svgClassName) {
6974
+ classes.push(item.svgClassName);
6975
+ }
6976
+ return classes.join(" ");
6977
+ }
6919
6978
  var SvgVectorRenderer = class {
6920
6979
  container;
6921
6980
  scene;
@@ -6923,6 +6982,8 @@ var SvgVectorRenderer = class {
6923
6982
  svg;
6924
6983
  rootG;
6925
6984
  itemNodeCache = /* @__PURE__ */ new Map();
6985
+ selectedIds = /* @__PURE__ */ new Set();
6986
+ hoveredItemId = null;
6926
6987
  liveOverlay = null;
6927
6988
  resizeObserver;
6928
6989
  constructor(options) {
@@ -6943,6 +7004,20 @@ var SvgVectorRenderer = class {
6943
7004
  this.resizeObserver = new ResizeObserver(() => this.render());
6944
7005
  this.resizeObserver.observe(this.container);
6945
7006
  }
7007
+ /**
7008
+ * Updates interaction attributes on item groups for CSS hooks.
7009
+ *
7010
+ * Use `[data-canvu-selected="true"]` and `[data-canvu-hovered="true"]`
7011
+ * for animations in interactive canvases where the scene SVG may ignore
7012
+ * pointer events.
7013
+ */
7014
+ setInteractionState(state) {
7015
+ this.selectedIds = new Set(state.selectedIds ?? []);
7016
+ this.hoveredItemId = state.hoveredItemId ?? null;
7017
+ for (const [id, cached] of this.itemNodeCache) {
7018
+ this.applyInteractionAttributes(cached.g, id);
7019
+ }
7020
+ }
6946
7021
  /**
6947
7022
  * Reads container size, culls items, and updates the SVG (incrementally when possible).
6948
7023
  */
@@ -6979,6 +7054,7 @@ var SvgVectorRenderer = class {
6979
7054
  if (!this.liveOverlay) {
6980
7055
  const g = document.createElementNS("http://www.w3.org/2000/svg", "g");
6981
7056
  g.setAttribute("data-live-overlay", "true");
7057
+ g.setAttribute("data-canvu-item", "true");
6982
7058
  this.liveOverlay = {
6983
7059
  g,
6984
7060
  lastChildrenSvg: "",
@@ -6988,6 +7064,11 @@ var SvgVectorRenderer = class {
6988
7064
  }
6989
7065
  const cached = this.liveOverlay;
6990
7066
  const t = formatItemPlacementTransform(item);
7067
+ cached.g.setAttribute("class", itemClassName(item));
7068
+ cached.g.setAttribute("data-item-id", item.id);
7069
+ cached.g.setAttribute("data-tool-kind", item.toolKind ?? "");
7070
+ cached.g.setAttribute("data-canvu-selected", "false");
7071
+ cached.g.setAttribute("data-canvu-hovered", "false");
6991
7072
  if (cached.lastTransform !== t) {
6992
7073
  cached.g.setAttribute("transform", t);
6993
7074
  cached.lastTransform = t;
@@ -7018,6 +7099,7 @@ var SvgVectorRenderer = class {
7018
7099
  let cached = this.itemNodeCache.get(item.id);
7019
7100
  if (!cached) {
7020
7101
  const g2 = document.createElementNS("http://www.w3.org/2000/svg", "g");
7102
+ g2.setAttribute("data-canvu-item", "true");
7021
7103
  g2.setAttribute("data-item-id", item.id);
7022
7104
  cached = {
7023
7105
  g: g2,
@@ -7027,6 +7109,11 @@ var SvgVectorRenderer = class {
7027
7109
  this.itemNodeCache.set(item.id, cached);
7028
7110
  }
7029
7111
  const { g } = cached;
7112
+ g.setAttribute("class", itemClassName(item));
7113
+ g.setAttribute("data-canvu-item", "true");
7114
+ g.setAttribute("data-item-id", item.id);
7115
+ g.setAttribute("data-tool-kind", item.toolKind ?? "");
7116
+ this.applyInteractionAttributes(g, item.id);
7030
7117
  const t = formatItemPlacementTransform(item);
7031
7118
  if (cached.lastTransform !== t) {
7032
7119
  g.setAttribute("transform", t);
@@ -7043,6 +7130,16 @@ var SvgVectorRenderer = class {
7043
7130
  previousNode = g;
7044
7131
  }
7045
7132
  }
7133
+ applyInteractionAttributes(g, itemId) {
7134
+ g.setAttribute(
7135
+ "data-canvu-selected",
7136
+ this.selectedIds.has(itemId) ? "true" : "false"
7137
+ );
7138
+ g.setAttribute(
7139
+ "data-canvu-hovered",
7140
+ this.hoveredItemId === itemId ? "true" : "false"
7141
+ );
7142
+ }
7046
7143
  destroy() {
7047
7144
  this.resizeObserver.disconnect();
7048
7145
  this.itemNodeCache.clear();
@@ -7150,10 +7247,7 @@ function smoothFreehandPointsToPathD(points) {
7150
7247
  }
7151
7248
 
7152
7249
  // src/react/InteractionOverlay.tsx
7153
- init_link_item();
7154
7250
  init_shape_builders();
7155
- var HANDLE_ORDER = ["nw", "n", "ne", "e", "se", "s", "sw", "w"];
7156
- var LINK_HANDLE_ORDER = ["nw", "ne", "se", "sw"];
7157
7251
  var ERASER_TINT = "#cbd5e1";
7158
7252
  var ERASER_TINT_OPACITY = 0.95;
7159
7253
  var ERASER_PREVIEW_OPACITY = 0.3;
@@ -7206,7 +7300,7 @@ function InteractionOverlay({
7206
7300
  ) }, it.id);
7207
7301
  }),
7208
7302
  showResizeHandles && bSingle && single && rotHandlePos && /* @__PURE__ */ jsxs(Fragment, { children: [
7209
- (getLinkData(single) ? LINK_HANDLE_ORDER : HANDLE_ORDER).map((hid) => {
7303
+ resolveResizeHandlesForItem(single).map((hid) => {
7210
7304
  const p = getHandleWorldPositionRotated(bSingle, hid, rotSingle);
7211
7305
  return /* @__PURE__ */ jsx(
7212
7306
  "circle",
@@ -8020,7 +8114,6 @@ function defaultPlacementWorld(tool, center) {
8020
8114
  lineWorld: [a, b]
8021
8115
  };
8022
8116
  }
8023
- var LINK_CORNER_HANDLES2 = /* @__PURE__ */ new Set(["nw", "ne", "se", "sw"]);
8024
8117
  function pointInSelectedItemBounds(item, worldX, worldY) {
8025
8118
  const bounds = normalizeRect(item.bounds);
8026
8119
  const local = worldToItemLocal(
@@ -8114,6 +8207,16 @@ function reorderItemsByIds(items, ids, direction) {
8114
8207
  function isDefaultMarkerToolStyle(style) {
8115
8208
  return style.stroke === MARKER_TOOL_STYLE.stroke && style.strokeWidth === MARKER_TOOL_STYLE.strokeWidth && style.strokeOpacity === MARKER_TOOL_STYLE.strokeOpacity;
8116
8209
  }
8210
+ function tagCustomPlacementItem(item, toolId) {
8211
+ return item.customToolId === toolId ? item : { ...item, customToolId: toolId };
8212
+ }
8213
+ function findSelectModeItemClickPlacement(item, placements) {
8214
+ const toolId = item.customToolId;
8215
+ if (!toolId) return null;
8216
+ return [...placements].reverse().find(
8217
+ (placement) => placement.toolId === toolId && placement.onSelectModeItemClick
8218
+ ) ?? null;
8219
+ }
8117
8220
  function mergeToolListById(baseTools, pluginTools) {
8118
8221
  const next = [...baseTools];
8119
8222
  for (const tool of pluginTools) {
@@ -8278,6 +8381,7 @@ var VectorViewport = forwardRef(
8278
8381
  const [cameraForOverlay, setCameraForOverlay] = useState(null);
8279
8382
  const sceneRef = useRef(null);
8280
8383
  const rendererRef = useRef(null);
8384
+ const hoveredItemIdRef = useRef(null);
8281
8385
  const pluginViewportRef = useRef(null);
8282
8386
  const [pluginContributions, setPluginContributions] = useState({});
8283
8387
  const registerContribution = useCallback(
@@ -8432,6 +8536,8 @@ var VectorViewport = forwardRef(
8432
8536
  assetStoreRef.current = assetStore;
8433
8537
  const customPlacementRef = useRef(customPlacement);
8434
8538
  customPlacementRef.current = customPlacement;
8539
+ const allCustomPlacementsRef = useRef(allCustomPlacements);
8540
+ allCustomPlacementsRef.current = allCustomPlacements;
8435
8541
  const dragStateRef = useRef({ kind: "idle" });
8436
8542
  const clipboardRef = useRef(null);
8437
8543
  const undoStackRef = useRef([]);
@@ -8483,6 +8589,12 @@ var VectorViewport = forwardRef(
8483
8589
  }, [isSelectionControlled, controlledSelectedKey, uncontrolledSel]);
8484
8590
  const effectiveSelectedIdsRef = useRef([]);
8485
8591
  effectiveSelectedIdsRef.current = effectiveSelectedIds;
8592
+ const syncRendererInteractionState = useCallback(() => {
8593
+ rendererRef.current?.setInteractionState({
8594
+ selectedIds: effectiveSelectedIdsRef.current,
8595
+ hoveredItemId: hoveredItemIdRef.current
8596
+ });
8597
+ }, []);
8486
8598
  const setEffectiveSelectedIds = useCallback(
8487
8599
  (ids) => {
8488
8600
  const next = [...ids];
@@ -8925,6 +9037,10 @@ var VectorViewport = forwardRef(
8925
9037
  pointerEventsNone: interactiveRef.current
8926
9038
  });
8927
9039
  rendererRef.current = renderer;
9040
+ renderer.setInteractionState({
9041
+ selectedIds: effectiveSelectedIdsRef.current,
9042
+ hoveredItemId: hoveredItemIdRef.current
9043
+ });
8928
9044
  renderer.render();
8929
9045
  if (!reducedMotionRef.current) {
8930
9046
  setZoomPercent(Math.round(camera.zoom * 100));
@@ -8962,11 +9078,53 @@ var VectorViewport = forwardRef(
8962
9078
  setCameraForOverlay(null);
8963
9079
  };
8964
9080
  }, [applePencilNav, renderFrame]);
9081
+ useEffect(() => {
9082
+ rendererRef.current?.setInteractionState({
9083
+ selectedIds: effectiveSelectedIds,
9084
+ hoveredItemId: hoveredItemIdRef.current
9085
+ });
9086
+ }, [effectiveSelectedIds]);
8965
9087
  useEffect(() => {
8966
9088
  const r = rendererRef.current;
8967
9089
  if (!r) return;
8968
9090
  r.setPointerEventsNone(interactive);
8969
9091
  }, [interactive]);
9092
+ const clearHoveredItem = useCallback(() => {
9093
+ if (hoveredItemIdRef.current === null) return;
9094
+ hoveredItemIdRef.current = null;
9095
+ syncRendererInteractionState();
9096
+ }, [syncRendererInteractionState]);
9097
+ const updateHoveredItem = useCallback(
9098
+ (clientX, clientY) => {
9099
+ const cam = cameraRef.current;
9100
+ const rect = sceneContainerRef.current?.getBoundingClientRect();
9101
+ if (!cam || !rect) return;
9102
+ const { worldX, worldY } = cam.screenToWorld(
9103
+ clientX - rect.left,
9104
+ clientY - rect.top
9105
+ );
9106
+ const hit = hitTestWorldPoint(resolvedItemsRef.current, worldX, worldY, {
9107
+ lineHitWorld: 10 / cam.zoom,
9108
+ ignoreLocked: true
9109
+ });
9110
+ const next = hit?.id ?? null;
9111
+ if (hoveredItemIdRef.current === next) return;
9112
+ hoveredItemIdRef.current = next;
9113
+ syncRendererInteractionState();
9114
+ },
9115
+ [syncRendererInteractionState]
9116
+ );
9117
+ useEffect(() => {
9118
+ const root = wrapperRef.current;
9119
+ if (!root) return;
9120
+ const move = (e) => updateHoveredItem(e.clientX, e.clientY);
9121
+ root.addEventListener("pointermove", move, { passive: true });
9122
+ root.addEventListener("pointerleave", clearHoveredItem);
9123
+ return () => {
9124
+ root.removeEventListener("pointermove", move);
9125
+ root.removeEventListener("pointerleave", clearHoveredItem);
9126
+ };
9127
+ }, [clearHoveredItem, updateHoveredItem]);
8970
9128
  useEffect(() => {
8971
9129
  if (!eraserActive && laserTrail.length === 0) return;
8972
9130
  const timer = window.setInterval(() => {
@@ -9945,10 +10103,10 @@ var VectorViewport = forwardRef(
9945
10103
  worldX,
9946
10104
  worldY,
9947
10105
  handleRadiusWorld,
9948
- rot
10106
+ rot,
10107
+ resolveResizeHandlesForItem(selected)
9949
10108
  );
9950
- const isLinkResizeHandle = hb && getLinkData(selected) ? LINK_CORNER_HANDLES2.has(hb) : Boolean(hb);
9951
- if (hb && isLinkResizeHandle) {
10109
+ if (hb) {
9952
10110
  const snapRs = bakedSnapshot(selected.id);
9953
10111
  if (!snapRs) return;
9954
10112
  dragStateRef.current = {
@@ -9972,6 +10130,31 @@ var VectorViewport = forwardRef(
9972
10130
  ignoreLocked: true
9973
10131
  });
9974
10132
  if (hit) {
10133
+ const selectModeClickPlacement = !e.shiftKey ? findSelectModeItemClickPlacement(hit, allCustomPlacementsRef.current) : null;
10134
+ if (selectModeClickPlacement) {
10135
+ const isAlreadySelected = cur.includes(hit.id);
10136
+ const moveIds = isAlreadySelected ? [...cur] : [hit.id];
10137
+ const moveSnapshots = {};
10138
+ for (const id of moveIds) {
10139
+ const snap = bakedSnapshot(id);
10140
+ if (snap) {
10141
+ moveSnapshots[id] = snap;
10142
+ }
10143
+ }
10144
+ dragStateRef.current = {
10145
+ kind: "select-mode-item-click",
10146
+ id: hit.id,
10147
+ startWorld: { x: worldX, y: worldY },
10148
+ startScreen: { x: e.clientX, y: e.clientY },
10149
+ moveIds,
10150
+ moveSnapshots,
10151
+ ...isAlreadySelected ? {} : { selectIdsOnDrag: [hit.id] }
10152
+ };
10153
+ captureInteractionPointer(e.currentTarget, e.pointerId);
10154
+ e.preventDefault();
10155
+ e.stopPropagation();
10156
+ return;
10157
+ }
9975
10158
  if (e.shiftKey) {
9976
10159
  const next = cur.includes(hit.id) ? cur.filter((id) => id !== hit.id) : [...cur, hit.id];
9977
10160
  setEffectiveSelectedIdsRef.current(next);
@@ -10539,6 +10722,21 @@ var VectorViewport = forwardRef(
10539
10722
  const change = onItemsChangeRef.current;
10540
10723
  if (!change) return;
10541
10724
  const { worldX, worldY } = screenToWorld(ev.clientX, ev.clientY);
10725
+ if (st.kind === "select-mode-item-click") {
10726
+ const screenDx = ev.clientX - st.startScreen.x;
10727
+ const screenDy = ev.clientY - st.startScreen.y;
10728
+ if (Math.hypot(screenDx, screenDy) <= TAP_PX) return;
10729
+ if (st.selectIdsOnDrag) {
10730
+ setEffectiveSelectedIdsRef.current(st.selectIdsOnDrag);
10731
+ }
10732
+ dragStateRef.current = {
10733
+ kind: "move",
10734
+ ids: st.moveIds,
10735
+ snapshots: st.moveSnapshots,
10736
+ startWorld: st.startWorld
10737
+ };
10738
+ return;
10739
+ }
10542
10740
  if (st.kind === "move") {
10543
10741
  const dx = worldX - st.startWorld.x;
10544
10742
  const dy = worldY - st.startWorld.y;
@@ -10657,6 +10855,43 @@ var VectorViewport = forwardRef(
10657
10855
  releaseInteractionPointer();
10658
10856
  return;
10659
10857
  }
10858
+ if (st.kind === "select-mode-item-click") {
10859
+ dragStateRef.current = { kind: "idle" };
10860
+ releaseInteractionPointer();
10861
+ if (ev.type === "pointercancel") return;
10862
+ const dx = ev.clientX - st.startScreen.x;
10863
+ const dy = ev.clientY - st.startScreen.y;
10864
+ if (Math.hypot(dx, dy) > TAP_PX) return;
10865
+ const item = itemsRef.current.find((candidate) => candidate.id === st.id) ?? resolvedItemsRef.current.find((candidate) => candidate.id === st.id);
10866
+ if (!item) return;
10867
+ const placement = findSelectModeItemClickPlacement(
10868
+ item,
10869
+ allCustomPlacementsRef.current
10870
+ );
10871
+ const onSelectModeItemClick = placement?.onSelectModeItemClick;
10872
+ if (!onSelectModeItemClick) return;
10873
+ const { worldX, worldY } = screenToWorld(ev.clientX, ev.clientY);
10874
+ onSelectModeItemClick({
10875
+ item,
10876
+ worldX,
10877
+ worldY,
10878
+ clientX: ev.clientX,
10879
+ clientY: ev.clientY,
10880
+ pointerType: ev.pointerType,
10881
+ shiftKey: ev.shiftKey,
10882
+ altKey: ev.altKey,
10883
+ metaKey: ev.metaKey,
10884
+ ctrlKey: ev.ctrlKey,
10885
+ items: itemsRef.current,
10886
+ updateItem: (next) => {
10887
+ onItemsChangeRef.current?.(
10888
+ replaceItem(itemsRef.current, item.id, next)
10889
+ );
10890
+ },
10891
+ setSelectedIds: (ids) => setEffectiveSelectedIdsRef.current(ids)
10892
+ });
10893
+ return;
10894
+ }
10660
10895
  if (st.kind === "marquee") {
10661
10896
  dragStateRef.current = { kind: "idle" };
10662
10897
  releaseInteractionPointer();
@@ -10852,8 +11087,14 @@ var VectorViewport = forwardRef(
10852
11087
  const id = createShapeId();
10853
11088
  const pen = strokeStyleRef.current;
10854
11089
  if (cpUp && st.tool === cpUp.toolId) {
10855
- change(itemsRef.current.concat(cpUp.createItem({ id, bounds: br })));
10856
- setEffectiveSelectedIdsRef.current([id]);
11090
+ const item = tagCustomPlacementItem(
11091
+ cpUp.createItem({ id, bounds: br }),
11092
+ cpUp.toolId
11093
+ );
11094
+ change(itemsRef.current.concat(item));
11095
+ if (cpUp.selectAfterCreate !== false) {
11096
+ setEffectiveSelectedIdsRef.current([id]);
11097
+ }
10857
11098
  return;
10858
11099
  }
10859
11100
  if (st.tool === "rect") {