@01.software/sdk 0.4.3-dev.1774339118317 → 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;
@@ -813,10 +868,15 @@ function FocusHandler({
813
868
  store.getState().setMinZoom(minZoomProp != null ? minZoomProp : 0.5);
814
869
  }
815
870
  let vp = { x, y, zoom };
816
- if (extent && !isInitial) {
817
- 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 });
818
879
  }
819
- setViewport(vp, { duration });
820
880
  }, [
821
881
  boundsKey,
822
882
  padding,
@@ -829,9 +889,10 @@ function FocusHandler({
829
889
  setViewport,
830
890
  clampBounds,
831
891
  minZoomProp,
832
- store
892
+ store,
893
+ onInitialFit
833
894
  ]);
834
- return /* @__PURE__ */ import_react4.default.createElement(
895
+ return /* @__PURE__ */ import_react7.default.createElement(
835
896
  "div",
836
897
  {
837
898
  ref: containerRef,
@@ -844,45 +905,8 @@ function FocusHandler({
844
905
  }
845
906
  );
846
907
  }
847
- var EDGE_TYPE_MAP = {
848
- step: "step",
849
- smoothstep: "smoothstep",
850
- bezier: "default",
851
- default: "default"
852
- };
853
- function applyEdgeStyles(edges, edgeTypeDefsMap) {
854
- if (!(edgeTypeDefsMap == null ? void 0 : edgeTypeDefsMap.size)) return edges;
855
- return edges.map((edge) => {
856
- var _a;
857
- const slug = edge.edgeTypeSlug;
858
- if (!slug) return edge;
859
- const def = edgeTypeDefsMap.get(slug);
860
- if (!def) return edge;
861
- const styled = __spreadValues({}, edge);
862
- if (!styled.type && def.lineStyle) {
863
- styled.type = (_a = EDGE_TYPE_MAP[def.lineStyle]) != null ? _a : "default";
864
- }
865
- styled.style = __spreadValues(__spreadValues(__spreadValues({}, def.color ? { stroke: def.color } : void 0), def.strokeWidth ? { strokeWidth: def.strokeWidth } : void 0), edge.style);
866
- if (styled.animated == null && def.animated) styled.animated = true;
867
- if (!styled.markerStart) {
868
- const startType = toMarkerType(def.markerStart);
869
- if (startType) {
870
- styled.markerStart = __spreadValues({
871
- type: startType
872
- }, def.color ? { color: def.color } : void 0);
873
- }
874
- }
875
- if (!styled.markerEnd) {
876
- const endType = toMarkerType(def.markerEnd);
877
- if (endType) {
878
- styled.markerEnd = __spreadValues({
879
- type: endType
880
- }, def.color ? { color: def.color } : void 0);
881
- }
882
- }
883
- return styled;
884
- });
885
- }
908
+
909
+ // src/ui/Flow/FlowRenderer.tsx
886
910
  function FlowRenderer({
887
911
  data,
888
912
  className,
@@ -920,15 +944,15 @@ function FlowRenderer({
920
944
  maxZoom: maxZoomProp
921
945
  }) {
922
946
  var _a;
923
- const nodeTypeDefsMap = import_react4.default.useMemo(() => {
947
+ const nodeTypeDefsMap = import_react9.default.useMemo(() => {
924
948
  if (!(nodeTypeDefs == null ? void 0 : nodeTypeDefs.length)) return void 0;
925
949
  return new Map(nodeTypeDefs.map((d) => [d.slug, d]));
926
950
  }, [nodeTypeDefs]);
927
- const edgeTypeDefsMap = import_react4.default.useMemo(() => {
951
+ const edgeTypeDefsMap = import_react9.default.useMemo(() => {
928
952
  if (!(edgeTypeDefs == null ? void 0 : edgeTypeDefs.length)) return void 0;
929
953
  return new Map(edgeTypeDefs.map((d) => [d.slug, d]));
930
954
  }, [edgeTypeDefs]);
931
- const nodeTypes = import_react4.default.useMemo(
955
+ const nodeTypes = import_react9.default.useMemo(
932
956
  () => createNodeTypes(
933
957
  nodeRenderers,
934
958
  nodeTypeDefsMap,
@@ -938,15 +962,15 @@ function FlowRenderer({
938
962
  ),
939
963
  [nodeRenderers, nodeTypeDefsMap, frameRenderer, nodeWrapper, renderNode]
940
964
  );
941
- const customEdgeTypes = import_react4.default.useMemo(
965
+ const customEdgeTypes = import_react9.default.useMemo(
942
966
  () => createEdgeTypes(edgeRenderers, edgeTypeDefsMap),
943
967
  [edgeRenderers, edgeTypeDefsMap]
944
968
  );
945
- const mergedCSS = import_react4.default.useMemo(() => {
969
+ const mergedCSS = import_react9.default.useMemo(() => {
946
970
  if (!(nodeTypeDefs == null ? void 0 : nodeTypeDefs.length)) return "";
947
971
  return nodeTypeDefs.filter((d) => d.customCSS).map((d) => d.customCSS).join("\n");
948
972
  }, [nodeTypeDefs]);
949
- const styledEdges = import_react4.default.useMemo(() => {
973
+ const styledEdges = import_react9.default.useMemo(() => {
950
974
  var _a2;
951
975
  let edges = applyEdgeStyles((_a2 = data == null ? void 0 : data.edges) != null ? _a2 : [], edgeTypeDefsMap);
952
976
  if (edgeRenderers) {
@@ -960,7 +984,7 @@ function FlowRenderer({
960
984
  }
961
985
  return edges;
962
986
  }, [data == null ? void 0 : data.edges, edgeTypeDefsMap, edgeRenderers]);
963
- const translateExtent = import_react4.default.useMemo(() => {
987
+ const translateExtent = import_react9.default.useMemo(() => {
964
988
  if (translateExtentProp) return translateExtentProp;
965
989
  const es = clampBounds != null ? clampBounds : bounds;
966
990
  if (!es) return void 0;
@@ -970,9 +994,22 @@ function FlowRenderer({
970
994
  [es.x + es.width * (1 + ep), es.y + es.height * (1 + ep)]
971
995
  ];
972
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;
973
1010
  if (!data) return null;
974
1011
  const resolvedDefaultViewport = defaultViewportProp != null ? defaultViewportProp : !fitView && data.viewport ? data.viewport : void 0;
975
- 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(
976
1013
  "div",
977
1014
  {
978
1015
  className,
@@ -982,8 +1019,8 @@ function FlowRenderer({
982
1019
  background: "transparent"
983
1020
  }, style)
984
1021
  },
985
- /* @__PURE__ */ import_react4.default.createElement(
986
- import_react5.ReactFlow,
1022
+ /* @__PURE__ */ import_react9.default.createElement(
1023
+ import_react10.ReactFlow,
987
1024
  {
988
1025
  nodes: (_a = data.nodes) != null ? _a : [],
989
1026
  edges: styledEdges,
@@ -991,7 +1028,7 @@ function FlowRenderer({
991
1028
  edgeTypes: customEdgeTypes,
992
1029
  defaultViewport: resolvedDefaultViewport,
993
1030
  fitView: bounds ? false : fitView,
994
- translateExtent,
1031
+ translateExtent: activeExtent,
995
1032
  onNodeClick,
996
1033
  onNodeDoubleClick,
997
1034
  onNodeContextMenu,
@@ -1012,16 +1049,16 @@ function FlowRenderer({
1012
1049
  maxZoom: maxZoomProp,
1013
1050
  proOptions: { hideAttribution: true }
1014
1051
  },
1015
- mergedCSS && /* @__PURE__ */ import_react4.default.createElement("style", { dangerouslySetInnerHTML: { __html: mergedCSS } }),
1016
- background && /* @__PURE__ */ import_react4.default.createElement(import_react5.Background, null),
1017
- controls && /* @__PURE__ */ import_react4.default.createElement(import_react5.Controls, null),
1018
- minimap && /* @__PURE__ */ import_react4.default.createElement(
1019
- 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,
1020
1057
  {
1021
1058
  nodeColor: minimapNodeColor
1022
1059
  }
1023
1060
  ),
1024
- bounds && /* @__PURE__ */ import_react4.default.createElement(
1061
+ bounds && /* @__PURE__ */ import_react9.default.createElement(
1025
1062
  FocusHandler,
1026
1063
  {
1027
1064
  bounds,
@@ -1031,7 +1068,8 @@ function FlowRenderer({
1031
1068
  responsive: responsiveFit != null ? responsiveFit : true,
1032
1069
  extent: translateExtent,
1033
1070
  clampBounds,
1034
- minZoomProp
1071
+ minZoomProp,
1072
+ onInitialFit: handleInitialFit
1035
1073
  }
1036
1074
  ),
1037
1075
  children