system-canvas-standalone 0.2.37 → 0.2.39

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.
@@ -22382,6 +22382,7 @@ var SystemCanvas = (() => {
22382
22382
  // ../react/dist/components/CollaboratorsOverlay.js
22383
22383
  var import_jsx_runtime32 = __toESM(require_jsx_runtime(), 1);
22384
22384
  var import_react31 = __toESM(require_react(), 1);
22385
+ var CLIP_GUARD_MARGIN = 100;
22385
22386
  var STYLE_ID = "system-canvas-collab-keyframes";
22386
22387
  function ensureKeyframes() {
22387
22388
  if (typeof document === "undefined")
@@ -22402,7 +22403,7 @@ var SystemCanvas = (() => {
22402
22403
  `;
22403
22404
  document.head.appendChild(style);
22404
22405
  }
22405
- function CollaboratorsOverlay({ collaborators, viewport, nodeMap, flashNodeIds }) {
22406
+ function CollaboratorsOverlay({ collaborators, viewport, nodeMap, flashNodeIds, containerWidth = Infinity, containerHeight = Infinity }) {
22406
22407
  const keyframesInjected = (0, import_react31.useRef)(false);
22407
22408
  if (!keyframesInjected.current) {
22408
22409
  ensureKeyframes();
@@ -22460,27 +22461,54 @@ var SystemCanvas = (() => {
22460
22461
  if (!collab.cursor)
22461
22462
  return null;
22462
22463
  const screen = canvasToScreen(collab.cursor.x, collab.cursor.y, viewport);
22464
+ if (screen.x < -CLIP_GUARD_MARGIN || screen.x > containerWidth + CLIP_GUARD_MARGIN || screen.y < -CLIP_GUARD_MARGIN || screen.y > containerHeight + CLIP_GUARD_MARGIN) {
22465
+ return null;
22466
+ }
22463
22467
  return (0, import_jsx_runtime32.jsxs)("div", { style: {
22464
22468
  position: "absolute",
22465
22469
  left: screen.x,
22466
22470
  top: screen.y,
22467
22471
  transform: "translate(0, 0)",
22468
22472
  userSelect: "none"
22469
- }, children: [(0, import_jsx_runtime32.jsx)("svg", { width: "16", height: "20", viewBox: "0 0 16 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: (0, import_jsx_runtime32.jsx)("path", { d: "M1 1L1 15L5 11L8 18L10 17L7 10L13 10L1 1Z", fill: collab.color, stroke: "#fff", strokeWidth: "1.5", strokeLinejoin: "round" }) }), (0, import_jsx_runtime32.jsx)("div", { style: {
22473
+ }, children: [(0, import_jsx_runtime32.jsx)("svg", { width: "16", height: "20", viewBox: "0 0 16 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: (0, import_jsx_runtime32.jsx)("path", { d: "M1 1L1 15L5 11L8 18L10 17L7 10L13 10L1 1Z", fill: collab.color, stroke: "#fff", strokeWidth: "1.5", strokeLinejoin: "round" }) }), (0, import_jsx_runtime32.jsxs)("div", { style: {
22470
22474
  position: "absolute",
22471
22475
  top: 18,
22472
22476
  left: 8,
22473
- fontSize: 11,
22474
- lineHeight: "16px",
22475
- padding: "1px 6px",
22477
+ display: "flex",
22478
+ alignItems: "center",
22479
+ gap: 4,
22480
+ background: collab.color,
22476
22481
  borderRadius: 8,
22482
+ padding: "1px 4px 1px 2px",
22483
+ boxShadow: "0 1px 3px rgba(0,0,0,0.3)",
22484
+ whiteSpace: "nowrap",
22485
+ fontFamily: "sans-serif"
22486
+ }, children: [(0, import_jsx_runtime32.jsx)("div", { style: {
22487
+ width: 16,
22488
+ height: 16,
22489
+ borderRadius: "50%",
22490
+ overflow: "hidden",
22491
+ flexShrink: 0,
22492
+ display: "flex",
22493
+ alignItems: "center",
22494
+ justifyContent: "center",
22495
+ background: collab.image ? "transparent" : collab.color
22496
+ }, children: collab.image ? (0, import_jsx_runtime32.jsx)("img", { src: collab.image, width: 16, height: 16, style: { objectFit: "cover", borderRadius: "50%" } }) : (0, import_jsx_runtime32.jsx)("div", { style: {
22497
+ width: 16,
22498
+ height: 16,
22499
+ display: "flex",
22500
+ alignItems: "center",
22501
+ justifyContent: "center",
22477
22502
  background: collab.color,
22478
22503
  color: "#fff",
22479
- whiteSpace: "nowrap",
22480
- fontFamily: "sans-serif",
22481
- fontWeight: 500,
22482
- boxShadow: "0 1px 3px rgba(0,0,0,0.3)"
22483
- }, children: collab.name })] }, `cursor-${collab.id}`);
22504
+ fontSize: 9,
22505
+ fontWeight: 700
22506
+ }, children: collab.name ? collab.name[0].toUpperCase() : "?" }) }), (0, import_jsx_runtime32.jsx)("span", { style: {
22507
+ fontSize: 11,
22508
+ lineHeight: "16px",
22509
+ color: "#fff",
22510
+ fontWeight: 500
22511
+ }, children: collab.name })] })] }, `cursor-${collab.id}`);
22484
22512
  }), Array.from(flashNodeIds.keys()).map((nodeId) => {
22485
22513
  const node = nodeMap.get(nodeId);
22486
22514
  if (!node)
@@ -22888,7 +22916,8 @@ var SystemCanvas = (() => {
22888
22916
  navigateToRoot: () => {
22889
22917
  navigateToBreadcrumbRef.current(0);
22890
22918
  },
22891
- getViewport: () => viewportStateRef.current ?? { x: 0, y: 0, zoom: 1 }
22919
+ getViewport: () => viewportStateRef.current ?? { x: 0, y: 0, zoom: 1 },
22920
+ getSvgElement: () => viewportHandleRef.current?.getSvgElement() ?? null
22892
22921
  }), [forwardedRef]);
22893
22922
  const [editingId, setEditingId] = (0, import_react33.useState)(null);
22894
22923
  const [selectedEdgeId, setSelectedEdgeId] = (0, import_react33.useState)(null);
@@ -23612,7 +23641,7 @@ var SystemCanvas = (() => {
23612
23641
  fontFamily: theme.node.fontFamily,
23613
23642
  fontSize: 12,
23614
23643
  backdropFilter: "blur(8px)"
23615
- }, children: "Loading..." }), (0, import_jsx_runtime34.jsx)(Viewport, { ref: viewportHandleRef, nodes, edges, nodeMap, theme, edgeStyle, columns: currentCanvas.columns, rows: currentCanvas.rows, canvases, minZoom: effectiveMinZoom, maxZoom: effectiveMaxZoom, defaultViewport, panMode, autoFit, canvasRef: currentCanvasRef, handoffTransform: pendingHandoff, onHandoffApplied: handleHandoffApplied, handoffFadeMs: zoomNavConfig.fadeDuration, onViewportChange: handleViewportChange, onNodeClick: handleNodeClick, onNodeDoubleClick: handleNodeDoubleClick, onNodeNavigate: handleNodeNavigate, onEdgeClick: handleEdgeClick, onEdgeDoubleClick: handleEdgeDoubleClick, onCanvasClick: editable ? handleCanvasClick : void 0, onCanvasContextMenu: handleCanvasContextMenu, onNodeContextMenu: handleNodeContextMenu, onEdgeContextMenu: handleEdgeContextMenu, onNodePointerDown: editable ? onNodePointerDown : void 0, selectedIds: editable ? selectedIds : void 0, marqueeRect: editable ? marqueeRect : null, marqueeActiveRef: editable ? marqueeActiveRef : void 0, editingId: editable ? editingId : null, selectedEdgeId: editable ? selectedEdgeId : null, editingEdgeId: editable ? editingEdgeId : null, dragOverrides, dropTargetId, resizeOverrides, onResizeHandlePointerDown: editable ? onResizeHandlePointerDown : void 0, onEditorCommit: handleEditorCommit, onEditorCancel: handleEditorCancel, onEdgeEditorCommit: handleEdgeEditorCommit, onEdgeEditorCancel: handleEdgeEditorCancel, onEdgeWaypointUpdate: editable ? handleEdgeWaypointUpdate : void 0, pendingEdge: editable ? pendingEdge : null, onConnectionHandlePointerDown: editable ? onConnectionHandlePointerDown : void 0, edgeCreateEnabled: editable, alignmentGuides: editable ? alignmentGuides : void 0, dimmedNodeIds: dimmedIds, highlightedNodeIds: matchingIds, activeMatchNodeId: activeMatchId, viewportState: collaboratorViewport }), collaborators.length > 0 || flashNodeIds.size > 0 ? (0, import_jsx_runtime34.jsx)(CollaboratorsOverlay, { collaborators, viewport: collaboratorViewport, nodeMap, flashNodeIds }) : null, showLaneHeaders && (0, import_jsx_runtime34.jsx)(LaneHeaders, { columns: currentCanvas.columns, rows: currentCanvas.rows, theme, getViewport: getViewportState, width: containerSize.width, height: containerSize.height, pinned: laneHeaders === "pinned" }), editable && showNodeToolbar && selectedIds.size === 1 && selectedResolvedNode && !editingId && (0, import_jsx_runtime34.jsx)(NodeToolbar, { node: selectedResolvedNode, theme, onPatch: (update) => {
23644
+ }, children: "Loading..." }), (0, import_jsx_runtime34.jsx)(Viewport, { ref: viewportHandleRef, nodes, edges, nodeMap, theme, edgeStyle, columns: currentCanvas.columns, rows: currentCanvas.rows, canvases, minZoom: effectiveMinZoom, maxZoom: effectiveMaxZoom, defaultViewport, panMode, autoFit, canvasRef: currentCanvasRef, handoffTransform: pendingHandoff, onHandoffApplied: handleHandoffApplied, handoffFadeMs: zoomNavConfig.fadeDuration, onViewportChange: handleViewportChange, onNodeClick: handleNodeClick, onNodeDoubleClick: handleNodeDoubleClick, onNodeNavigate: handleNodeNavigate, onEdgeClick: handleEdgeClick, onEdgeDoubleClick: handleEdgeDoubleClick, onCanvasClick: editable ? handleCanvasClick : void 0, onCanvasContextMenu: handleCanvasContextMenu, onNodeContextMenu: handleNodeContextMenu, onEdgeContextMenu: handleEdgeContextMenu, onNodePointerDown: editable ? onNodePointerDown : void 0, selectedIds: editable ? selectedIds : void 0, marqueeRect: editable ? marqueeRect : null, marqueeActiveRef: editable ? marqueeActiveRef : void 0, editingId: editable ? editingId : null, selectedEdgeId: editable ? selectedEdgeId : null, editingEdgeId: editable ? editingEdgeId : null, dragOverrides, dropTargetId, resizeOverrides, onResizeHandlePointerDown: editable ? onResizeHandlePointerDown : void 0, onEditorCommit: handleEditorCommit, onEditorCancel: handleEditorCancel, onEdgeEditorCommit: handleEdgeEditorCommit, onEdgeEditorCancel: handleEdgeEditorCancel, onEdgeWaypointUpdate: editable ? handleEdgeWaypointUpdate : void 0, pendingEdge: editable ? pendingEdge : null, onConnectionHandlePointerDown: editable ? onConnectionHandlePointerDown : void 0, edgeCreateEnabled: editable, alignmentGuides: editable ? alignmentGuides : void 0, dimmedNodeIds: dimmedIds, highlightedNodeIds: matchingIds, activeMatchNodeId: activeMatchId, viewportState: collaboratorViewport }), collaborators.length > 0 || flashNodeIds.size > 0 ? (0, import_jsx_runtime34.jsx)(CollaboratorsOverlay, { collaborators, viewport: collaboratorViewport, nodeMap, flashNodeIds, containerWidth: containerSize.width, containerHeight: containerSize.height }) : null, showLaneHeaders && (0, import_jsx_runtime34.jsx)(LaneHeaders, { columns: currentCanvas.columns, rows: currentCanvas.rows, theme, getViewport: getViewportState, width: containerSize.width, height: containerSize.height, pinned: laneHeaders === "pinned" }), editable && showNodeToolbar && selectedIds.size === 1 && selectedResolvedNode && !editingId && (0, import_jsx_runtime34.jsx)(NodeToolbar, { node: selectedResolvedNode, theme, onPatch: (update) => {
23616
23645
  wrappedOnNodeUpdate(selectedResolvedNode.id, update, currentCanvasRef);
23617
23646
  }, onDelete: () => {
23618
23647
  wrappedOnNodeDelete(selectedResolvedNode.id, currentCanvasRef);