orcasvn-react-diagrams 0.1.51 → 0.1.52

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/cjs/index.js CHANGED
@@ -484,7 +484,7 @@ function generateUniqueId() {
484
484
  }
485
485
 
486
486
  var Element$2 = /** @class */ (function () {
487
- function Element(x, y, width, height, cssClass, renderShape, texts, ports, portMovealeAreas, portSlideRailSVGClassName, portDirection, parentElement, textsPlaceHolderClassName, textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition) {
487
+ function Element(id, x, y, width, height, cssClass, renderShape, texts, ports, portMovealeAreas, portSlideRailSVGClassName, portDirection, parentElement, textsPlaceHolderClassName, textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition) {
488
488
  if (portMovealeAreas === void 0) { portMovealeAreas = []; }
489
489
  this.positionAnchor = exports.PositioningAnchor.TopLeft;
490
490
  this._childrenElements = [];
@@ -494,7 +494,7 @@ var Element$2 = /** @class */ (function () {
494
494
  };
495
495
  //internal properties
496
496
  this._eventEmitter = new EventEmitter();
497
- this._id = generateUniqueId();
497
+ this._id = id || generateUniqueId();
498
498
  this._position = { x: x, y: y };
499
499
  this._size = { width: width, height: height };
500
500
  this.cssClass = cssClass;
@@ -696,11 +696,11 @@ var CustomShape = React.forwardRef(function (props, ref) {
696
696
  });
697
697
 
698
698
  var Port$1 = /** @class */ (function () {
699
- function Port(x, y, label, shapeRenderer, width, height) {
699
+ function Port(id, x, y, label, shapeRenderer, width, height) {
700
700
  var _this = this;
701
701
  //internal properties
702
702
  this._eventEmitter = new EventEmitter();
703
- this._id = generateUniqueId();
703
+ this._id = id || generateUniqueId();
704
704
  this.position = { x: x, y: y };
705
705
  if (!height) {
706
706
  height = width;
@@ -731,8 +731,8 @@ var Port$1 = /** @class */ (function () {
731
731
  }());
732
732
 
733
733
  var ElementLink$1 = /** @class */ (function () {
734
- function ElementLink(sourceElement, sourcePort, targetElement, targetPort, tempTargetPosition, points, path, markerStart, markerEnd, markerDistanceFromPort, markerSize, label, sourceLabel, targetLabel) {
735
- this.id = generateUniqueId();
734
+ function ElementLink(id, sourceElement, sourcePort, targetElement, targetPort, tempTargetPosition, points, path, markerStart, markerEnd, markerDistanceFromPort, markerSize, label, sourceLabel, targetLabel) {
735
+ this.id = id || generateUniqueId();
736
736
  this.sourceElement = sourceElement;
737
737
  this.sourcePort = sourcePort;
738
738
  if (tempTargetPosition) {
@@ -769,8 +769,8 @@ var ElementLink$1 = /** @class */ (function () {
769
769
  }());
770
770
 
771
771
  var Text$2 = /** @class */ (function () {
772
- function Text(content, width, height, editable, x, y, align, fontSize, border, style) {
773
- this._id = generateUniqueId();
772
+ function Text(id, content, width, height, editable, x, y, align, fontSize, border, style) {
773
+ this._id = id || generateUniqueId();
774
774
  this.content = content;
775
775
  this.align = align;
776
776
  this.fontSize = fontSize;
@@ -8070,20 +8070,20 @@ function CloseIcon(_a) {
8070
8070
  React.createElement("path", { d: "M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-11.414L9.172 7.757 7.757 9.172 10.586 12l-2.829 2.828 1.415 1.415L12 13.414l2.828 2.829 1.415-1.415L13.414 12l2.829-2.828-1.415-1.415L12 10.586z" })))));
8071
8071
  }
8072
8072
 
8073
- var makerStart = React.createElement("circle", { cx: 10, cy: 10, r: 10, fill: "blue" });
8074
- var makerEnd = React.createElement("path", { d: "M0 0 L 20 10 L0 20 Z", fill: "blue" }); //<path d="M0 0 L 10 5 L0 10 Z"></path>
8073
+ // const makerStart = <circle cx={10} cy={10} r={10} fill="blue"></circle>
8074
+ // const makerEnd = <path d="M0 0 L 20 10 L0 20 Z" fill="blue"></path>//<path d="M0 0 L 10 5 L0 10 Z"></path>
8075
8075
  var IElementLink = function (_a) {
8076
8076
  var _b, _c;
8077
- var id = _a.id, path = _a.path, stroke = _a.stroke, _d = _a.strokeWidth, strokeWidth = _d === void 0 ? 4 : _d, pointsProp = _a.points, sourcePosition = _a.sourcePosition, targetPosition = _a.targetPosition, onPathChanged = _a.onPathChanged, onClickDelete = _a.onClickDelete, onSelected = _a.onSelected, onDeselected = _a.onDeselected, container = _a.container, _e = _a.markerStart, markerStart = _e === void 0 ? makerStart : _e, _f = _a.markerEnd, markerEnd = _f === void 0 ? makerEnd : _f, _g = _a.markerDistanceFromPort, markerDistanceFromPort = _g === void 0 ? LINK_MARKER_DISTANCE_FROM_PORT : _g, _h = _a.markerSize, markerSize = _h === void 0 ? LINK_MARKER_SIZE : _h, label = _a.label, sourceLabel = _a.sourceLabel, targetLabel = _a.targetLabel, onLabelMoved = _a.onLabelMoved, onLabelResized = _a.onLabelResized, onLabelContentChanged = _a.onLabelContentChanged;
8078
- var _j = React.useState(path), pathStr = _j[0], setPathStr = _j[1];
8079
- var _k = React.useState(pointsProp !== null && pointsProp !== void 0 ? pointsProp : []), points = _k[0], setPoints = _k[1];
8080
- var _l = React.useState(false), isDragging = _l[0], setIsDragging = _l[1];
8081
- var _m = React.useState(), draggingPointIndex = _m[0], setDraggingPointIndex = _m[1];
8082
- var _o = React.useState({
8077
+ var id = _a.id, path = _a.path, stroke = _a.stroke, _d = _a.strokeWidth, strokeWidth = _d === void 0 ? 4 : _d, pointsProp = _a.points, sourcePosition = _a.sourcePosition, targetPosition = _a.targetPosition, onPathChanged = _a.onPathChanged, onClickDelete = _a.onClickDelete, onSelected = _a.onSelected, onDeselected = _a.onDeselected, container = _a.container, markerStart = _a.markerStart, markerEnd = _a.markerEnd, _e = _a.markerDistanceFromPort, markerDistanceFromPort = _e === void 0 ? LINK_MARKER_DISTANCE_FROM_PORT : _e, _f = _a.markerSize, markerSize = _f === void 0 ? LINK_MARKER_SIZE : _f, label = _a.label, sourceLabel = _a.sourceLabel, targetLabel = _a.targetLabel, onLabelMoved = _a.onLabelMoved, onLabelResized = _a.onLabelResized, onLabelContentChanged = _a.onLabelContentChanged;
8078
+ var _g = React.useState(path), pathStr = _g[0], setPathStr = _g[1];
8079
+ var _h = React.useState(pointsProp !== null && pointsProp !== void 0 ? pointsProp : []), points = _h[0], setPoints = _h[1];
8080
+ var _j = React.useState(false), isDragging = _j[0], setIsDragging = _j[1];
8081
+ var _k = React.useState(), draggingPointIndex = _k[0], setDraggingPointIndex = _k[1];
8082
+ var _l = React.useState({
8083
8083
  current: null,
8084
- }), selectedLabelRef = _o[0], setSelectedLabelRef = _o[1];
8085
- var _p = React.useState(false), isSelectedLink = _p[0], setIsSelectedLink = _p[1];
8086
- var _q = React.useContext(paperEventEmitterContext), onPaperClicked = _q.onPaperClicked, onElementSelected = _q.onElementSelected;
8084
+ }), selectedLabelRef = _l[0], setSelectedLabelRef = _l[1];
8085
+ var _m = React.useState(false), isSelectedLink = _m[0], setIsSelectedLink = _m[1];
8086
+ var _o = React.useContext(paperEventEmitterContext), onPaperClicked = _o.onPaperClicked, onElementSelected = _o.onElementSelected;
8087
8087
  var pathRef = React.useRef(null);
8088
8088
  var labelRef = React.useRef(null);
8089
8089
  var sourceLabelRef = React.useRef(null);
@@ -9896,6 +9896,83 @@ var Paper = function (props) {
9896
9896
  };
9897
9897
  var Paper$1 = React.memo(Paper);
9898
9898
 
9899
+ /**
9900
+ * Zoom context to manage zoom level and related state.
9901
+ * This context can be used to provide zoom functionality across the application.
9902
+ */
9903
+ var zoomContext = React.createContext(null);
9904
+ var ZoomContextProvider = function (_a) {
9905
+ var children = _a.children;
9906
+ var _b = React.useState(1), zoom = _b[0], setZoom = _b[1];
9907
+ var _c = React.useState(0), scrollLeft = _c[0], setScrollLeft = _c[1];
9908
+ var _d = React.useState(0), scrollTop = _d[0], setScrollTop = _d[1];
9909
+ var wrapperRef = React.useRef(null);
9910
+ var contentRef = React.useRef(null);
9911
+ var handleWheel = function (e) {
9912
+ // Chỉ zoom khi giữ Ctrl
9913
+ if (!e.ctrlKey)
9914
+ return;
9915
+ e.preventDefault();
9916
+ var delta = -e.deltaY;
9917
+ var zoomFactor = 0.05;
9918
+ var newZoom = zoom + (delta > 0 ? zoomFactor : -zoomFactor);
9919
+ newZoom = Math.max(0.1, Math.min(newZoom, 4));
9920
+ if (!wrapperRef.current || !contentRef.current)
9921
+ return;
9922
+ var wrapper = wrapperRef.current;
9923
+ var content = contentRef.current;
9924
+ // Get bounding rectangle of the content
9925
+ var rect = content.getBoundingClientRect();
9926
+ var offsetX = e.clientX - rect.left;
9927
+ var offsetY = e.clientY - rect.top;
9928
+ var percentX = offsetX / (content.offsetWidth);
9929
+ var percentY = offsetY / (content.offsetHeight);
9930
+ console.log(offsetX, offsetY, content.offsetWidth, content.offsetHeight, percentX, percentY);
9931
+ // Old width and height of content
9932
+ var prevWidth = content.offsetWidth * zoom;
9933
+ var prevHeight = content.offsetHeight * zoom;
9934
+ var newWidth = content.offsetWidth * newZoom;
9935
+ var newHeight = content.offsetHeight * newZoom;
9936
+ var scrollLeft = wrapper.scrollLeft + (percentX * (newWidth - prevWidth));
9937
+ var scrollTop = wrapper.scrollTop + (percentY * (newHeight - prevHeight));
9938
+ setZoom(newZoom);
9939
+ setScrollLeft(scrollLeft);
9940
+ setScrollTop(scrollTop);
9941
+ };
9942
+ React.useLayoutEffect(function () {
9943
+ var _a;
9944
+ (_a = wrapperRef.current) === null || _a === void 0 ? void 0 : _a.scrollTo({
9945
+ left: scrollLeft,
9946
+ top: scrollTop,
9947
+ });
9948
+ }, [zoom, scrollLeft, scrollTop]);
9949
+ var resetZoom = function () {
9950
+ setZoom(1);
9951
+ };
9952
+ React.useEffect(function () {
9953
+ var preventBrowserZoom = function (e) {
9954
+ if (e.ctrlKey || e.metaKey) {
9955
+ e.preventDefault();
9956
+ }
9957
+ };
9958
+ window.addEventListener("wheel", preventBrowserZoom, { passive: false });
9959
+ return function () {
9960
+ window.removeEventListener("wheel", preventBrowserZoom);
9961
+ };
9962
+ }, []);
9963
+ return (React.createElement(zoomContext.Provider, { value: { zoom: zoom, setZoom: setZoom, resetZoom: resetZoom } },
9964
+ React.createElement("div", { ref: wrapperRef, onWheel: handleWheel, style: {
9965
+ width: "100vw",
9966
+ height: "92vh",
9967
+ overflow: "auto",
9968
+ } },
9969
+ React.createElement("div", { ref: contentRef, style: {
9970
+ transform: "scale(".concat(zoom, ")"),
9971
+ transformOrigin: "top left",
9972
+ // transition: "transform 0.1s linear",
9973
+ } }, children))));
9974
+ };
9975
+
9899
9976
  var Editor = function (_a) {
9900
9977
  var editorContext = _a.editorContext, width = _a.width, height = _a.height;
9901
9978
  var _b = React.useState([]), elements = _b[0], setElements = _b[1];
@@ -10004,7 +10081,8 @@ var Editor = function (_a) {
10004
10081
  var handlePaperMouseUp = React.useCallback(function (position) {
10005
10082
  editorContext.onPaperMouseUpHandler(position);
10006
10083
  }, [editorContext]);
10007
- return (React.createElement(Paper$1, { key: "paper", size: { width: width, height: height }, elements: elements, links: links, texts: texts, onPaperClicked: handlePaperClicked, onPortMouseDown: handlePortMouseDown, onPortMouseUp: handlePortMouseUp, onPortMoved: handlePortMoved, onPortSelected: handlePortSelected, onElementContextMenu: handleElementContextMenu, onElementMoved: handleElementMoved, onElementResized: handleElementResized, onElementSelected: handleElementSelected, onElementMouseLeave: handleElementMouseLeave, onElementMouseMove: handleElementMouseMove, onElementMouseDown: handleElementMouseDown, onElementMouseUp: handleElementMouseUp, onElementsChanged: handleElementsChanged, onCreatingLink: handleOnCreatingLink, onCreatingPortByLinking: handleOnCreatingPortByLinking, onLinkSelected: handleLinkSelected, onLinksChanged: handleLinksChanged, onTextSelected: handleTextSelected, onTextsChanged: handleTextsChanged, onPaperMouseMoved: handlePaperMouseMoved, onPaperMouseUp: handlePaperMouseUp, onPaperMouseDown: handlePaperMouseDown, onManuallyTriggerRenderElement: editorContext.onManuallyTriggerRenderElement.bind(editorContext), onManuallyTriggerRenderPort: editorContext.onManuallyTriggerRenderPort.bind(editorContext) }));
10084
+ return (React.createElement(ZoomContextProvider, null,
10085
+ React.createElement(Paper$1, { key: "paper", size: { width: width, height: height }, elements: elements, links: links, texts: texts, onPaperClicked: handlePaperClicked, onPortMouseDown: handlePortMouseDown, onPortMouseUp: handlePortMouseUp, onPortMoved: handlePortMoved, onPortSelected: handlePortSelected, onElementContextMenu: handleElementContextMenu, onElementMoved: handleElementMoved, onElementResized: handleElementResized, onElementSelected: handleElementSelected, onElementMouseLeave: handleElementMouseLeave, onElementMouseMove: handleElementMouseMove, onElementMouseDown: handleElementMouseDown, onElementMouseUp: handleElementMouseUp, onElementsChanged: handleElementsChanged, onCreatingLink: handleOnCreatingLink, onCreatingPortByLinking: handleOnCreatingPortByLinking, onLinkSelected: handleLinkSelected, onLinksChanged: handleLinksChanged, onTextSelected: handleTextSelected, onTextsChanged: handleTextsChanged, onPaperMouseMoved: handlePaperMouseMoved, onPaperMouseUp: handlePaperMouseUp, onPaperMouseDown: handlePaperMouseDown, onManuallyTriggerRenderElement: editorContext.onManuallyTriggerRenderElement.bind(editorContext), onManuallyTriggerRenderPort: editorContext.onManuallyTriggerRenderPort.bind(editorContext) })));
10008
10086
  };
10009
10087
 
10010
10088
  exports.CircleRC = Circle;
@@ -0,0 +1,15 @@
1
+ import React from "react";
2
+ interface IZoomContext {
3
+ zoom: number;
4
+ setZoom: (zoom: number) => void;
5
+ resetZoom: () => void;
6
+ }
7
+ /**
8
+ * Zoom context to manage zoom level and related state.
9
+ * This context can be used to provide zoom functionality across the application.
10
+ */
11
+ export declare const zoomContext: React.Context<IZoomContext | null>;
12
+ export declare const ZoomContextProvider: ({ children }: {
13
+ children: React.ReactNode;
14
+ }) => React.JSX.Element;
15
+ export {};
@@ -37,7 +37,7 @@ export default class Element implements IElement {
37
37
  textsPlaceHolderFlexStyle?: IFlexboxType;
38
38
  textsPlaceHolderFlexboxPosition?: IPosition;
39
39
  _eventEmitter: EventEmitter;
40
- constructor(x: number, y: number, width: number, height: number, cssClass?: string, renderShape?: (props: IElementProps) => JSX.Element, texts?: IText[], ports?: IPort[], portMovealeAreas?: IPosition[][], portSlideRailSVGClassName?: string, portDirection?: SubObjectDirection, parentElement?: Element, textsPlaceHolderClassName?: string, textsPlaceHolderFlexStyle?: IFlexboxType, textsPlaceHolderFlexboxPosition?: IPosition);
40
+ constructor(id: string | null, x: number, y: number, width: number, height: number, cssClass?: string, renderShape?: (props: IElementProps) => JSX.Element, texts?: IText[], ports?: IPort[], portMovealeAreas?: IPosition[][], portSlideRailSVGClassName?: string, portDirection?: SubObjectDirection, parentElement?: Element, textsPlaceHolderClassName?: string, textsPlaceHolderFlexStyle?: IFlexboxType, textsPlaceHolderFlexboxPosition?: IPosition);
41
41
  get id(): string;
42
42
  get size(): ISize;
43
43
  set size(value: ISize);
@@ -20,5 +20,5 @@ export default class ElementLink implements IElementLink {
20
20
  label?: IText;
21
21
  sourceLabel?: IText;
22
22
  targetLabel?: IText;
23
- constructor(sourceElement: IElement, sourcePort: IPort, targetElement: IElement, targetPort: IPort, tempTargetPosition: IPosition, points?: IPosition[]);
23
+ constructor(id: string | null, sourceElement: IElement, sourcePort: IPort, targetElement: IElement, targetPort: IPort, tempTargetPosition: IPosition, points?: IPosition[]);
24
24
  }
@@ -12,7 +12,7 @@ export default class Port implements IPort {
12
12
  label?: IText;
13
13
  renderShape?: React.ForwardRefExoticComponent<IPortProps & React.RefAttributes<SVGSVGElement>>;
14
14
  _eventEmitter: EventEmitter;
15
- constructor(x: number, y: number, label?: IText, shapeRenderer?: {
15
+ constructor(id: string | null, x: number, y: number, label?: IText, shapeRenderer?: {
16
16
  shape?: React.ForwardRefExoticComponent<IPortProps & React.RefAttributes<SVGSVGElement>>;
17
17
  customShapeWithJSX?: JSX.Element;
18
18
  positioningAnchor?: IPosition;
@@ -13,6 +13,6 @@ export default class Text implements IText {
13
13
  fontSize?: number;
14
14
  border?: string;
15
15
  style?: IFlexboxType;
16
- constructor(content: string, width: number, height: number, editable: boolean, x?: number, y?: number, align?: TextAlign, fontSize?: number, border?: string, style?: IFlexboxType);
16
+ constructor(id: string | null, content: string, width: number, height: number, editable: boolean, x?: number, y?: number, align?: TextAlign, fontSize?: number, border?: string, style?: IFlexboxType);
17
17
  get id(): string;
18
18
  }
package/dist/esm/index.js CHANGED
@@ -480,7 +480,7 @@ function generateUniqueId() {
480
480
  }
481
481
 
482
482
  var Element$2 = /** @class */ (function () {
483
- function Element(x, y, width, height, cssClass, renderShape, texts, ports, portMovealeAreas, portSlideRailSVGClassName, portDirection, parentElement, textsPlaceHolderClassName, textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition) {
483
+ function Element(id, x, y, width, height, cssClass, renderShape, texts, ports, portMovealeAreas, portSlideRailSVGClassName, portDirection, parentElement, textsPlaceHolderClassName, textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition) {
484
484
  if (portMovealeAreas === void 0) { portMovealeAreas = []; }
485
485
  this.positionAnchor = PositioningAnchor.TopLeft;
486
486
  this._childrenElements = [];
@@ -490,7 +490,7 @@ var Element$2 = /** @class */ (function () {
490
490
  };
491
491
  //internal properties
492
492
  this._eventEmitter = new EventEmitter();
493
- this._id = generateUniqueId();
493
+ this._id = id || generateUniqueId();
494
494
  this._position = { x: x, y: y };
495
495
  this._size = { width: width, height: height };
496
496
  this.cssClass = cssClass;
@@ -692,11 +692,11 @@ var CustomShape = forwardRef(function (props, ref) {
692
692
  });
693
693
 
694
694
  var Port$1 = /** @class */ (function () {
695
- function Port(x, y, label, shapeRenderer, width, height) {
695
+ function Port(id, x, y, label, shapeRenderer, width, height) {
696
696
  var _this = this;
697
697
  //internal properties
698
698
  this._eventEmitter = new EventEmitter();
699
- this._id = generateUniqueId();
699
+ this._id = id || generateUniqueId();
700
700
  this.position = { x: x, y: y };
701
701
  if (!height) {
702
702
  height = width;
@@ -727,8 +727,8 @@ var Port$1 = /** @class */ (function () {
727
727
  }());
728
728
 
729
729
  var ElementLink$1 = /** @class */ (function () {
730
- function ElementLink(sourceElement, sourcePort, targetElement, targetPort, tempTargetPosition, points, path, markerStart, markerEnd, markerDistanceFromPort, markerSize, label, sourceLabel, targetLabel) {
731
- this.id = generateUniqueId();
730
+ function ElementLink(id, sourceElement, sourcePort, targetElement, targetPort, tempTargetPosition, points, path, markerStart, markerEnd, markerDistanceFromPort, markerSize, label, sourceLabel, targetLabel) {
731
+ this.id = id || generateUniqueId();
732
732
  this.sourceElement = sourceElement;
733
733
  this.sourcePort = sourcePort;
734
734
  if (tempTargetPosition) {
@@ -765,8 +765,8 @@ var ElementLink$1 = /** @class */ (function () {
765
765
  }());
766
766
 
767
767
  var Text$2 = /** @class */ (function () {
768
- function Text(content, width, height, editable, x, y, align, fontSize, border, style) {
769
- this._id = generateUniqueId();
768
+ function Text(id, content, width, height, editable, x, y, align, fontSize, border, style) {
769
+ this._id = id || generateUniqueId();
770
770
  this.content = content;
771
771
  this.align = align;
772
772
  this.fontSize = fontSize;
@@ -8066,20 +8066,20 @@ function CloseIcon(_a) {
8066
8066
  React.createElement("path", { d: "M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-11.414L9.172 7.757 7.757 9.172 10.586 12l-2.829 2.828 1.415 1.415L12 13.414l2.828 2.829 1.415-1.415L13.414 12l2.829-2.828-1.415-1.415L12 10.586z" })))));
8067
8067
  }
8068
8068
 
8069
- var makerStart = React.createElement("circle", { cx: 10, cy: 10, r: 10, fill: "blue" });
8070
- var makerEnd = React.createElement("path", { d: "M0 0 L 20 10 L0 20 Z", fill: "blue" }); //<path d="M0 0 L 10 5 L0 10 Z"></path>
8069
+ // const makerStart = <circle cx={10} cy={10} r={10} fill="blue"></circle>
8070
+ // const makerEnd = <path d="M0 0 L 20 10 L0 20 Z" fill="blue"></path>//<path d="M0 0 L 10 5 L0 10 Z"></path>
8071
8071
  var IElementLink = function (_a) {
8072
8072
  var _b, _c;
8073
- var id = _a.id, path = _a.path, stroke = _a.stroke, _d = _a.strokeWidth, strokeWidth = _d === void 0 ? 4 : _d, pointsProp = _a.points, sourcePosition = _a.sourcePosition, targetPosition = _a.targetPosition, onPathChanged = _a.onPathChanged, onClickDelete = _a.onClickDelete, onSelected = _a.onSelected, onDeselected = _a.onDeselected, container = _a.container, _e = _a.markerStart, markerStart = _e === void 0 ? makerStart : _e, _f = _a.markerEnd, markerEnd = _f === void 0 ? makerEnd : _f, _g = _a.markerDistanceFromPort, markerDistanceFromPort = _g === void 0 ? LINK_MARKER_DISTANCE_FROM_PORT : _g, _h = _a.markerSize, markerSize = _h === void 0 ? LINK_MARKER_SIZE : _h, label = _a.label, sourceLabel = _a.sourceLabel, targetLabel = _a.targetLabel, onLabelMoved = _a.onLabelMoved, onLabelResized = _a.onLabelResized, onLabelContentChanged = _a.onLabelContentChanged;
8074
- var _j = useState(path), pathStr = _j[0], setPathStr = _j[1];
8075
- var _k = useState(pointsProp !== null && pointsProp !== void 0 ? pointsProp : []), points = _k[0], setPoints = _k[1];
8076
- var _l = useState(false), isDragging = _l[0], setIsDragging = _l[1];
8077
- var _m = useState(), draggingPointIndex = _m[0], setDraggingPointIndex = _m[1];
8078
- var _o = useState({
8073
+ var id = _a.id, path = _a.path, stroke = _a.stroke, _d = _a.strokeWidth, strokeWidth = _d === void 0 ? 4 : _d, pointsProp = _a.points, sourcePosition = _a.sourcePosition, targetPosition = _a.targetPosition, onPathChanged = _a.onPathChanged, onClickDelete = _a.onClickDelete, onSelected = _a.onSelected, onDeselected = _a.onDeselected, container = _a.container, markerStart = _a.markerStart, markerEnd = _a.markerEnd, _e = _a.markerDistanceFromPort, markerDistanceFromPort = _e === void 0 ? LINK_MARKER_DISTANCE_FROM_PORT : _e, _f = _a.markerSize, markerSize = _f === void 0 ? LINK_MARKER_SIZE : _f, label = _a.label, sourceLabel = _a.sourceLabel, targetLabel = _a.targetLabel, onLabelMoved = _a.onLabelMoved, onLabelResized = _a.onLabelResized, onLabelContentChanged = _a.onLabelContentChanged;
8074
+ var _g = useState(path), pathStr = _g[0], setPathStr = _g[1];
8075
+ var _h = useState(pointsProp !== null && pointsProp !== void 0 ? pointsProp : []), points = _h[0], setPoints = _h[1];
8076
+ var _j = useState(false), isDragging = _j[0], setIsDragging = _j[1];
8077
+ var _k = useState(), draggingPointIndex = _k[0], setDraggingPointIndex = _k[1];
8078
+ var _l = useState({
8079
8079
  current: null,
8080
- }), selectedLabelRef = _o[0], setSelectedLabelRef = _o[1];
8081
- var _p = useState(false), isSelectedLink = _p[0], setIsSelectedLink = _p[1];
8082
- var _q = useContext(paperEventEmitterContext), onPaperClicked = _q.onPaperClicked, onElementSelected = _q.onElementSelected;
8080
+ }), selectedLabelRef = _l[0], setSelectedLabelRef = _l[1];
8081
+ var _m = useState(false), isSelectedLink = _m[0], setIsSelectedLink = _m[1];
8082
+ var _o = useContext(paperEventEmitterContext), onPaperClicked = _o.onPaperClicked, onElementSelected = _o.onElementSelected;
8083
8083
  var pathRef = useRef(null);
8084
8084
  var labelRef = useRef(null);
8085
8085
  var sourceLabelRef = useRef(null);
@@ -9892,6 +9892,83 @@ var Paper = function (props) {
9892
9892
  };
9893
9893
  var Paper$1 = memo(Paper);
9894
9894
 
9895
+ /**
9896
+ * Zoom context to manage zoom level and related state.
9897
+ * This context can be used to provide zoom functionality across the application.
9898
+ */
9899
+ var zoomContext = createContext(null);
9900
+ var ZoomContextProvider = function (_a) {
9901
+ var children = _a.children;
9902
+ var _b = React.useState(1), zoom = _b[0], setZoom = _b[1];
9903
+ var _c = React.useState(0), scrollLeft = _c[0], setScrollLeft = _c[1];
9904
+ var _d = React.useState(0), scrollTop = _d[0], setScrollTop = _d[1];
9905
+ var wrapperRef = useRef(null);
9906
+ var contentRef = useRef(null);
9907
+ var handleWheel = function (e) {
9908
+ // Chỉ zoom khi giữ Ctrl
9909
+ if (!e.ctrlKey)
9910
+ return;
9911
+ e.preventDefault();
9912
+ var delta = -e.deltaY;
9913
+ var zoomFactor = 0.05;
9914
+ var newZoom = zoom + (delta > 0 ? zoomFactor : -zoomFactor);
9915
+ newZoom = Math.max(0.1, Math.min(newZoom, 4));
9916
+ if (!wrapperRef.current || !contentRef.current)
9917
+ return;
9918
+ var wrapper = wrapperRef.current;
9919
+ var content = contentRef.current;
9920
+ // Get bounding rectangle of the content
9921
+ var rect = content.getBoundingClientRect();
9922
+ var offsetX = e.clientX - rect.left;
9923
+ var offsetY = e.clientY - rect.top;
9924
+ var percentX = offsetX / (content.offsetWidth);
9925
+ var percentY = offsetY / (content.offsetHeight);
9926
+ console.log(offsetX, offsetY, content.offsetWidth, content.offsetHeight, percentX, percentY);
9927
+ // Old width and height of content
9928
+ var prevWidth = content.offsetWidth * zoom;
9929
+ var prevHeight = content.offsetHeight * zoom;
9930
+ var newWidth = content.offsetWidth * newZoom;
9931
+ var newHeight = content.offsetHeight * newZoom;
9932
+ var scrollLeft = wrapper.scrollLeft + (percentX * (newWidth - prevWidth));
9933
+ var scrollTop = wrapper.scrollTop + (percentY * (newHeight - prevHeight));
9934
+ setZoom(newZoom);
9935
+ setScrollLeft(scrollLeft);
9936
+ setScrollTop(scrollTop);
9937
+ };
9938
+ useLayoutEffect(function () {
9939
+ var _a;
9940
+ (_a = wrapperRef.current) === null || _a === void 0 ? void 0 : _a.scrollTo({
9941
+ left: scrollLeft,
9942
+ top: scrollTop,
9943
+ });
9944
+ }, [zoom, scrollLeft, scrollTop]);
9945
+ var resetZoom = function () {
9946
+ setZoom(1);
9947
+ };
9948
+ React.useEffect(function () {
9949
+ var preventBrowserZoom = function (e) {
9950
+ if (e.ctrlKey || e.metaKey) {
9951
+ e.preventDefault();
9952
+ }
9953
+ };
9954
+ window.addEventListener("wheel", preventBrowserZoom, { passive: false });
9955
+ return function () {
9956
+ window.removeEventListener("wheel", preventBrowserZoom);
9957
+ };
9958
+ }, []);
9959
+ return (React.createElement(zoomContext.Provider, { value: { zoom: zoom, setZoom: setZoom, resetZoom: resetZoom } },
9960
+ React.createElement("div", { ref: wrapperRef, onWheel: handleWheel, style: {
9961
+ width: "100vw",
9962
+ height: "92vh",
9963
+ overflow: "auto",
9964
+ } },
9965
+ React.createElement("div", { ref: contentRef, style: {
9966
+ transform: "scale(".concat(zoom, ")"),
9967
+ transformOrigin: "top left",
9968
+ // transition: "transform 0.1s linear",
9969
+ } }, children))));
9970
+ };
9971
+
9895
9972
  var Editor = function (_a) {
9896
9973
  var editorContext = _a.editorContext, width = _a.width, height = _a.height;
9897
9974
  var _b = React.useState([]), elements = _b[0], setElements = _b[1];
@@ -10000,7 +10077,8 @@ var Editor = function (_a) {
10000
10077
  var handlePaperMouseUp = useCallback(function (position) {
10001
10078
  editorContext.onPaperMouseUpHandler(position);
10002
10079
  }, [editorContext]);
10003
- return (React.createElement(Paper$1, { key: "paper", size: { width: width, height: height }, elements: elements, links: links, texts: texts, onPaperClicked: handlePaperClicked, onPortMouseDown: handlePortMouseDown, onPortMouseUp: handlePortMouseUp, onPortMoved: handlePortMoved, onPortSelected: handlePortSelected, onElementContextMenu: handleElementContextMenu, onElementMoved: handleElementMoved, onElementResized: handleElementResized, onElementSelected: handleElementSelected, onElementMouseLeave: handleElementMouseLeave, onElementMouseMove: handleElementMouseMove, onElementMouseDown: handleElementMouseDown, onElementMouseUp: handleElementMouseUp, onElementsChanged: handleElementsChanged, onCreatingLink: handleOnCreatingLink, onCreatingPortByLinking: handleOnCreatingPortByLinking, onLinkSelected: handleLinkSelected, onLinksChanged: handleLinksChanged, onTextSelected: handleTextSelected, onTextsChanged: handleTextsChanged, onPaperMouseMoved: handlePaperMouseMoved, onPaperMouseUp: handlePaperMouseUp, onPaperMouseDown: handlePaperMouseDown, onManuallyTriggerRenderElement: editorContext.onManuallyTriggerRenderElement.bind(editorContext), onManuallyTriggerRenderPort: editorContext.onManuallyTriggerRenderPort.bind(editorContext) }));
10080
+ return (React.createElement(ZoomContextProvider, null,
10081
+ React.createElement(Paper$1, { key: "paper", size: { width: width, height: height }, elements: elements, links: links, texts: texts, onPaperClicked: handlePaperClicked, onPortMouseDown: handlePortMouseDown, onPortMouseUp: handlePortMouseUp, onPortMoved: handlePortMoved, onPortSelected: handlePortSelected, onElementContextMenu: handleElementContextMenu, onElementMoved: handleElementMoved, onElementResized: handleElementResized, onElementSelected: handleElementSelected, onElementMouseLeave: handleElementMouseLeave, onElementMouseMove: handleElementMouseMove, onElementMouseDown: handleElementMouseDown, onElementMouseUp: handleElementMouseUp, onElementsChanged: handleElementsChanged, onCreatingLink: handleOnCreatingLink, onCreatingPortByLinking: handleOnCreatingPortByLinking, onLinkSelected: handleLinkSelected, onLinksChanged: handleLinksChanged, onTextSelected: handleTextSelected, onTextsChanged: handleTextsChanged, onPaperMouseMoved: handlePaperMouseMoved, onPaperMouseUp: handlePaperMouseUp, onPaperMouseDown: handlePaperMouseDown, onManuallyTriggerRenderElement: editorContext.onManuallyTriggerRenderElement.bind(editorContext), onManuallyTriggerRenderPort: editorContext.onManuallyTriggerRenderPort.bind(editorContext) })));
10004
10082
  };
10005
10083
 
10006
10084
  export { Circle as CircleRC, Crescent as CrescentRC, CustomShape as CustomShapeRC, EditorContext, Element$2 as Element, ElementLink$1 as ElementLink, ElementLink as ElementLinkRC, Port$1 as Port, Port as PortRC, PositioningAnchor, Rectangle as RectangleRC, RectangularFrame as RectangularFrameRC, ResizingDirection, ShapeWrapper as ShapeWrapperRC, SubObjectDirection, Text$2 as Text, TextAlign, Text$1 as TextRC, addPointToList, calculateAngleWithOx, checkPointContainsPolygon, checkPositionOnLine, checkSamePosition, configureLogger, correctPortPositionInElement, createSmoothPathString, Editor as default, degreeToRadian, diamondEdgeInsideSquare, dist, findNearestPointOnSegment, findNearestPosition, findNearestProjectedPoint, generateSubstitutePosition, generateUniqueId, getAbsolutePosition, getCurvePathData, getElementRotationInfo, getFirstIntersection, getFourVertexesOfBBoxFromElement, getIntersectionPositions, getPortAbsolutePosition, getRectangleCorners, getRelativePosition, getRotatedRectangleCoordinates, getRotatedSVGBBox, getSVGBBoxOutsideTransformedParent, makePolygonOfElement, pathDataToD, removeDuplicatePosition, transformAbsPositionToElementRelativePosition, transformAbsPositionToRelativePositionInsideElement };