diff --git a/src/Terrabuild.UI/src/App.tsx b/src/Terrabuild.UI/src/App.tsx
index e0d466f2..ede54f05 100644
--- a/src/Terrabuild.UI/src/App.tsx
+++ b/src/Terrabuild.UI/src/App.tsx
@@ -1,6 +1,5 @@
import { useEffect, useMemo, useRef, useState } from "react";
import {
- AppShell,
Box,
Stack,
rgba,
@@ -30,6 +29,7 @@ import BuildDetailsPanel from "./components/BuildDetailsPanel";
import BuildLogPanel from "./components/BuildLogPanel";
import GraphPanel from "./components/GraphPanel";
import NodeDetailsPanel from "./components/NodeDetailsPanel";
+import SidebarLayout from "./components/SidebarLayout";
import SidebarHeader from "./components/SidebarHeader";
import {
GraphNode,
@@ -870,44 +870,41 @@ const App = () => {
: "Build Log";
return (
-
-
+ mainStyle={{ minHeight: 0 }}
+ sidebar={
+ <>
+
+
+
+
-
-
-
-
{
/>
-
-
-
-
- {
- flowInstance.current = instance;
- }}
- onNodesChange={handleNodesChange}
- onEdgesChange={onEdgesChange}
- onNodeClick={(_, node) =>
- loadProjectResults(node.data.meta as ProjectNode)
- }
- onNodeDragStart={(_, node) => setDraggedNodeId(node.id)}
- onNodeDragStop={() => setDraggedNodeId(null)}
- onReflow={() => {
- setManualPositions({});
- setLayoutVersion((value) => value + 1);
- }}
- />
-
-
- setShowTerminal(false)}
- terminalRef={terminalRef}
- background={terminalBackground}
+ >
+ }
+ >
+
+
+ {
+ flowInstance.current = instance;
+ }}
+ onNodesChange={handleNodesChange}
+ onEdgesChange={onEdgesChange}
+ onNodeClick={(_, node) =>
+ loadProjectResults(node.data.meta as ProjectNode)
+ }
+ onNodeDragStart={(_, node) => setDraggedNodeId(node.id)}
+ onNodeDragStop={() => setDraggedNodeId(null)}
+ onReflow={() => {
+ setManualPositions({});
+ setLayoutVersion((value) => value + 1);
+ }}
/>
-
-
+
+ setShowTerminal(false)}
+ terminalRef={terminalRef}
+ background={terminalBackground}
+ />
+
+
);
};
diff --git a/src/Terrabuild.UI/src/components/SidebarLayout.tsx b/src/Terrabuild.UI/src/components/SidebarLayout.tsx
new file mode 100644
index 00000000..1d6d070e
--- /dev/null
+++ b/src/Terrabuild.UI/src/components/SidebarLayout.tsx
@@ -0,0 +1,56 @@
+import { type CSSProperties, type ReactNode } from "react";
+import { Box, type MantineSpacing } from "@mantine/core";
+
+type SidebarLayoutProps = {
+ sidebar: ReactNode;
+ children: ReactNode;
+ sidebarWidth?: number;
+ sidebarPadding?: MantineSpacing;
+ mainPadding?: MantineSpacing;
+ sidebarStyle?: CSSProperties;
+ mainStyle?: CSSProperties;
+};
+
+const SidebarLayout = ({
+ sidebar,
+ children,
+ sidebarWidth = 360,
+ sidebarPadding = "md",
+ mainPadding = "md",
+ sidebarStyle,
+ mainStyle,
+}: SidebarLayoutProps) => {
+ return (
+
+
+ {sidebar}
+
+
+ {children}
+
+
+ );
+};
+
+export default SidebarLayout;