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.
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { C as CanvasPlugin } from './types-CW146bKP.cjs';
2
+ import { C as CanvasPlugin } from './types-BtLGGw0r.cjs';
3
3
  import 'react';
4
4
  import './types-CB0TZZuk.cjs';
5
5
  import './camera-BwQjm5oh.cjs';
package/dist/chatbot.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { C as CanvasPlugin } from './types-CpqlbbCP.js';
2
+ import { C as CanvasPlugin } from './types-ChnTSRSe.js';
3
3
  import 'react';
4
4
  import './types-CB0TZZuk.js';
5
5
  import './camera-KwCYYPhm.js';
package/dist/react.cjs CHANGED
@@ -4891,6 +4891,7 @@ function InteractionOverlay({
4891
4891
  eraserTrail = [],
4892
4892
  laserTrail = [],
4893
4893
  eraserPreviewItems = [],
4894
+ marqueeCandidateItems = [],
4894
4895
  previewStrokeStyle
4895
4896
  }) {
4896
4897
  const z = camera.zoom;
@@ -5139,6 +5140,33 @@ function InteractionOverlay({
5139
5140
  );
5140
5141
  }) });
5141
5142
  }
5143
+ let marqueeCandidates = null;
5144
+ if (marqueeCandidateItems.length > 0) {
5145
+ marqueeCandidates = /* @__PURE__ */ jsxRuntime.jsx("g", { children: marqueeCandidateItems.map((it) => {
5146
+ const b = normalizeRect(it.bounds);
5147
+ return /* @__PURE__ */ jsxRuntime.jsx(
5148
+ "g",
5149
+ {
5150
+ transform: formatItemPlacementTransform(it),
5151
+ children: /* @__PURE__ */ jsxRuntime.jsx(
5152
+ "rect",
5153
+ {
5154
+ x: 0,
5155
+ y: 0,
5156
+ width: b.width,
5157
+ height: b.height,
5158
+ fill: "rgba(59, 130, 246, 0.10)",
5159
+ stroke: "#3b82f6",
5160
+ strokeWidth: overlayStrokePx,
5161
+ strokeDasharray: dashPattern,
5162
+ vectorEffect: "non-scaling-stroke"
5163
+ }
5164
+ )
5165
+ },
5166
+ `marquee-cand-${it.id}`
5167
+ );
5168
+ }) });
5169
+ }
5142
5170
  let eraserTrailOverlay = null;
