+
+
+
+
+
+ {data.immutable ? (
+ <>
+
{data.title}
+
Managed by Hexclave
+ >
+ ) : (
+
updateNodeData(id, { title: event.target.value })}
+ size="sm"
+ value={data.title}
+ />
+ )}
+
+ {!data.immutable && (
+
{
+ await deleteElements({ nodes: [{ id }] });
+ }}
+ size="icon"
+ variant="ghost"
+ >
+
+
+ )}
+
+
+ {data.inputs.length > 0 && (
+
+ {data.inputs.map((input) => (
+ updateInputLabel(input.id, label)}
+ onValueChange={(value) => updateInput(input.id, value)}
+ />
+ ))}
+
+ )}
+
+ {data.outputs.length > 0 && (
+
+ {data.outputs.map((output) => (
+
+ ))}
+
+ )}
+
+ {data.kind !== "hexclave" && (
+
+
+
+ {data.kind === "public-internet" ? "Add domain" : "Add environment variable"}
+
+
+ )}
+
+ );
+}
diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/deployments/page-client.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/deployments/page-client.tsx
new file mode 100644
index 000000000..df03300c6
--- /dev/null
+++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/deployments/page-client.tsx
@@ -0,0 +1,23 @@
+"use client";
+
+import { AppEnabledGuard } from "../app-enabled-guard";
+import { PageLayout } from "../page-layout";
+import { useAdminApp } from "../use-admin-app";
+import { DeploymentGraph } from "./deployment-graph";
+
+export default function PageClient() {
+ const project = useAdminApp().useProject();
+
+ return (
+ Deployments turns your project architecture into a visual, connected service graph.
+ Map compute, databases, public domains, environment variables, and Hexclave credentials in one place.
+ >
+ ),
+ },
} as const satisfies Record