Merge pull request #4012 from Dokploy/3979-collapsed-sidebar-state-has-usability-and-visual-issues

3979 collapsed sidebar state has usability and visual issues
This commit is contained in:
Mauricio Siu
2026-03-16 15:34:05 -06:00
committed by GitHub
4 changed files with 23 additions and 27 deletions
@@ -169,11 +169,6 @@ export const ShowProjects = () => {
<BreadcrumbSidebar <BreadcrumbSidebar
list={[{ name: "Projects", href: "/dashboard/projects" }]} list={[{ name: "Projects", href: "/dashboard/projects" }]}
/> />
{!isCloud && (
<div className="absolute top-4 right-4">
<TimeBadge />
</div>
)}
<div className="w-full"> <div className="w-full">
<Card className="h-full bg-sidebar p-2.5 rounded-xl "> <Card className="h-full bg-sidebar p-2.5 rounded-xl ">
<div className="rounded-xl bg-background shadow-md "> <div className="rounded-xl bg-background shadow-md ">
+13 -19
View File
@@ -545,6 +545,7 @@ function SidebarLogo() {
const { mutateAsync: setDefaultOrganization, isPending: isSettingDefault } = const { mutateAsync: setDefaultOrganization, isPending: isSettingDefault } =
api.organization.setDefault.useMutation(); api.organization.setDefault.useMutation();
const { isMobile } = useSidebar(); const { isMobile } = useSidebar();
const isCollapsed = state === "collapsed" && !isMobile;
const { data: activeOrganization } = api.organization.active.useQuery(); const { data: activeOrganization } = api.organization.active.useQuery();
const { data: invitations, refetch: refetchInvitations } = const { data: invitations, refetch: refetchInvitations } =
@@ -570,9 +571,7 @@ function SidebarLogo() {
<SidebarMenu <SidebarMenu
className={cn( className={cn(
"flex gap-2", "flex gap-2",
state === "collapsed" isCollapsed ? "flex-col" : "flex-row justify-between items-center",
? "flex-col"
: "flex-row justify-between items-center",
)} )}
> >
{/* Organization Logo and Selector */} {/* Organization Logo and Selector */}
@@ -580,17 +579,17 @@ function SidebarLogo() {
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger asChild> <DropdownMenuTrigger asChild>
<SidebarMenuButton <SidebarMenuButton
size={state === "collapsed" ? "sm" : "lg"} size={isCollapsed ? "sm" : "lg"}
className={cn( className={cn(
"data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground", "data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground",
state === "collapsed" && isCollapsed &&
"flex justify-center items-center p-2 h-10 w-10 mx-auto", "flex justify-center items-center p-2 h-10 w-10 mx-auto",
)} )}
> >
<div <div
className={cn( className={cn(
"flex items-center gap-2", "flex items-center gap-2",
state === "collapsed" && "justify-center", isCollapsed && "justify-center",
)} )}
> >
<div <div
@@ -602,7 +601,7 @@ function SidebarLogo() {
<Logo <Logo
className={cn( className={cn(
"transition-all", "transition-all",
state === "collapsed" ? "size-4" : "size-5", isCollapsed ? "size-4" : "size-5",
)} )}
logoUrl={activeOrganization?.logo || undefined} logoUrl={activeOrganization?.logo || undefined}
/> />
@@ -610,7 +609,7 @@ function SidebarLogo() {
<div <div
className={cn( className={cn(
"flex flex-col items-start", "flex flex-col items-start",
state === "collapsed" && "hidden", isCollapsed && "hidden",
)} )}
> >
<p className="text-sm font-medium leading-none"> <p className="text-sm font-medium leading-none">
@@ -619,7 +618,7 @@ function SidebarLogo() {
</div> </div>
</div> </div>
<ChevronsUpDown <ChevronsUpDown
className={cn("ml-auto", state === "collapsed" && "hidden")} className={cn("ml-auto", isCollapsed && "hidden")}
/> />
</SidebarMenuButton> </SidebarMenuButton>
</DropdownMenuTrigger> </DropdownMenuTrigger>
@@ -768,7 +767,7 @@ function SidebarLogo() {
</SidebarMenuItem> </SidebarMenuItem>
{/* Notification Bell */} {/* Notification Bell */}
<SidebarMenuItem className={cn(state === "collapsed" && "mt-2")}> <SidebarMenuItem className={cn(isCollapsed && "mt-2")}>
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger asChild> <DropdownMenuTrigger asChild>
<Button <Button
@@ -776,7 +775,7 @@ function SidebarLogo() {
size="icon" size="icon"
className={cn( className={cn(
"relative", "relative",
state === "collapsed" && "h-8 w-8 p-1.5 mx-auto", isCollapsed && "h-8 w-8 p-1.5 mx-auto",
)} )}
> >
<Bell className="size-4" /> <Bell className="size-4" />
@@ -1145,14 +1144,9 @@ export default function Page({ children }: Props) {
</div> </div>
)} )}
{dokployVersion && ( {dokployVersion && (
<> <div className="px-3 text-xs text-muted-foreground text-center group-data-[collapsible=icon]:hidden">
<div className="px-3 text-xs text-muted-foreground text-center group-data-[collapsible=icon]:hidden"> Version {dokployVersion}
Version {dokployVersion} </div>
</div>
<div className="hidden text-xs text-muted-foreground text-center group-data-[collapsible=icon]:block">
{dokployVersion}
</div>
</>
)} )}
</SidebarMenu> </SidebarMenu>
</SidebarFooter> </SidebarFooter>
@@ -17,6 +17,8 @@ import {
} from "@/components/ui/dropdown-menu"; } from "@/components/ui/dropdown-menu";
import { Separator } from "@/components/ui/separator"; import { Separator } from "@/components/ui/separator";
import { SidebarTrigger } from "@/components/ui/sidebar"; import { SidebarTrigger } from "@/components/ui/sidebar";
import { TimeBadge } from "@/components/ui/time-badge";
import { api } from "@/utils/api";
interface BreadcrumbEntry { interface BreadcrumbEntry {
name: string; name: string;
@@ -32,9 +34,11 @@ interface Props {
} }
export const BreadcrumbSidebar = ({ list }: Props) => { export const BreadcrumbSidebar = ({ list }: Props) => {
const { data: isCloud } = api.settings.isCloud.useQuery();
return ( return (
<header className="flex h-16 shrink-0 items-center gap-2 transition-[width,height] ease-linear group-has-[[data-collapsible=icon]]/sidebar-wrapper:h-12"> <header className="flex h-16 shrink-0 items-center gap-2 transition-[width,height] ease-linear group-has-[[data-collapsible=icon]]/sidebar-wrapper:h-12">
<div className="flex items-center justify-between w-full"> <div className="flex items-center justify-between w-full px-4">
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<SidebarTrigger className="-ml-1" /> <SidebarTrigger className="-ml-1" />
<Separator orientation="vertical" className="mr-2 h-4" /> <Separator orientation="vertical" className="mr-2 h-4" />
@@ -75,6 +79,7 @@ export const BreadcrumbSidebar = ({ list }: Props) => {
</BreadcrumbList> </BreadcrumbList>
</Breadcrumb> </Breadcrumb>
</div> </div>
{!isCloud && <TimeBadge />}
</div> </div>
</header> </header>
); );
+4 -2
View File
@@ -213,7 +213,9 @@ const Sidebar = React.forwardRef<
} }
side={side} side={side}
> >
<div className="flex h-full w-full flex-col">{children}</div> <div className="flex h-full w-full flex-col overflow-hidden">
{children}
</div>
</SheetContent> </SheetContent>
</Sheet> </Sheet>
); );
@@ -412,7 +414,7 @@ const SidebarContent = React.forwardRef<
ref={ref} ref={ref}
data-sidebar="content" data-sidebar="content"
className={cn( className={cn(
"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden", "flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-y-auto",
className, className,
)} )}
{...props} {...props}