canvu-react 0.3.8 → 0.3.10

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/react.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { V as VectorSceneItem } from './types-CB0TZZuk.cjs';
2
- import { V as VectorViewportAssetKind, a as VectorViewportAssetStore, b as VectorToolDefinition, C as CanvasPlugin, B as BoardComponentPosition } from './types-CW146bKP.cjs';
3
- 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, n as CustomShapePlacementOptions, N as NavMenu, o as NavMenuProps, P as PlacementPreview, p as VectorCanvas, q as VectorCanvasBody, r as VectorCanvasHeader, s as VectorCanvasMain, t as VectorCanvasRoot, u as VectorCanvasSlotProps, v as VectorCanvasSpacePosition, w as VectorCanvasSpaceProps, x as VectorCanvasToolbar, y as VectorCanvasToolbarProps, z as VectorCanvasViewportSurface, A as VectorSelectionInspector, D as VectorSelectionInspectorProps, E as VectorViewport, F as VectorViewportAssetResolveRequest, G as VectorViewportAssetResolveResult, H as VectorViewportAssetUploadRequest, I as VectorViewportAssetUploadResult, J as VectorViewportHandle, K as VectorViewportProps, W as WorldPointerDownDetail, L as createCanvuPlugin, M as getBoardPositionStyle, O as useCanvuChromeContext, Q as useCanvuDocumentContext, R as useCanvuPluginContext, S as useCanvuPluginContribution, T as useCanvuResolvedTools, U as useCanvuViewportContext } from './types-CW146bKP.cjs';
2
+ import { V as VectorViewportAssetKind, a as VectorViewportAssetStore, b as VectorToolDefinition, C as CanvasPlugin, B as BoardComponentPosition } from './types-BtLGGw0r.cjs';
3
+ 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, n as CustomShapePlacementOptions, N as NavMenu, o as NavMenuProps, P as PlacementPreview, p as VectorCanvas, q as VectorCanvasBody, r as VectorCanvasHeader, s as VectorCanvasMain, t as VectorCanvasRoot, u as VectorCanvasSlotProps, v as VectorCanvasSpacePosition, w as VectorCanvasSpaceProps, x as VectorCanvasToolbar, y as VectorCanvasToolbarProps, z as VectorCanvasViewportSurface, A as VectorSelectionInspector, D as VectorSelectionInspectorProps, E as VectorViewport, F as VectorViewportAssetResolveRequest, G as VectorViewportAssetResolveResult, H as VectorViewportAssetUploadRequest, I as VectorViewportAssetUploadResult, J as VectorViewportHandle, K as VectorViewportProps, W as WorldPointerDownDetail, L as createCanvuPlugin, M as getBoardPositionStyle, O as useCanvuChromeContext, Q as useCanvuDocumentContext, R as useCanvuPluginContext, S as useCanvuPluginContribution, T as useCanvuResolvedTools, U as useCanvuViewportContext } from './types-BtLGGw0r.cjs';
4
4
  import { V as VectorCanvasPersistenceAdapter, a as VectorCanvasRemoteAdapter } from './types-B58i5k-u.cjs';
5
5
  export { b as VectorCanvasSnapshot } from './types-B58i5k-u.cjs';
6
6
  import * as react from 'react';
package/dist/react.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { V as VectorSceneItem } from './types-CB0TZZuk.js';
2
- import { V as VectorViewportAssetKind, a as VectorViewportAssetStore, b as VectorToolDefinition, C as CanvasPlugin, B as BoardComponentPosition } from './types-CpqlbbCP.js';
3
- 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, n as CustomShapePlacementOptions, N as NavMenu, o as NavMenuProps, P as PlacementPreview, p as VectorCanvas, q as VectorCanvasBody, r as VectorCanvasHeader, s as VectorCanvasMain, t as VectorCanvasRoot, u as VectorCanvasSlotProps, v as VectorCanvasSpacePosition, w as VectorCanvasSpaceProps, x as VectorCanvasToolbar, y as VectorCanvasToolbarProps, z as VectorCanvasViewportSurface, A as VectorSelectionInspector, D as VectorSelectionInspectorProps, E as VectorViewport, F as VectorViewportAssetResolveRequest, G as VectorViewportAssetResolveResult, H as VectorViewportAssetUploadRequest, I as VectorViewportAssetUploadResult, J as VectorViewportHandle, K as VectorViewportProps, W as WorldPointerDownDetail, L as createCanvuPlugin, M as getBoardPositionStyle, O as useCanvuChromeContext, Q as useCanvuDocumentContext, R as useCanvuPluginContext, S as useCanvuPluginContribution, T as useCanvuResolvedTools, U as useCanvuViewportContext } from './types-CpqlbbCP.js';
2
+ import { V as VectorViewportAssetKind, a as VectorViewportAssetStore, b as VectorToolDefinition, C as CanvasPlugin, B as BoardComponentPosition } from './types-ChnTSRSe.js';
3
+ 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, n as CustomShapePlacementOptions, N as NavMenu, o as NavMenuProps, P as PlacementPreview, p as VectorCanvas, q as VectorCanvasBody, r as VectorCanvasHeader, s as VectorCanvasMain, t as VectorCanvasRoot, u as VectorCanvasSlotProps, v as VectorCanvasSpacePosition, w as VectorCanvasSpaceProps, x as VectorCanvasToolbar, y as VectorCanvasToolbarProps, z as VectorCanvasViewportSurface, A as VectorSelectionInspector, D as VectorSelectionInspectorProps, E as VectorViewport, F as VectorViewportAssetResolveRequest, G as VectorViewportAssetResolveResult, H as VectorViewportAssetUploadRequest, I as VectorViewportAssetUploadResult, J as VectorViewportHandle, K as VectorViewportProps, W as WorldPointerDownDetail, L as createCanvuPlugin, M as getBoardPositionStyle, O as useCanvuChromeContext, Q as useCanvuDocumentContext, R as useCanvuPluginContext, S as useCanvuPluginContribution, T as useCanvuResolvedTools, U as useCanvuViewportContext } from './types-ChnTSRSe.js';
4
4
  import { V as VectorCanvasPersistenceAdapter, a as VectorCanvasRemoteAdapter } from './types-DgEArHkA.js';
