@01.software/sdk 0.4.3-dev.1774338319418 → 0.4.3-dev.1774340903661

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/ui/flow.cjs CHANGED
@@ -82,8 +82,6 @@ __export(Flow_exports, {
82
82
  useFlowData: () => useFlowData
83
83
  });
84
84
  module.exports = __toCommonJS(Flow_exports);
85
- var import_react4 = __toESM(require("react"), 1);
86
- var import_react5 = require("@xyflow/react");
87
85
 
88
86
  // src/ui/Flow/types.ts
89
87
  function isDynamicNode(node) {
@@ -477,7 +475,15 @@ function clearTemplateCache() {
477
475
  componentCache.clear();
478
476
  }
479
477
 
480
- // src/ui/Flow/index.tsx
478
+ // src/ui/Flow/FlowRenderer.tsx
479
+ var import_react9 = __toESM(require("react"), 1);
480
+ var import_react10 = require("@xyflow/react");
481
+
482
+ // src/ui/Flow/node-types-factory.tsx
483
+ var import_react5 = __toESM(require("react"), 1);
484
+
485
+ // src/ui/Flow/node-renderers.tsx
486
+ var import_react4 = __toESM(require("react"), 1);
481
487
  function sanitizeUrl(url) {
482
488
  if (!url) return url;
483
489
  try {
@@ -488,11 +494,6 @@ function sanitizeUrl(url) {
488
494
  return void 0;
489
495
  }
490
496
  }
491
- function toMarkerType(value) {
492
- if (value === "arrow") return import_react5.MarkerType.Arrow;
493
- if (value === "arrowclosed") return import_react5.MarkerType.ArrowClosed;
494
- return void 0;
495
- }
496
497
  function renderFieldValue(key, val, fieldDef) {
497
498
  if (val == null || val === "") return null;
498
499
  const fieldType = fieldDef == null ? void 0 : fieldDef.fieldType;
@@ -644,13 +645,15 @@ function DefaultFrameNode({ data }) {
644
645
  )
645
646
  );
646
647
  }
648
+
649
+ // src/ui/Flow/node-types-factory.tsx
647
650
  function createNodeTypes(nodeRenderers, nodeTypeDefsMap, frameRenderer, nodeWrapper, renderNode) {
648
651
  const types = {};
649
652
  types.dynamic = ((props) => {
650
653
  const d = props.data;
651
654
  const typeDef = nodeTypeDefsMap == null ? void 0 : nodeTypeDefsMap.get(d.nodeTypeSlug);
652
655
  const CustomRenderer = nodeRenderers == null ? void 0 : nodeRenderers[d.nodeTypeSlug];
653
- const defaultRender = typeDef ? /* @__PURE__ */ import_react4.default.createElement(
656
+ const defaultRender = typeDef ? /* @__PURE__ */ import_react5.default.createElement(
654
657
  EnhancedDynamicNode,
655
658
  {
656
659
  data: d,
@@ -658,7 +661,7 @@ function createNodeTypes(nodeRenderers, nodeTypeDefsMap, frameRenderer, nodeWrap
658
661
  width: props.width,
659
662
  height: props.height
660
663
  }
661
- ) : /* @__PURE__ */ import_react4.default.createElement(DefaultDynamicNode, __spreadValues({}, props));
664
+ ) : /* @__PURE__ */ import_react5.default.createElement(DefaultDynamicNode, __spreadValues({}, props));
662
665
  const slotProps = {
663
666
  id: props.id,
664
667
  nodeTypeSlug: d.nodeTypeSlug,
@@ -670,14 +673,14 @@ function createNodeTypes(nodeRenderers, nodeTypeDefsMap, frameRenderer, nodeWrap
670
673
  height: props.height,
671
674
  defaultRender
672
675
  };
673
- let content = CustomRenderer ? /* @__PURE__ */ import_react4.default.createElement(CustomRenderer, __spreadValues({}, slotProps)) : defaultRender;
676
+ let content = CustomRenderer ? /* @__PURE__ */ import_react5.default.createElement(CustomRenderer, __spreadValues({}, slotProps)) : defaultRender;
674
677
  if (renderNode) {
675
678
  const result = renderNode(slotProps, content);
676
679
  if (result !== null) content = result;
677
680
  }
678
681
  if (nodeWrapper) {
679
682
  const Wrapper = nodeWrapper;
680
- content = /* @__PURE__ */ import_react4.default.createElement(
683
+ content = /* @__PURE__ */ import_react5.default.createElement(
681
684
  Wrapper,
682
685
  {
683
686
  id: props.id,
@@ -694,7 +697,7 @@ function createNodeTypes(nodeRenderers, nodeTypeDefsMap, frameRenderer, nodeWrap
694
697
  types.frame = frameRenderer ? ((props) => {
695
698
  const d = props.data;
696
699
  const Renderer = frameRenderer;
697
- return /* @__PURE__ */ import_react4.default.createElement(
700
+ return /* @__PURE__ */ import_react5.default.createElement(
698
701
  Renderer,
699
702
  {
700
703
  id: props.id,
@@ -718,7 +721,7 @@ function createEdgeTypes(edgeRenderers, edgeTypeDefsMap) {
718
721
  types[slug] = ((props) => {
719
722
  var _a;
720
723
  const def = edgeTypeDefsMap == null ? void 0 : edgeTypeDefsMap.get(slug);
721
- return /* @__PURE__ */ import_react4.default.createElement(
724
+ return /* @__PURE__ */ import_react5.default.createElement(
722
725
  Renderer,
723
726
  {
724
727
  id: props.id,
@@ -735,6 +738,57 @@ function createEdgeTypes(edgeRenderers, edgeTypeDefsMap) {
735
738
  }
736
739
  return types;
737
740
  }
741
+
742
+ // src/ui/Flow/edge-styles.ts
743
+ var import_react6 = require("@xyflow/react");
744
+ function toMarkerType(value) {
745
+ if (value === "arrow") return import_react6.MarkerType.Arrow;
746
+ if (value === "arrowclosed") return import_react6.MarkerType.ArrowClosed;
747
+ return void 0;
748
+ }
749
+ var EDGE_TYPE_MAP = {
750
+ step: "step",
751
+ smoothstep: "smoothstep",
752
+ bezier: "default",
753
+ default: "default"
754
+ };
755
+ function applyEdgeStyles(edges, edgeTypeDefsMap) {
756
+ if (!(edgeTypeDefsMap == null ? void 0 : edgeTypeDefsMap.size)) return edges;
757
+ return edges.map((edge) => {
758
+ var _a;
759
+ const slug = edge.edgeTypeSlug;
760
+ if (!slug) return edge;
761
+ const def = edgeTypeDefsMap.get(slug);
762
+ if (!def) return edge;
763
+ const styled = __spreadValues({}, edge);
764
+ if (!styled.type && def.lineStyle) {
765
+ styled.type = (_a = EDGE_TYPE_MAP[def.lineStyle]) != null ? _a : "default";
766
+ }
767
+ styled.style = __spreadValues(__spreadValues(__spreadValues({}, def.color ? { stroke: def.color } : void 0), def.strokeWidth ? { strokeWidth: def.strokeWidth } : void 0), edge.style);
768
+ if (styled.animated == null && def.animated) styled.animated = true;
769
+ if (!styled.markerStart) {
770
+ const startType = toMarkerType(def.markerStart);
771
+ if (startType) {
772
+ styled.markerStart = __spreadValues({
773
+ type: startType
774
+ }, def.color ? { color: def.color } : void 0);
775
+ }
776
+ }
777
+ if (!styled.markerEnd) {
778
+ const endType = toMarkerType(def.markerEnd);
779
+ if (endType) {
780
+ styled.markerEnd = __spreadValues({
781
+ type: endType
782
+ }, def.color ? { color: def.color } : void 0);
783
+ }
784
+ }
785
+ return styled;
786
+ });
787
+ }
788
+
789
+ // src/ui/Flow/focus-handler.tsx
790
+ var import_react7 = __toESM(require("react"), 1);
791
+ var import_react8 = require("@xyflow/react");
738
792
  function clampViewport(vp, cw, ch, extent) {
739
793
  const left = -vp.x / vp.zoom;
740
794
  const right = (cw - vp.x) / vp.zoom;
@@ -757,18 +811,19 @@ function FocusHandler({
757
811
  responsive,
758
812
  extent,
759
813
  clampBounds,
760
- minZoomProp
814
+ minZoomProp,
815
+ onInitialFit
761
816
  }) {
762
- const { setViewport } = (0, import_react5.useReactFlow)();
763
- const store = (0, import_react5.useStoreApi)();
764
- const containerRef = import_react4.default.useRef(null);
817
+ const { setViewport } = (0, import_react8.useReactFlow)();
818
+ const store = (0, import_react8.useStoreApi)();
819
+ const containerRef = import_react7.default.useRef(null);
765
820
  const boundsKey = `${bounds.x},${bounds.y},${bounds.width},${bounds.height}`;
766
- const boundsRef = import_react4.default.useRef(bounds);
821
+ const boundsRef = import_react7.default.useRef(bounds);
767
822
  boundsRef.current = bounds;
768
- const [containerSize, setContainerSize] = import_react4.default.useState({ w: 0, h: 0 });
769
- const prevBoundsKeyRef = import_react4.default.useRef(null);
770
- const prevSizeRef = import_react4.default.useRef({ w: 0, h: 0 });
771
- import_react4.default.useEffect(() => {
823
+ const [containerSize, setContainerSize] = import_react7.default.useState({ w: 0, h: 0 });
824
+ const prevBoundsKeyRef = import_react7.default.useRef(null);
825
+ const prevSizeRef = import_react7.default.useRef({ w: 0, h: 0 });
826
+ import_react7.default.useEffect(() => {
772
827
  const el = containerRef.current;
773
828
  if (!el) return;
774
829
  const observer = new ResizeObserver((entries) => {
@@ -780,7 +835,7 @@ function FocusHandler({
780
835
  observer.observe(el);
781
836
  return () => observer.disconnect();
782
837
  }, []);
783
- import_react4.default.useEffect(() => {
838
+ import_react7.default.useEffect(() => {
784
839
  if (containerSize.w === 0 || containerSize.h === 0) return;
785
840
  const prevKey = prevBoundsKeyRef.current;
786
841
  const prevSize = prevSizeRef.current;
@@ -790,18 +845,17 @@ function FocusHandler({
790
845
  const isResizeOnly = !isBoundsChange && (prevSize.w !== containerSize.w || prevSize.h !== containerSize.h);
791
846
  const isInitial = prevKey === null;
792
847
  if (isResizeOnly && !responsive) return;
793
- const duration = isInitial || isBoundsChange ? animation === true ? 300 : typeof animation === "number" ? animation : 0 : 0;
848
+ const duration = isInitial ? 0 : isBoundsChange ? animation === true ? 300 : typeof animation === "number" ? animation : 0 : 0;
794
849
  const b = boundsRef.current;
795
- const zoomTarget = mode === "cover" && clampBounds ? clampBounds : b;
796
- const padX = padding * zoomTarget.width;
797
- const padY = padding * zoomTarget.height;
798
- const bw = zoomTarget.width + padX * 2;
799
- const bh = zoomTarget.height + padY * 2;
850
+ const padX = padding * b.width;
851
+ const padY = padding * b.height;
852
+ const bw = b.width + padX * 2;
853
+ const bh = b.height + padY * 2;
800
854
  if (bw === 0 || bh === 0) return;
801
855
  const zoomFn = mode === "cover" ? Math.max : Math.min;
802
856
  const zoom = zoomFn(containerSize.w / bw, containerSize.h / bh);
803
- const cx = zoomTarget.x + zoomTarget.width / 2;
804
- const cy = zoomTarget.y + zoomTarget.height / 2;
857
+ const cx = b.x + b.width / 2;
858
+ const cy = b.y + b.height / 2;
805
859
  const x = containerSize.w / 2 - cx * zoom;
806
860
  const y = containerSize.h / 2 - cy * zoom;
807
861
  if (clampBounds) {
@@ -814,10 +868,15 @@ function FocusHandler({
814
868
  store.getState().setMinZoom(minZoomProp != null ? minZoomProp : 0.5);
815
869
  }
816
870
  let vp = { x, y, zoom };
817
- if (extent) {
818
- vp = clampViewport(vp, containerSize.w, containerSize.h, extent);
871
+ if (isInitial || isBoundsChange) {
872
+ setViewport(vp, { duration: isInitial ? 0 : duration });
873
+ onInitialFit == null ? void 0 : onInitialFit();
874
+ } else {
875
+ if (extent) {
876
+ vp = clampViewport(vp, containerSize.w, containerSize.h, extent);
877
+ }
878
+ setViewport(vp, { duration });
819
879
  }
820
- setViewport(vp, { duration });
821
880
  }, [
822
881
  boundsKey,
823
882
  padding,
@@ -830,9 +889,10 @@ function FocusHandler({
830
889
  setViewport,
831
890
  clampBounds,
832
891
  minZoomProp,
833
- store
892
+ store,
893
+ onInitialFit
834
894
  ]);
835
- return /* @__PURE__ */ import_react4.default.createElement(
895
+ return /* @__PURE__ */ import_react7.default.createElement(
836
896
  "div",
837
897
  {
838
898
  ref: containerRef,
@@ -845,45 +905,8 @@ function FocusHandler({
845
905
  }
846
906
  );
847
907
  }
848
- var EDGE_TYPE_MAP = {
849
- step: "step",
850
- smoothstep: "smoothstep",
851
- bezier: "default",
852
- default: "default"
853
- };
854
- function applyEdgeStyles(edges, edgeTypeDefsMap) {
855
- if (!(edgeTypeDefsMap == null ? void 0 : edgeTypeDefsMap.size)) return edges;
856
- return edges.map((edge) => {
857
- var _a;
858
- const slug = edge.edgeTypeSlug;
859
- if (!slug) return edge;
860
- const def = edgeTypeDefsMap.get(slug);
861
- if (!def) return edge;
862
- const styled = __spreadValues({}, edge);
863
- if (!styled.type && def.lineStyle) {
864
- styled.type = (_a = EDGE_TYPE_MAP[def.lineStyle]) != null ? _a : "default";
865
- }
866
- styled.style = __spreadValues(__spreadValues(__spreadValues({}, def.color ? { stroke: def.color } : void 0), def.strokeWidth ? { strokeWidth: def.strokeWidth } : void 0), edge.style);
867
- if (styled.animated == null && def.animated) styled.animated = true;
868
- if (!styled.markerStart) {
869
- const startType = toMarkerType(def.markerStart);
870
- if (startType) {
871
- styled.markerStart = __spreadValues({
872
- type: startType
873
- }, def.color ? { color: def.color } : void 0);
874
- }
875
- }
876
- if (!styled.markerEnd) {
877
- const endType = toMarkerType(def.markerEnd);
878
- if (endType) {
879
- styled.markerEnd = __spreadValues({
880
- type: endType
881
- }, def.color ? { color: def.color } : void 0);
882
- }
883
- }
884
- return styled;
885
- });
886
- }
908
+
909
+ // src/ui/Flow/FlowRenderer.tsx
887
910
  function FlowRenderer({
888
911
  data,
889
912
  className,
@@ -921,15 +944,15 @@ function FlowRenderer({
921
944
  maxZoom: maxZoomProp
922
945
  }) {
923
946
  var _a;
924
- const nodeTypeDefsMap = import_react4.default.useMemo(() => {
947
+ const nodeTypeDefsMap = import_react9.default.useMemo(() => {
925
948
  if (!(nodeTypeDefs == null ? void 0 : nodeTypeDefs.length)) return void 0;
926
949
  return new Map(nodeTypeDefs.map((d) => [d.slug, d]));
927
950
  }, [nodeTypeDefs]);
928
- const edgeTypeDefsMap = import_react4.default.useMemo(() => {
951
+ const edgeTypeDefsMap = import_react9.default.useMemo(() => {
929
952
  if (!(edgeTypeDefs == null ? void 0 : edgeTypeDefs.length)) return void 0;
930
953
  return new Map(edgeTypeDefs.map((d) => [d.slug, d]));
931
954
  }, [edgeTypeDefs]);
932
- const nodeTypes = import_react4.default.useMemo(
955
+ const nodeTypes = import_react9.default.useMemo(
933
956
  () => createNodeTypes(
934
957
  nodeRenderers,
935
958
  nodeTypeDefsMap,
@@ -939,15 +962,15 @@ function FlowRenderer({
939
962
  ),
940
963
  [nodeRenderers, nodeTypeDefsMap, frameRenderer, nodeWrapper, renderNode]
941
964
  );
942
- const customEdgeTypes = import_react4.default.useMemo(
965
+ const customEdgeTypes = import_react9.default.useMemo(
943
966
  () => createEdgeTypes(edgeRenderers, edgeTypeDefsMap),
944
967
  [edgeRenderers, edgeTypeDefsMap]
945
968
  );
946
- const mergedCSS = import_react4.default.useMemo(() => {
969
+ const mergedCSS = import_react9.default.useMemo(() => {
947
970
  if (!(nodeTypeDefs == null ? void 0 : nodeTypeDefs.length)) return "";
948
971
  return nodeTypeDefs.filter((d) => d.customCSS).map((d) => d.customCSS).join("\n");
949
972
  }, [nodeTypeDefs]);
950
- const styledEdges = import_react4.default.useMemo(() => {
973
+ const styledEdges = import_react9.default.useMemo(() => {
951
974
  var _a2;
952
975
  let edges = applyEdgeStyles((_a2 = data == null ? void 0 : data.edges) != null ? _a2 : [], edgeTypeDefsMap);
953
976
  if (edgeRenderers) {
@@ -961,7 +984,7 @@ function FlowRenderer({
961
984
  }
962
985
  return edges;
963
986
  }, [data == null ? void 0 : data.edges, edgeTypeDefsMap, edgeRenderers]);
964
- const translateExtent = import_react4.default.useMemo(() => {
987
+ const translateExtent = import_react9.default.useMemo(() => {
965
988
  if (translateExtentProp) return translateExtentProp;
966
989
  const es = clampBounds != null ? clampBounds : bounds;
967
990
  if (!es) return void 0;
@@ -971,9 +994,22 @@ function FlowRenderer({
971
994
  [es.x + es.width * (1 + ep), es.y + es.height * (1 + ep)]
972
995
  ];
973
996
  }, [translateExtentProp, clampBounds, bounds, focusPadding]);
997
+ const boundsKey = bounds ? `${bounds.x},${bounds.y},${bounds.width},${bounds.height}` : "";
998
+ const extentReadyRef = import_react9.default.useRef(false);
999
+ const prevBoundsKeyRef = import_react9.default.useRef(boundsKey);
1000
+ if (prevBoundsKeyRef.current !== boundsKey) {
1001
+ prevBoundsKeyRef.current = boundsKey;
1002
+ extentReadyRef.current = false;
1003
+ }
1004
+ const [, rerender] = import_react9.default.useReducer((x) => x + 1, 0);
1005
+ const handleInitialFit = import_react9.default.useCallback(() => {
1006
+ extentReadyRef.current = true;
1007
+ rerender();
1008
+ }, []);
1009
+ const activeExtent = !bounds || extentReadyRef.current ? translateExtent : void 0;
974
1010
  if (!data) return null;
975
1011
  const resolvedDefaultViewport = defaultViewportProp != null ? defaultViewportProp : !fitView && data.viewport ? data.viewport : void 0;
976
- return /* @__PURE__ */ import_react4.default.createElement(import_react5.ReactFlowProvider, null, /* @__PURE__ */ import_react4.default.createElement(
1012
+ return /* @__PURE__ */ import_react9.default.createElement(import_react10.ReactFlowProvider, null, /* @__PURE__ */ import_react9.default.createElement(
977
1013
  "div",
978
1014
  {
979
1015
  className,
@@ -983,8 +1019,8 @@ function FlowRenderer({
983
1019
  background: "transparent"
984
1020
  }, style)
985
1021
  },
986
- /* @__PURE__ */ import_react4.default.createElement(
987
- import_react5.ReactFlow,
1022
+ /* @__PURE__ */ import_react9.default.createElement(
1023
+ import_react10.ReactFlow,
988
1024
  {
989
1025
  nodes: (_a = data.nodes) != null ? _a : [],
990
1026
  edges: styledEdges,
@@ -992,7 +1028,7 @@ function FlowRenderer({
992
1028
  edgeTypes: customEdgeTypes,
993
1029
  defaultViewport: resolvedDefaultViewport,
994
1030
  fitView: bounds ? false : fitView,
995
- translateExtent,
1031
+ translateExtent: activeExtent,
996
1032
  onNodeClick,
997
1033
  onNodeDoubleClick,
998
1034
  onNodeContextMenu,
@@ -1013,16 +1049,16 @@ function FlowRenderer({
1013
1049
  maxZoom: maxZoomProp,
1014
1050
  proOptions: { hideAttribution: true }
1015
1051
  },
1016
- mergedCSS && /* @__PURE__ */ import_react4.default.createElement("style", { dangerouslySetInnerHTML: { __html: mergedCSS } }),
1017
- background && /* @__PURE__ */ import_react4.default.createElement(import_react5.Background, null),
1018
- controls && /* @__PURE__ */ import_react4.default.createElement(import_react5.Controls, null),
1019
- minimap && /* @__PURE__ */ import_react4.default.createElement(
1020
- import_react5.MiniMap,
1052
+ mergedCSS && /* @__PURE__ */ import_react9.default.createElement("style", { dangerouslySetInnerHTML: { __html: mergedCSS } }),
1053
+ background && /* @__PURE__ */ import_react9.default.createElement(import_react10.Background, null),
1054
+ controls && /* @__PURE__ */ import_react9.default.createElement(import_react10.Controls, null),
1055
+ minimap && /* @__PURE__ */ import_react9.default.createElement(
1056
+ import_react10.MiniMap,
1021
1057
  {
1022
1058
  nodeColor: minimapNodeColor
1023
1059
  }
1024
1060
  ),
1025
- bounds && /* @__PURE__ */ import_react4.default.createElement(
1061
+ bounds && /* @__PURE__ */ import_react9.default.createElement(
1026
1062
  FocusHandler,
1027
1063
  {
1028
1064
  bounds,
@@ -1032,7 +1068,8 @@ function FlowRenderer({
1032
1068
  responsive: responsiveFit != null ? responsiveFit : true,
1033
1069
  extent: translateExtent,
1034
1070
  clampBounds,
1035
- minZoomProp
1071
+ minZoomProp,
1072
+ onInitialFit: handleInitialFit
1036
1073
  }
1037
1074
  ),
1038
1075
  children