diff --git a/apps/cloud/package.json b/apps/cloud/package.json
index 73d6ae9d4a..a2fcff60cb 100644
--- a/apps/cloud/package.json
+++ b/apps/cloud/package.json
@@ -61,6 +61,7 @@
"drizzle-orm": "catalog:",
"effect": "catalog:",
"jose": "^5.6.3",
+ "lucide-react": "^1.7.0",
"postgres": "^3.4.9",
"react": "catalog:",
"react-dom": "catalog:",
diff --git a/apps/cloud/src/web/shell.tsx b/apps/cloud/src/web/shell.tsx
index 70cc935fda..7aeec7faf8 100644
--- a/apps/cloud/src/web/shell.tsx
+++ b/apps/cloud/src/web/shell.tsx
@@ -2,6 +2,12 @@ import { Link, Outlet, useLocation } from "@tanstack/react-router";
import { useEffect, useRef, useState } from "react";
import { useAtomValue, useAtomSet, Result } from "@effect-atom/atom-react";
import { useSourcesWithPending } from "@executor/react/api/optimistic";
+import {
+ CheckIcon,
+ ChevronDownIcon,
+ MenuIcon,
+ XIcon,
+} from "lucide-react";
import { useScope } from "@executor/react/api/scope-context";
import { Button } from "@executor/react/components/button";
import { Skeleton } from "@executor/react/components/skeleton";
@@ -51,9 +57,9 @@ function NavItem(props: { to: string; label: string; active: boolean; onNavigate
to={props.to}
onClick={props.onNavigate}
className={[
- "flex items-center gap-2.5 rounded-md px-2.5 py-1.5 text-sm transition-colors",
+ "flex items-center gap-2.5 rounded-md px-2.5 py-1.5 text-sm",
props.active
- ? "bg-sidebar-active text-foreground font-medium"
+ ? "bg-sidebar-active text-foreground"
: "text-sidebar-foreground hover:bg-sidebar-active/60 hover:text-foreground",
].join(" ")}
>
@@ -80,7 +86,7 @@ function SourceList(props: { pathname: string; onNavigate?: () => void }) {
),
onFailure: () => (
-
No sources yet
+ No sources yet
),
onSuccess: ({ value }) =>
value.length === 0 ? (
@@ -100,15 +106,15 @@ function SourceList(props: { pathname: string; onNavigate?: () => void }) {
params={{ namespace: s.id }}
onClick={props.onNavigate}
className={[
- "group flex items-center gap-2 rounded-md px-2.5 py-1.5 text-xs transition-colors",
+ "group flex items-center gap-2 rounded-md px-2.5 py-1.5 text-sm",
active
- ? "bg-sidebar-active text-foreground font-medium"
+ ? "bg-sidebar-active text-foreground"
: "text-sidebar-foreground hover:bg-sidebar-active/60 hover:text-foreground",
].join(" ")}
>
{s.name}
-
+
{s.kind}
@@ -176,7 +182,7 @@ function OrganizationSwitcherItems(props: { activeOrganizationId: string | null
className="text-xs"
>
{organization.name}
- {isActive && }
+ {isActive && }
);
})}
@@ -185,20 +191,6 @@ function OrganizationSwitcherItems(props: { activeOrganizationId: string | null
});
}
-function CheckIcon() {
- return (
-
- );
-}
-
function UserFooter() {
const auth = useAuth();
const [createOrganizationOpen, setCreateOrganizationOpen] = useState(false);
@@ -244,26 +236,14 @@ function UserFooter() {
email={auth.user.email}
/>
-
+
{auth.user.name ?? auth.user.email}
{auth.organization && (
{auth.organization.name}
)}
-
+
@@ -362,6 +342,7 @@ function SidebarContent(props: { pathname: string; onNavigate?: () => void; show
const isSecrets = props.pathname === "/secrets";
const isBilling = props.pathname === "/billing" || props.pathname.startsWith("/billing/");
const isOrg = props.pathname === "/org";
+ const isSourcesList = props.pathname === "/sources";
return (
<>
@@ -373,15 +354,22 @@ function SidebarContent(props: { pathname: string; onNavigate?: () => void; show
)}
-