5
5
  export { b as VectorCanvasSnapshot } from './types-DgEArHkA.js';
6
6
  import * as react from 'react';
package/dist/react.js CHANGED
@@ -4884,6 +4884,7 @@ function InteractionOverlay({
4884
4884
  eraserTrail = [],
4885
4885
  laserTrail = [],
4886
4886
  eraserPreviewItems = [],
4887
+ marqueeCandidateItems = [],
4887
4888
  previewStrokeStyle
4888
4889
  }) {
4889
4890
  const z = camera.zoom;
@@ -5132,6 +5133,33 @@ function InteractionOverlay({
5132
5133
  );
5133
5134
  }) });
5134
5135
  }
5136
+ let marqueeCandidates = null;
5137
+ if (marqueeCandidateItems.length > 0) {
5138
+ marqueeCandidates = /* @__PURE__ */ jsx("g", { children: marqueeCandidateItems.map((it) => {
5139
+ const b = normalizeRect(it.bounds);
5140
+ return /* @__PURE__ */ jsx(
5141
+ "g",
5142
+ {
5143
+ transform: formatItemPlacementTransform(it),
5144
+ children: /* @__PURE__ */ jsx(
5145
+ "rect",
5146
+ {
5147
+ x: 0,
5148
+ y: 0,
5149
+ width: b.width,
5150
+ height: b.height,
5151
+ fill: "rgba(59, 130, 246, 0.10)",
5152
+ stroke: "#3b82f6",
5153
+ strokeWidth: overlayStrokePx,
5154
+ strokeDasharray: dashPattern,
5155
+ vectorEffect: "non-scaling-stroke"
5156
+ }
5157
+ )
5158
+ },
5159
+ `marquee-cand-${it.id}`
5160
+ );
5161
+ }) });
5162
+ }
5135
5163
  let eraserTrailOverlay = null;