5143
5171
  if (eraserTrail.length >= 1) {
5144
5172
  const now = Date.now();
@@ -5239,6 +5267,7 @@ function InteractionOverlay({
5239
5267
  width: "100%",
5240
5268
  height: "100%",
5241
5269
  children: /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: rootTransform, children: [
5270
+ marqueeCandidates,
5242
5271
  preview,
5243
5272
  laserTrailOverlay,
5244
5273
  eraserTrailOverlay,
@@ -5282,7 +5311,7 @@ function PresenceRemoteLayer({
5282
5311
  const rootTransform = formatCameraTransform(camera);
5283
5312
  const overlayStrokePx = 1.25;
5284
5313
  const LUCIDE_POINTER_VIEWBOX = 24;
5285
- const remoteCursorScreenPx = 15;
5314
+ const remoteCursorScreenPx = 22;
5286
5315
  const iconWorldScale = remoteCursorScreenPx / (LUCIDE_POINTER_VIEWBOX * z);
5287
5316
  return /* @__PURE__ */ jsxRuntime.jsx(
5288
5317
  "svg",
@@ -5346,9 +5375,9 @@ function PresenceRemoteLayer({
5346
5375
  let cursorNode = null;
5347
5376
  if (cur) {
5348
5377
  const displayName = peer.displayName;
5349
- const labelOffsetX = 10 / z;
5350
- const labelOffsetY = 10 / z;
5351
- const labelFont = 10 / z;
5378
+ const labelOffsetX = 14 / z;
5379
+ const labelOffsetY = 14 / z;
5380
+ const labelFont = 12 / z;
5352
5381
  cursorNode = /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
5353
5382
  /* @__PURE__ */ jsxRuntime.jsx(
5354
5383
  "g",
@@ -5397,6 +5426,17 @@ function PresenceRemoteLayer({
5397
5426
  );
5398
5427
  }
5399
5428
 
5429
+ // src/react/stable-selection.ts
5430
+ function shallowEqualStringArray(a, b) {
5431
+ if (a === b) return true;
5432
+ if (!a || !b) return a === b;
5433
+ if (a.length !== b.length) return false;
5434
+ for (let i = 0; i < a.length; i++) {
5435
+ if (a[i] !== b[i]) return false;
5436
+ }
5437
+ return true;
5438
+ }
5439
+
5400
5440
  // src/react/TextEditOverlay.tsx
5401
5441
  init_rect();
5402
5442
  init_text_svg();
@@ -6120,6 +6160,9 @@ var VectorViewport = react.forwardRef(
6120
6160
  const [laserTrail, setLaserTrail] = react.useState([]);
6121
6161
  const [eraserPreviewIds, setEraserPreviewIds] = react.useState([]);
6122
6162
  const eraserPreviewIdsRef = react.useRef(/* @__PURE__ */ new Set());
6163
+ const [marqueeCandidateIds, setMarqueeCandidateIds] = react.useState([]);
6164
+ const marqueeCandidateIdsRef = react.useRef([]);
6165
+ marqueeCandidateIdsRef.current = marqueeCandidateIds;
6123
6166
  const resolvedSceneItems = react.useMemo(() => {
6124
6167
  if (eraserPreviewIds.length === 0) return resolvedItems;
6125
6168
  const hiddenIds = new Set(eraserPreviewIds);
@@ -7760,6 +7803,14 @@ var VectorViewport = react.forwardRef(
7760
7803
  const { worldX: worldX2, worldY: worldY2 } = screenToWorld(ev.clientX, ev.clientY);
7761
7804
  const raw = rectFromCorners(st.startWorld, { x: worldX2, y: worldY2 });
7762
7805
  setPlacementPreview({ kind: "marquee", rect: raw });
7806
+ const nextCand = collectItemIdsInRect(
7807
+ resolvedItemsRef.current,
7808
+ normalizeRect(raw)
7809
+ );
7810
+ if (!shallowEqualStringArray(nextCand, marqueeCandidateIdsRef.current)) {
7811
+ marqueeCandidateIdsRef.current = nextCand;
7812
+ setMarqueeCandidateIds(nextCand);
7813
+ }
7763
7814
  return;
7764
7815
  }
7765
7816
  if (st.kind === "stroke") {
@@ -7939,6 +7990,8 @@ var VectorViewport = react.forwardRef(
7939
7990
  dragStateRef.current = { kind: "idle" };
7940
7991
  releaseInteractionPointer();
7941
7992
  setPlacementPreview(null);
7993
+ marqueeCandidateIdsRef.current = [];
7994
+ setMarqueeCandidateIds([]);
7942
7995
  return;
7943
7996
  }
7944
7997
  if (st.kind === "move" || st.kind === "resize" || st.kind === "rotate") {
@@ -7950,6 +8003,8 @@ var VectorViewport = react.forwardRef(
7950
8003
  dragStateRef.current = { kind: "idle" };
7951
8004
  releaseInteractionPointer();
7952
8005
  setPlacementPreview(null);
8006
+ marqueeCandidateIdsRef.current = [];
8007
+ setMarqueeCandidateIds([]);
7953
8008
  const { worldX, worldY } = screenToWorld(ev.clientX, ev.clientY);
7954
8009
  const raw = rectFromCorners(st.startWorld, { x: worldX, y: worldY });
7955
8010
  const br = normalizeRect(raw);
@@ -8180,6 +8235,11 @@ var VectorViewport = react.forwardRef(
8180
8235
  const eraserPreviewItemsForOverlay = react.useMemo(() => {
8181
8236
  return eraserPreviewIds.map((id) => resolvedItems.find((i) => i.id === id)).filter((i) => i != null);
8182
8237
  }, [eraserPreviewIds, resolvedItems]);
8238
+ const marqueeCandidateItemsForOverlay = react.useMemo(() => {
8239
+ if (marqueeCandidateIds.length === 0) return [];
8240
+ const selected = new Set(effectiveSelectedIds);
8241
+ return marqueeCandidateIds.filter((id) => !selected.has(id)).map((id) => resolvedItems.find((i) => i.id === id)).filter((i) => i != null);
8242
+ }, [marqueeCandidateIds, effectiveSelectedIds, resolvedItems]);
8183
8243
  const presenceLayer = react.useMemo(() => {
8184
8244
  if (!cameraForOverlay) return null;
8185
8245
  if (presenceOverlay) {
@@ -8325,6 +8385,7 @@ var VectorViewport = react.forwardRef(
8325
8385
  eraserTrail,
8326
8386
  laserTrail,
8327
8387
  eraserPreviewItems: eraserPreviewItemsForOverlay,
8388
+ marqueeCandidateItems: marqueeCandidateItemsForOverlay,
8328
8389
  previewStrokeStyle: strokeStyleRef.current
8329
8390
  }
8330
8391
  ),