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 )} -