5136
5164
  if (eraserTrail.length >= 1) {
5137
5165
  const now = Date.now();
@@ -5232,6 +5260,7 @@ function InteractionOverlay({
5232
5260
  width: "100%",
5233
5261
  height: "100%",
5234
5262
  children: /* @__PURE__ */ jsxs("g", { transform: rootTransform, children: [
5263
+ marqueeCandidates,
5235
5264
  preview,
5236
5265
  laserTrailOverlay,
5237
5266
  eraserTrailOverlay,
@@ -5275,7 +5304,7 @@ function PresenceRemoteLayer({
5275
5304
  const rootTransform = formatCameraTransform(camera);
5276
5305
  const overlayStrokePx = 1.25;
5277
5306
  const LUCIDE_POINTER_VIEWBOX = 24;
5278
- const remoteCursorScreenPx = 15;
5307
+ const remoteCursorScreenPx = 22;
5279
5308
  const iconWorldScale = remoteCursorScreenPx / (LUCIDE_POINTER_VIEWBOX * z);
5280
5309
  return /* @__PURE__ */ jsx(
5281
5310
  "svg",
@@ -5339,9 +5368,9 @@ function PresenceRemoteLayer({
5339
5368
  let cursorNode = null;
5340
5369
  if (cur) {
5341
5370
  const displayName = peer.displayName;
5342
- const labelOffsetX = 10 / z;
5343
- const labelOffsetY = 10 / z;
5344
- const labelFont = 10 / z;
5371
+ const labelOffsetX = 14 / z;
5372
+ const labelOffsetY = 14 / z;
5373
+ const labelFont = 12 / z;
5345
5374
  cursorNode = /* @__PURE__ */ jsxs("g", { children: [
5346
5375
  /* @__PURE__ */ jsx(
5347
5376
  "g",
@@ -5390,6 +5419,17 @@ function PresenceRemoteLayer({
5390
5419
  );
5391
5420
  }
5392
5421
 
5422
+ // src/react/stable-selection.ts
5423
+ function shallowEqualStringArray(a, b) {
5424
+ if (a === b) return true;
5425
+ if (!a || !b) return a === b;
5426
+ if (a.length !== b.length) return false;
5427
+ for (let i = 0; i < a.length; i++) {
5428
+ if (a[i] !== b[i]) return false;
5429
+ }
5430
+ return true;
5431
+ }
5432
+
5393
5433
  // src/react/TextEditOverlay.tsx
5394
5434
  init_rect();
5395
5435
  init_text_svg();
@@ -6113,6 +6153,9 @@ var VectorViewport = forwardRef(
6113
6153
  const [laserTrail, setLaserTrail] = useState([]);
6114
6154
  const [eraserPreviewIds, setEraserPreviewIds] = useState([]);
6115
6155
  const eraserPreviewIdsRef = useRef(/* @__PURE__ */ new Set());
6156
+ const [marqueeCandidateIds, setMarqueeCandidateIds] = useState([]);
6157
+ const marqueeCandidateIdsRef = useRef([]);
6158
+ marqueeCandidateIdsRef.current = marqueeCandidateIds;
6116
6159
  const resolvedSceneItems = useMemo(() => {
6117
6160
  if (eraserPreviewIds.length === 0) return resolvedItems;
6118
6161
  const hiddenIds = new Set(eraserPreviewIds);
@@ -7753,6 +7796,14 @@ var VectorViewport = forwardRef(
7753
7796
  const { worldX: worldX2, worldY: worldY2 } = screenToWorld(ev.clientX, ev.clientY);
7754
7797
  const raw = rectFromCorners(st.startWorld, { x: worldX2, y: worldY2 });
7755
7798
  setPlacementPreview({ kind: "marquee", rect: raw });
7799
+ const nextCand = collectItemIdsInRect(
7800
+ resolvedItemsRef.current,
7801
+ normalizeRect(raw)
7802
+ );
7803
+ if (!shallowEqualStringArray(nextCand, marqueeCandidateIdsRef.current)) {
7804
+ marqueeCandidateIdsRef.current = nextCand;
7805
+ setMarqueeCandidateIds(nextCand);
7806
+ }
7756
7807
  return;
7757
7808
  }
7758
7809
  if (st.kind === "stroke") {
@@ -7932,6 +7983,8 @@ var VectorViewport = forwardRef(
7932
7983
  dragStateRef.current = { kind: "idle" };
7933
7984
  releaseInteractionPointer();
7934
7985
  setPlacementPreview(null);
7986
+ marqueeCandidateIdsRef.current = [];
7987
+ setMarqueeCandidateIds([]);
7935
7988
  return;
7936
7989
  }
7937
7990
  if (st.kind === "move" || st.kind === "resize" || st.kind === "rotate") {
@@ -7943,6 +7996,8 @@ var VectorViewport = forwardRef(
7943
7996
  dragStateRef.current = { kind: "idle" };
7944
7997
  releaseInteractionPointer();
7945
7998
  setPlacementPreview(null);
7999
+ marqueeCandidateIdsRef.current = [];
8000
+ setMarqueeCandidateIds([]);
7946
8001
  const { worldX, worldY } = screenToWorld(ev.clientX, ev.clientY);
7947
8002
  const raw = rectFromCorners(st.startWorld, { x: worldX, y: worldY });
7948
8003
  const br = normalizeRect(raw);
@@ -8173,6 +8228,11 @@ var VectorViewport = forwardRef(
8173
8228
  const eraserPreviewItemsForOverlay = useMemo(() => {
8174
8229
  return eraserPreviewIds.map((id) => resolvedItems.find((i) => i.id === id)).filter((i) => i != null);
8175
8230
  }, [eraserPreviewIds, resolvedItems]);
8231
+ const marqueeCandidateItemsForOverlay = useMemo(() => {
8232
+ if (marqueeCandidateIds.length === 0) return [];
8233
+ const selected = new Set(effectiveSelectedIds);
8234
+ return marqueeCandidateIds.filter((id) => !selected.has(id)).map((id) => resolvedItems.find((i) => i.id === id)).filter((i) => i != null);
8235
+ }, [marqueeCandidateIds, effectiveSelectedIds, resolvedItems]);
8176
8236
  const presenceLayer = useMemo(() => {
8177
8237
  if (!cameraForOverlay) return null;
8178
8238
  if (presenceOverlay) {
@@ -8318,6 +8378,7 @@ var VectorViewport = forwardRef(
8318
8378
  eraserTrail,
8319
8379
  laserTrail,
8320
8380
  eraserPreviewItems: eraserPreviewItemsForOverlay,
8381
+ marqueeCandidateItems: marqueeCandidateItemsForOverlay,
8321
8382
  previewStrokeStyle: strokeStyleRef.current
8322
8383
  }
8323
8384
  ),