@almadar/ui 5.146.1 → 5.146.3

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.
@@ -18412,8 +18412,10 @@ var init_CodeBlock = __esm({
18412
18412
  ref: editableTextareaRef,
18413
18413
  defaultValue: code,
18414
18414
  onChange: (e) => {
18415
- setEditableValue(e.target.value);
18416
- onChange?.(e.target.value);
18415
+ const v = e.target.value;
18416
+ lastPropCodeRef.current = v;
18417
+ setEditableValue(v);
18418
+ onChange?.(v);
18417
18419
  },
18418
18420
  onScroll: handleEditableScroll,
18419
18421
  spellCheck: false,
@@ -55861,7 +55863,9 @@ function FlowCanvasInner({
55861
55863
  behaviorEntries,
55862
55864
  behaviorWires,
55863
55865
  userType = "builder",
55864
- themeManifest
55866
+ themeManifest,
55867
+ nodePositions,
55868
+ onPositionsChange
55865
55869
  }) {
55866
55870
  const { t } = hooks.useTranslate();
55867
55871
  const NODE_TYPES2 = React94.useMemo(() => ({
@@ -55948,9 +55952,15 @@ function FlowCanvasInner({
55948
55952
  const [nodes, setNodes, onNodesChange] = react.useNodesState(activeNodes);
55949
55953
  const [edges, setEdges, onEdgesChange] = react.useEdgesState(activeEdges);
55950
55954
  const reactFlow = react.useReactFlow();
55955
+ const savedPositionsRef = React94__namespace.default.useRef(nodePositions);
55956
+ savedPositionsRef.current = nodePositions;
55957
+ const nodesRef = React94__namespace.default.useRef(nodes);
55958
+ nodesRef.current = nodes;
55951
55959
  React94.useEffect(() => {
55952
55960
  setEdges([]);
55953
- setNodes(activeNodes);
55961
+ const saved = savedPositionsRef.current;
55962
+ const merged = saved ? activeNodes.map((n) => saved[n.id] ? { ...n, position: saved[n.id] } : n) : activeNodes;
55963
+ setNodes(merged);
55954
55964
  setEdges(activeEdges);
55955
55965
  requestAnimationFrame(() => {
55956
55966
  reactFlow.fitView({ duration: 300, padding: 0.25 });
@@ -56100,6 +56110,14 @@ function FlowCanvasInner({
56100
56110
  targetTraitName: tgtData.traitName
56101
56111
  });
56102
56112
  }, [nodes, onEventWire, eventBus]);
56113
+ const handleNodeDragStop = React94.useCallback(() => {
56114
+ if (!onPositionsChange) return;
56115
+ const positions = {};
56116
+ for (const n of nodesRef.current) {
56117
+ positions[n.id] = { x: n.position.x, y: n.position.y };
56118
+ }
56119
+ onPositionsChange(positions);
56120
+ }, [onPositionsChange]);
56103
56121
  const screenSizeKeys = ["mobile", "tablet", "laptop", "wide"];
56104
56122
  const traitCardSelectionValue = React94.useMemo(() => ({
56105
56123
  selectTransition: (sel) => {
@@ -56131,6 +56149,7 @@ function FlowCanvasInner({
56131
56149
  onNodeDoubleClick: handleNodeDoubleClick,
56132
56150
  onNodeClick: handleNodeClick,
56133
56151
  onConnect: handleConnect,
56152
+ onNodeDragStop: handleNodeDragStop,
56134
56153
  minZoom: 0.1,
56135
56154
  maxZoom: 2,
56136
56155
  fitView: true,
@@ -1655,6 +1655,24 @@ interface FlowCanvasProps {
1655
1655
  * originates from the synthesized `__design_system__` schema.
1656
1656
  */
1657
1657
  themeManifest?: ThemeDefinition;
1658
+ /**
1659
+ * Persisted node positions keyed by node id. When the node set changes
1660
+ * (level/schema switch), any id present here overrides the computed layout
1661
+ * position, restoring a user's manual drag arrangement. Node ids are unique
1662
+ * per view level, so a single flat map covers overview + expanded.
1663
+ */
1664
+ nodePositions?: Record<string, {
1665
+ x: number;
1666
+ y: number;
1667
+ }>;
1668
+ /**
1669
+ * Fired on node drag-stop with the full {id → position} map of the current
1670
+ * node set, so the consumer can persist the arrangement across reloads.
1671
+ */
1672
+ onPositionsChange?: (positions: Record<string, {
1673
+ x: number;
1674
+ y: number;
1675
+ }>) => void;
1658
1676
  }
1659
1677
  declare const FlowCanvas: React__default.FC<FlowCanvasProps>;
1660
1678
 
@@ -1655,6 +1655,24 @@ interface FlowCanvasProps {
1655
1655
  * originates from the synthesized `__design_system__` schema.
1656
1656
  */
1657
1657
  themeManifest?: ThemeDefinition;
1658
+ /**
1659
+ * Persisted node positions keyed by node id. When the node set changes
1660
+ * (level/schema switch), any id present here overrides the computed layout
1661
+ * position, restoring a user's manual drag arrangement. Node ids are unique
1662
+ * per view level, so a single flat map covers overview + expanded.
1663
+ */
1664
+ nodePositions?: Record<string, {
1665
+ x: number;
1666
+ y: number;
1667
+ }>;
1668
+ /**
1669
+ * Fired on node drag-stop with the full {id → position} map of the current
1670
+ * node set, so the consumer can persist the arrangement across reloads.
1671
+ */
1672
+ onPositionsChange?: (positions: Record<string, {
1673
+ x: number;
1674
+ y: number;
1675
+ }>) => void;
1658
1676
  }
1659
1677
  declare const FlowCanvas: React__default.FC<FlowCanvasProps>;
1660
1678
 
package/dist/avl/index.js CHANGED
@@ -18336,8 +18336,10 @@ var init_CodeBlock = __esm({
18336
18336
  ref: editableTextareaRef,
18337
18337
  defaultValue: code,
18338
18338
  onChange: (e) => {
18339
- setEditableValue(e.target.value);
18340
- onChange?.(e.target.value);
18339
+ const v = e.target.value;
18340
+ lastPropCodeRef.current = v;
18341
+ setEditableValue(v);
18342
+ onChange?.(v);
18341
18343
  },
18342
18344
  onScroll: handleEditableScroll,
18343
18345
  spellCheck: false,
@@ -55785,7 +55787,9 @@ function FlowCanvasInner({
55785
55787
  behaviorEntries,
55786
55788
  behaviorWires,
55787
55789
  userType = "builder",
55788
- themeManifest
55790
+ themeManifest,
55791
+ nodePositions,
55792
+ onPositionsChange
55789
55793
  }) {
55790
55794
  const { t } = useTranslate();
55791
55795
  const NODE_TYPES2 = useMemo(() => ({
@@ -55872,9 +55876,15 @@ function FlowCanvasInner({
55872
55876
  const [nodes, setNodes, onNodesChange] = useNodesState(activeNodes);
55873
55877
  const [edges, setEdges, onEdgesChange] = useEdgesState(activeEdges);
55874
55878
  const reactFlow = useReactFlow();
55879
+ const savedPositionsRef = React94__default.useRef(nodePositions);
55880
+ savedPositionsRef.current = nodePositions;
55881
+ const nodesRef = React94__default.useRef(nodes);
55882
+ nodesRef.current = nodes;
55875
55883
  useEffect(() => {
55876
55884
  setEdges([]);
55877
- setNodes(activeNodes);
55885
+ const saved = savedPositionsRef.current;
55886
+ const merged = saved ? activeNodes.map((n) => saved[n.id] ? { ...n, position: saved[n.id] } : n) : activeNodes;
55887
+ setNodes(merged);
55878
55888
  setEdges(activeEdges);
55879
55889
  requestAnimationFrame(() => {
55880
55890
  reactFlow.fitView({ duration: 300, padding: 0.25 });
@@ -56024,6 +56034,14 @@ function FlowCanvasInner({
56024
56034
  targetTraitName: tgtData.traitName
56025
56035
  });
56026
56036
  }, [nodes, onEventWire, eventBus]);
56037
+ const handleNodeDragStop = useCallback(() => {
56038
+ if (!onPositionsChange) return;
56039
+ const positions = {};
56040
+ for (const n of nodesRef.current) {
56041
+ positions[n.id] = { x: n.position.x, y: n.position.y };
56042
+ }
56043
+ onPositionsChange(positions);
56044
+ }, [onPositionsChange]);
56027
56045
  const screenSizeKeys = ["mobile", "tablet", "laptop", "wide"];
56028
56046
  const traitCardSelectionValue = useMemo(() => ({
56029
56047
  selectTransition: (sel) => {
@@ -56055,6 +56073,7 @@ function FlowCanvasInner({
56055
56073
  onNodeDoubleClick: handleNodeDoubleClick,
56056
56074
  onNodeClick: handleNodeClick,
56057
56075
  onConnect: handleConnect,
56076
+ onNodeDragStop: handleNodeDragStop,
56058
56077
  minZoom: 0.1,
56059
56078
  maxZoom: 2,
56060
56079
  fitView: true,
@@ -11122,8 +11122,10 @@ var init_CodeBlock = __esm({
11122
11122
  ref: editableTextareaRef,
11123
11123
  defaultValue: code,
11124
11124
  onChange: (e) => {
11125
- setEditableValue(e.target.value);
11126
- onChange?.(e.target.value);
11125
+ const v = e.target.value;
11126
+ lastPropCodeRef.current = v;
11127
+ setEditableValue(v);
11128
+ onChange?.(v);
11127
11129
  },
11128
11130
  onScroll: handleEditableScroll,
11129
11131
  spellCheck: false,
@@ -11047,8 +11047,10 @@ var init_CodeBlock = __esm({
11047
11047
  ref: editableTextareaRef,
11048
11048
  defaultValue: code,
11049
11049
  onChange: (e) => {
11050
- setEditableValue(e.target.value);
11051
- onChange?.(e.target.value);
11050
+ const v = e.target.value;
11051
+ lastPropCodeRef.current = v;
11052
+ setEditableValue(v);
11053
+ onChange?.(v);
11052
11054
  },
11053
11055
  onScroll: handleEditableScroll,
11054
11056
  spellCheck: false,
@@ -16147,8 +16147,10 @@ var init_CodeBlock = __esm({
16147
16147
  ref: editableTextareaRef,
16148
16148
  defaultValue: code,
16149
16149
  onChange: (e) => {
16150
- setEditableValue(e.target.value);
16151
- onChange?.(e.target.value);
16150
+ const v = e.target.value;
16151
+ lastPropCodeRef.current = v;
16152
+ setEditableValue(v);
16153
+ onChange?.(v);
16152
16154
  },
16153
16155
  onScroll: handleEditableScroll,
16154
16156
  spellCheck: false,
@@ -16073,8 +16073,10 @@ var init_CodeBlock = __esm({
16073
16073
  ref: editableTextareaRef,
16074
16074
  defaultValue: code,
16075
16075
  onChange: (e) => {
16076
- setEditableValue(e.target.value);
16077
- onChange?.(e.target.value);
16076
+ const v = e.target.value;
16077
+ lastPropCodeRef.current = v;
16078
+ setEditableValue(v);
16079
+ onChange?.(v);
16078
16080
  },
16079
16081
  onScroll: handleEditableScroll,
16080
16082
  spellCheck: false,
@@ -15851,8 +15851,10 @@ var init_CodeBlock = __esm({
15851
15851
  ref: editableTextareaRef,
15852
15852
  defaultValue: code,
15853
15853
  onChange: (e) => {
15854
- setEditableValue(e.target.value);
15855
- onChange?.(e.target.value);
15854
+ const v = e.target.value;
15855
+ lastPropCodeRef.current = v;
15856
+ setEditableValue(v);
15857
+ onChange?.(v);
15856
15858
  },
15857
15859
  onScroll: handleEditableScroll,
15858
15860
  spellCheck: false,
@@ -15777,8 +15777,10 @@ var init_CodeBlock = __esm({
15777
15777
  ref: editableTextareaRef,
15778
15778
  defaultValue: code,
15779
15779
  onChange: (e) => {
15780
- setEditableValue(e.target.value);
15781
- onChange?.(e.target.value);
15780
+ const v = e.target.value;
15781
+ lastPropCodeRef.current = v;
15782
+ setEditableValue(v);
15783
+ onChange?.(v);
15782
15784
  },
15783
15785
  onScroll: handleEditableScroll,
15784
15786
  spellCheck: false,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "5.146.1",
3
+ "version": "5.146.3",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "sideEffects": [