diff --git a/web/bun.lockb b/web/bun.lockb
index 40d4914..5518526 100755
Binary files a/web/bun.lockb and b/web/bun.lockb differ
diff --git a/web/package.json b/web/package.json
index b977a20..82bdbb6 100644
--- a/web/package.json
+++ b/web/package.json
@@ -96,6 +96,7 @@
"unist-util-filter": "^5.0.1",
"unist-util-visit": "^5.0.0",
"use-debounce": "^10.0.0",
+ "usehooks-ts": "^2.9.4",
"uuid": "^9.0.1",
"zod": "^3.22.4",
"zustand": "^4.4.7"
diff --git a/web/src/app/(app)/layout.tsx b/web/src/app/(app)/layout.tsx
index 7995157..ae372fe 100644
--- a/web/src/app/(app)/layout.tsx
+++ b/web/src/app/(app)/layout.tsx
@@ -1,9 +1,7 @@
+import { Navbar } from "../../components/Navbar";
import "./globals.css";
-import { NavbarMenu } from "@/components/NavbarMenu";
-import { Button } from "@/components/ui/button";
import { TooltipProvider } from "@/components/ui/tooltip";
-import { ClerkProvider, OrganizationSwitcher, UserButton } from "@clerk/nextjs";
-import { Github } from "lucide-react";
+import { ClerkProvider } from "@clerk/nextjs";
import type { Metadata } from "next";
import meta from "next-gen/config";
import PlausibleProvider from "next-plausible";
@@ -47,45 +45,7 @@ export default function RootLayout({
{children}
diff --git a/web/src/components/LoadingIcon.tsx b/web/src/components/LoadingIcon.tsx
index b925661..d04b52c 100644
--- a/web/src/components/LoadingIcon.tsx
+++ b/web/src/components/LoadingIcon.tsx
@@ -1,4 +1,5 @@
"use client";
+
import { LoaderIcon } from "lucide-react";
import * as React from "react";
diff --git a/web/src/components/Navbar.tsx b/web/src/components/Navbar.tsx
new file mode 100644
index 0000000..2a86d45
--- /dev/null
+++ b/web/src/components/Navbar.tsx
@@ -0,0 +1,86 @@
+"use client";
+
+import { NavbarMenu } from "@/components/NavbarMenu";
+import { Button } from "@/components/ui/button";
+import {
+ Sheet,
+ SheetContent,
+ SheetHeader,
+ SheetTitle,
+ SheetTrigger,
+} from "@/components/ui/sheet";
+import { OrganizationSwitcher, UserButton } from "@clerk/nextjs";
+import { Github, Menu } from "lucide-react";
+import meta from "next-gen/config";
+import { useEffect, useState } from "react";
+import { useMediaQuery } from "usehooks-ts";
+
+export function Navbar() {
+ const _isDesktop = useMediaQuery("(min-width: 768px)");
+ const [isDesktop, setIsDesktop] = useState(true);
+ useEffect(() => {
+ setIsDesktop(_isDesktop);
+ }, [_isDesktop]);
+ return (
+ <>
+
+ {!isDesktop && (
+
+
+
+
+
+
+ Comfy Deploy
+
+
+
+
+
+
+
+ )}
+
+ {meta.name}
+
+ {isDesktop && (
+
+ )}
+
+
+ {isDesktop &&
}
+
+
+
+
+ >
+ );
+}
diff --git a/web/src/components/NavbarMenu.tsx b/web/src/components/NavbarMenu.tsx
index f56e1b9..9504325 100644
--- a/web/src/components/NavbarMenu.tsx
+++ b/web/src/components/NavbarMenu.tsx
@@ -1,18 +1,13 @@
"use client";
-import {
- Select,
- SelectContent,
- SelectGroup,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "@/components/ui/select";
+import { ScrollArea } from "@/components/ui/scroll-area";
import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
+import { cn } from "@/lib/utils";
+import Link from "next/link";
import { usePathname } from "next/navigation";
import { useRouter } from "next/navigation";
-export function NavbarMenu() {
+export function NavbarMenu({ className }: { className?: string }) {
const pathnames = usePathname();
const pathname = `/${pathnames.split("/")[1]}`;
@@ -34,7 +29,7 @@ export function NavbarMenu() {
];
return (
-
+
{/*
*/}
{/*
*/}
-
-
-
+
+
+ {pages.map((page) => (
+
+ {page.name}
+
+ ))}
+
+
);
}
diff --git a/web/src/components/ui/sheet.tsx b/web/src/components/ui/sheet.tsx
new file mode 100644
index 0000000..a37f17b
--- /dev/null
+++ b/web/src/components/ui/sheet.tsx
@@ -0,0 +1,140 @@
+"use client"
+
+import * as React from "react"
+import * as SheetPrimitive from "@radix-ui/react-dialog"
+import { cva, type VariantProps } from "class-variance-authority"
+import { X } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Sheet = SheetPrimitive.Root
+
+const SheetTrigger = SheetPrimitive.Trigger
+
+const SheetClose = SheetPrimitive.Close
+
+const SheetPortal = SheetPrimitive.Portal
+
+const SheetOverlay = React.forwardRef<
+ React.ElementRef
,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+SheetOverlay.displayName = SheetPrimitive.Overlay.displayName
+
+const sheetVariants = cva(
+ "fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
+ {
+ variants: {
+ side: {
+ top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
+ bottom:
+ "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
+ left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
+ right:
+ "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
+ },
+ },
+ defaultVariants: {
+ side: "right",
+ },
+ }
+)
+
+interface SheetContentProps
+ extends React.ComponentPropsWithoutRef,
+ VariantProps {}
+
+const SheetContent = React.forwardRef<
+ React.ElementRef,
+ SheetContentProps
+>(({ side = "right", className, children, ...props }, ref) => (
+
+
+
+ {children}
+
+
+ Close
+
+
+
+))
+SheetContent.displayName = SheetPrimitive.Content.displayName
+
+const SheetHeader = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+SheetHeader.displayName = "SheetHeader"
+
+const SheetFooter = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+SheetFooter.displayName = "SheetFooter"
+
+const SheetTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+SheetTitle.displayName = SheetPrimitive.Title.displayName
+
+const SheetDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+SheetDescription.displayName = SheetPrimitive.Description.displayName
+
+export {
+ Sheet,
+ SheetPortal,
+ SheetOverlay,
+ SheetTrigger,
+ SheetClose,
+ SheetContent,
+ SheetHeader,
+ SheetFooter,
+ SheetTitle,
+ SheetDescription,
+}