canvu-react 0.4.47 → 0.4.48
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/{asset-hydration-Dc7fsnTG.d.ts → asset-hydration-BSjiek7Q.d.ts} +2 -2
- package/dist/{asset-hydration-Cy_2FyV5.d.cts → asset-hydration-F6aM5C7x.d.cts} +2 -2
- package/dist/{asset-store-TzOPvlgn.d.cts → asset-store-35ysK28r.d.cts} +1 -1
- package/dist/{asset-store-DQPRZEcy.d.ts → asset-store-D_FjW_CN.d.ts} +1 -1
- package/dist/chatbot.d.cts +6 -6
- package/dist/chatbot.d.ts +6 -6
- package/dist/index.cjs +49 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +53 -9
- package/dist/index.d.ts +53 -9
- package/dist/index.js +49 -1
- package/dist/index.js.map +1 -1
- package/dist/{link-item-DwzXOwU5.d.cts → link-item-BMV3VUCr.d.cts} +1 -1
- package/dist/{link-item-IW4GTnxl.d.ts → link-item-COoNNvCu.d.ts} +1 -1
- package/dist/native.cjs +47 -7
- package/dist/native.cjs.map +1 -1
- package/dist/native.d.cts +6 -6
- package/dist/native.d.ts +6 -6
- package/dist/native.js +47 -7
- package/dist/native.js.map +1 -1
- package/dist/react.cjs +259 -18
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +29 -13
- package/dist/react.d.ts +29 -13
- package/dist/react.js +259 -18
- package/dist/react.js.map +1 -1
- package/dist/realtime.cjs +3 -1
- package/dist/realtime.cjs.map +1 -1
- package/dist/realtime.d.cts +8 -8
- package/dist/realtime.d.ts +8 -8
- package/dist/realtime.js +3 -1
- package/dist/realtime.js.map +1 -1
- package/dist/realtimeNative.d.cts +4 -4
- package/dist/realtimeNative.d.ts +4 -4
- package/dist/{shape-builders-Cyh8zvDG.d.ts → shape-builders-BCOAG0pS.d.ts} +1 -1
- package/dist/{shape-builders-CKEMjivV.d.cts → shape-builders-BmLS8CNh.d.cts} +1 -1
- package/dist/tldraw.cjs +3 -1
- package/dist/tldraw.cjs.map +1 -1
- package/dist/tldraw.d.cts +1 -1
- package/dist/tldraw.d.ts +1 -1
- package/dist/tldraw.js +3 -1
- package/dist/tldraw.js.map +1 -1
- package/dist/{types-BUPc2Zgw.d.cts → types-6HszqSa5.d.cts} +1 -1
- package/dist/{types-B7xZAKVJ.d.ts → types-BAEHaIYO.d.ts} +43 -6
- package/dist/{types-B82WiQQh.d.ts → types-BMMPUak7.d.ts} +1 -1
- package/dist/{types-BQUbxMgz.d.cts → types-BOQLWyCw.d.cts} +1 -1
- package/dist/{types-CYtq9Pr9.d.ts → types-BtWbGOqh.d.ts} +1 -1
- package/dist/{types-BCCvY6ie.d.cts → types-fJNwEnHf.d.cts} +35 -1
- package/dist/{types-BCCvY6ie.d.ts → types-fJNwEnHf.d.ts} +35 -1
- package/dist/{types-C4wI3Jyc.d.cts → types-uzeExFkd.d.cts} +43 -6
- package/package.json +1 -1
package/dist/react.d.cts
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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-
|
|
12
|
-
import { V as VectorCanvasPersistenceAdapter, a as VectorCanvasRemoteAdapter } from './types-
|
|
13
|
-
export { b as VectorCanvasSnapshot } from './types-
|
|
14
|
-
import './link-item-
|
|
15
|
-
import './types-
|
|
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 {
|
|
2
|
-
export {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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-
|
|
12
|
-
import { V as VectorCanvasPersistenceAdapter, a as VectorCanvasRemoteAdapter } from './types-
|
|
13
|
-
export { b as VectorCanvasSnapshot } from './types-
|
|
14
|
-
import './link-item-
|
|
15
|
-
import './types-
|
|
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 {
|
|
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
|
-
|
|
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
|
|
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
|
-
(
|
|
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
|
-
|
|
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
|
-
|
|
10856
|
-
|
|
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") {
|