diff --git a/app/client/components/app-sidebar.tsx b/app/client/components/app-sidebar.tsx index 317e5cea..6c5f301f 100644 --- a/app/client/components/app-sidebar.tsx +++ b/app/client/components/app-sidebar.tsx @@ -53,6 +53,8 @@ export function AppSidebar() { const { updates, hasUpdate } = useUpdates(); const [showReleaseNotes, setShowReleaseNotes] = useState(false); + const isCollapsed = state === "collapsed"; + const displayVersion = APP_VERSION.startsWith("v") || APP_VERSION === "dev" ? APP_VERSION : `v${APP_VERSION}`; const releaseUrl = APP_VERSION === "dev" @@ -66,7 +68,7 @@ export function AppSidebar() { Zerobyte Logo Zerobyte @@ -82,18 +84,43 @@ export function AppSidebar() { - - isMobile && setOpenMobile(false)}> + + isMobile && setOpenMobile(false)} + activeProps={{ className: "bg-strong-accent/10" }} + className="w-full flex items-center gap-2" + > {({ isActive }) => ( <> - - {item.title} + {isActive && ( +
+ )} + + + {item.title} + )} - +

{item.title}

diff --git a/app/client/components/grid-background.tsx b/app/client/components/grid-background.tsx index 649ddffd..5c46461e 100644 --- a/app/client/components/grid-background.tsx +++ b/app/client/components/grid-background.tsx @@ -9,16 +9,17 @@ interface GridBackgroundProps { export function GridBackground({ children, className, containerClassName }: GridBackgroundProps) { return ( -
-
{children}
+
+
+
{children}
); } diff --git a/app/client/components/layout.tsx b/app/client/components/layout.tsx index 8593e31d..804c0c36 100644 --- a/app/client/components/layout.tsx +++ b/app/client/components/layout.tsx @@ -1,4 +1,4 @@ -import { LifeBuoy } from "lucide-react"; +import { LifeBuoy, LogOut } from "lucide-react"; import { toast } from "sonner"; import { type AppContext } from "~/context"; import { GridBackground } from "./grid-background"; @@ -9,6 +9,7 @@ import { authClient } from "../lib/auth-client"; import { DevPanelListener } from "./dev-panel-listener"; import { Outlet, useNavigate } from "@tanstack/react-router"; import { AppBreadcrumb } from "./app-breadcrumb"; +import { Tooltip, TooltipContent, TooltipTrigger } from "./ui/tooltip"; type Props = { loaderData: AppContext; @@ -34,34 +35,49 @@ export function Layout({ loaderData }: Props) {
-
-
+
+
{loaderData.user && ( -
- - Welcome,  - {loaderData.user?.username} +
+ + {loaderData.user?.username} - - + + + + + Logout + + + + + + Report an issue +
)}
diff --git a/app/client/components/onoff.tsx b/app/client/components/onoff.tsx index 8161bc32..7fe95082 100644 --- a/app/client/components/onoff.tsx +++ b/app/client/components/onoff.tsx @@ -15,7 +15,7 @@ export const OnOff = ({ isOn, toggle, enabledLabel, disabledLabel, disabled }: P className={cn( "flex items-center gap-2 rounded-full border px-3 py-1.5 text-xs font-semibold uppercase tracking-wide transition-colors", isOn - ? "border-green-200 bg-green-50 text-green-700 dark:border-green-500/40 dark:bg-green-500/10 dark:text-green-200" + ? "border-emerald-200 bg-emerald-50 text-emerald-700 dark:border-emerald-500/40 dark:bg-emerald-500/10 dark:text-emerald-200" : "border-muted bg-muted/40 text-muted-foreground dark:border-muted/60 dark:bg-muted/10", )} > diff --git a/app/client/components/status-dot.tsx b/app/client/components/status-dot.tsx index 19a42c44..a1a67cdf 100644 --- a/app/client/components/status-dot.tsx +++ b/app/client/components/status-dot.tsx @@ -12,7 +12,7 @@ interface StatusDotProps { export const StatusDot = ({ variant, label, animated }: StatusDotProps) => { const statusMapping = { success: { - color: "bg-green-500", + color: "bg-emerald-500 shadow-[0_0_8px_rgba(16,185,129,0.5)]", colorLight: "bg-emerald-400", animated: animated ?? true, }, @@ -45,7 +45,7 @@ export const StatusDot = ({ variant, label, animated }: StatusDotProps) => { {statusMapping?.animated && ( diff --git a/app/client/components/ui/button.tsx b/app/client/components/ui/button.tsx index 48f37a75..9f2411b3 100644 --- a/app/client/components/ui/button.tsx +++ b/app/client/components/ui/button.tsx @@ -7,11 +7,12 @@ import { cn } from "~/client/lib/utils"; import { useMinimumDuration } from "~/client/hooks/useMinimumDuration"; const buttonVariants = cva( - "inline-flex cursor-pointer uppercase rounded-sm items-center justify-center gap-2 whitespace-nowrap text-xs font-semibold tracking-wide transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-ring border-0", + "inline-flex cursor-pointer uppercase rounded-sm items-center justify-center gap-2 whitespace-nowrap text-xs font-semibold tracking-wide transition-all active:scale-[0.98] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-ring border-0", { variants: { variant: { - default: "bg-transparent text-white hover:bg-[#3A3A3A]/80 border dark:text-white dark:hover:bg-[#3A3A3A]/80", + default: + "bg-transparent text-white hover:bg-[#3A3A3A]/80 border hover:border-white/40 dark:text-white dark:hover:bg-[#3A3A3A]/80", primary: "bg-strong-accent text-white hover:bg-strong-accent/90 focus-visible:ring-strong-accent/50", destructive: "border border-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/50 text-destructive hover:text-white", diff --git a/app/client/components/ui/card.tsx b/app/client/components/ui/card.tsx index 20f21ad1..1ff9e505 100644 --- a/app/client/components/ui/card.tsx +++ b/app/client/components/ui/card.tsx @@ -2,14 +2,25 @@ import type * as React from "react"; import { cn } from "~/client/lib/utils"; -function Card({ className, children, ...props }: React.ComponentProps<"div">) { +function Card({ className, children, interactive, ...props }: React.ComponentProps<"div"> & { interactive?: boolean }) { return (
-