diff --git a/packages/builder/src/pages/builder/portal/_layout.svelte b/packages/builder/src/pages/builder/portal/_layout.svelte
index 9459eefff1..ad172e34ca 100644
--- a/packages/builder/src/pages/builder/portal/_layout.svelte
+++ b/packages/builder/src/pages/builder/portal/_layout.svelte
@@ -101,7 +101,7 @@
justify-content: flex-start;
align-items: center;
border-bottom: var(--border-light);
- padding: 0 24px;
+ padding: 0 var(--spacing-l);
gap: 24px;
position: relative;
}
diff --git a/packages/builder/src/pages/builder/portal/apps/[appId]/_layout.svelte b/packages/builder/src/pages/builder/portal/apps/[appId]/_layout.svelte
new file mode 100644
index 0000000000..f1ed686a3a
--- /dev/null
+++ b/packages/builder/src/pages/builder/portal/apps/[appId]/_layout.svelte
@@ -0,0 +1,15 @@
+
+
+{#if app}
+
+{/if}
diff --git a/packages/builder/src/pages/builder/portal/apps/[appId]/index.svelte b/packages/builder/src/pages/builder/portal/apps/[appId]/index.svelte
new file mode 100644
index 0000000000..6b24ddef1a
--- /dev/null
+++ b/packages/builder/src/pages/builder/portal/apps/[appId]/index.svelte
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
diff --git a/packages/builder/src/pages/builder/portal/apps/_components/PortalSideBar.svelte b/packages/builder/src/pages/builder/portal/apps/_components/PortalSideBar.svelte
new file mode 100644
index 0000000000..1e21bd7a9a
--- /dev/null
+++ b/packages/builder/src/pages/builder/portal/apps/_components/PortalSideBar.svelte
@@ -0,0 +1,140 @@
+
+
+
+
+ {#if searching}
+
+ {:else}
+ Apps
+
+ {/if}
+
+ $goto("./create")}
+ />
+
+
+
+ $goto("./")}
+ selected={!$params.appId}
+ />
+ {#each filteredApps as app}
+ $goto(`./${app.appId}`)}
+ />
+ {/each}
+
+
+
+
diff --git a/packages/builder/src/pages/builder/portal/apps/_layout.svelte b/packages/builder/src/pages/builder/portal/apps/_layout.svelte
index bf0bca0df4..c4a0bfd913 100644
--- a/packages/builder/src/pages/builder/portal/apps/_layout.svelte
+++ b/packages/builder/src/pages/builder/portal/apps/_layout.svelte
@@ -11,6 +11,7 @@
import { onMount } from "svelte"
import { redirect } from "@roxi/routify"
import { sdk } from "@budibase/shared-core"
+ import PortalSideBar from "./_components/PortalSideBar.svelte"
// Don't block loading if we've already hydrated state
let loaded = $apps.length != null
@@ -44,5 +45,18 @@
{#if loaded}
-
+
{/if}
+
+
diff --git a/packages/builder/src/stores/portal/index.js b/packages/builder/src/stores/portal/index.js
index a7c430e621..e70df5c3ee 100644
--- a/packages/builder/src/stores/portal/index.js
+++ b/packages/builder/src/stores/portal/index.js
@@ -1,3 +1,5 @@
+import { writable } from "svelte/store"
+
export { organisation } from "./organisation"
export { users } from "./users"
export { admin } from "./admin"
@@ -14,3 +16,5 @@ export { environment } from "./environment"
export { menu } from "./menu"
export { auditLogs } from "./auditLogs"
export { features } from "./features"
+
+export const sideBarCollapsed = writable(false)