+
You can save and load your graph here.
+
+
+ );
+}
diff --git a/src/utils/SaveLoad.ts b/src/utils/SaveLoad.ts
new file mode 100644
index 0000000..4ea9666
--- /dev/null
+++ b/src/utils/SaveLoad.ts
@@ -0,0 +1,19 @@
+import {type Edge, type Node } from "@xyflow/react";
+
+export type SavedProject = {
+ name: string;
+ savedASavedProject: string; // ISO timestamp
+ nodes: Node[];
+ edges: Edge[];
+};
+
+// Creates a JSON Blob containing the current visual program (nodes + edges)
+export function makeProjectBlob(name: string, nodes: Node[], edges: Edge[]): Blob {
+ const payload = {
+ name,
+ savedAt: new Date().toISOString(),
+ nodes,
+ edges,
+ };
+ return new Blob([JSON.stringify(payload, null, 2)], { type: "application/json" });
+}
\ No newline at end of file
diff --git a/test/pages/visProgPage/visualProgrammingUI/components/SaveLoadPanel.test.tsx b/test/pages/visProgPage/visualProgrammingUI/components/SaveLoadPanel.test.tsx
new file mode 100644
index 0000000..9d85323
--- /dev/null
+++ b/test/pages/visProgPage/visualProgrammingUI/components/SaveLoadPanel.test.tsx
@@ -0,0 +1,154 @@
+// SaveLoadPanel.all.test.tsx
+import { act, fireEvent, render, screen, waitFor } from '@testing-library/react';
+import useFlowStore from '../../../../../src/pages/VisProgPage/visualProgrammingUI/VisProgStores.tsx';
+import SaveLoadPanel from '../../../../../src/pages/VisProgPage/visualProgrammingUI/components/SaveLoadPanel.tsx';
+import { makeProjectBlob } from '../../../../../src/utils/SaveLoad.ts';
+import { mockReactFlow } from "../../../../setupFlowTests.ts"; // optional helper if present
+
+// helper to read Blob contents in tests (works in Node/Jest env)
+async function blobToText(blob: Blob): Promise