- {canvas === undefined ? (
-
+
);
}
diff --git a/components/canvas/canvas-user-menu.tsx b/components/canvas/canvas-user-menu.tsx
index 437c2d7..f987487 100644
--- a/components/canvas/canvas-user-menu.tsx
+++ b/components/canvas/canvas-user-menu.tsx
@@ -20,7 +20,11 @@ function getInitials(nameOrEmail: string) {
return normalized.slice(0, 2).toUpperCase();
}
-export function CanvasUserMenu() {
+type CanvasUserMenuProps = {
+ compact?: boolean;
+};
+
+export function CanvasUserMenu({ compact = false }: CanvasUserMenuProps) {
const router = useRouter();
const { data: session, isPending } = authClient.useSession();
@@ -37,7 +41,49 @@ export function CanvasUserMenu() {
if (isPending && !session?.user) {
return (
+ );
+ }
+
+ if (compact) {
+ return (
+
+
+
+
+ {initials}
+
+
+
+
+
);
}
diff --git a/components/ui/resizable.tsx b/components/ui/resizable.tsx
new file mode 100644
index 0000000..c9e767a
--- /dev/null
+++ b/components/ui/resizable.tsx
@@ -0,0 +1,50 @@
+"use client"
+
+import * as ResizablePrimitive from "react-resizable-panels"
+
+import { cn } from "@/lib/utils"
+
+function ResizablePanelGroup({
+ className,
+ ...props
+}: ResizablePrimitive.GroupProps) {
+ return (
+
+ )
+}
+
+function ResizablePanel({ ...props }: ResizablePrimitive.PanelProps) {
+ return
+}
+
+function ResizableHandle({
+ withHandle,
+ className,
+ ...props
+}: ResizablePrimitive.SeparatorProps & {
+ withHandle?: boolean
+}) {
+ return (
+
div]:rotate-90",
+ className
+ )}
+ {...props}
+ >
+ {withHandle && (
+
+ )}
+
+ )
+}
+
+export { ResizableHandle, ResizablePanel, ResizablePanelGroup }
diff --git a/package.json b/package.json
index 4781f7c..a9fb5a4 100644
--- a/package.json
+++ b/package.json
@@ -36,6 +36,7 @@
"radix-ui": "^1.4.3",
"react": "19.2.4",
"react-dom": "19.2.4",
+ "react-resizable-panels": "^4.8.0",
"resend": "^4.8.0",
"shadcn": "^4.1.0",
"tailwind-merge": "^3.5.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 1116944..4ab25ce 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -86,6 +86,9 @@ importers:
react-dom:
specifier: 19.2.4
version: 19.2.4(react@19.2.4)
+ react-resizable-panels:
+ specifier: ^4.8.0
+ version: 4.8.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
resend:
specifier: ^4.8.0
version: 4.8.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
@@ -5569,6 +5572,12 @@ packages:
'@types/react':
optional: true
+ react-resizable-panels@4.8.0:
+ resolution: {integrity: sha512-2uEABkewb3ky/ZgIlAUxWa1W/LjsK494fdV1QsXxst7CDRHCzo7h22tWWu3NNaBjmiuriOCt3CvhipnaYcpoIw==}
+ peerDependencies:
+ react: ^18.0.0 || ^19.0.0
+ react-dom: ^18.0.0 || ^19.0.0
+
react-style-singleton@2.2.3:
resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==}
engines: {node: '>=10'}
@@ -12080,6 +12089,11 @@ snapshots:
optionalDependencies:
'@types/react': 19.2.14
+ react-resizable-panels@4.8.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
+ dependencies:
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+
react-style-singleton@2.2.3(@types/react@19.2.14)(react@19.2.4):
dependencies:
get-nonce: 1.0.1