Skip to content

Commit 1f106b9

Browse files
committed
Feat(flexible resizable panels UI component) ✨: Implemented a 'ResizablePanelGroup' using 'react-resizable-panels' for flexible vertical layout adjustments. Incorporated 'ResizablePanel' and 'ResizableHandle' components with a grip icon for user-friendly resizing.
1 parent 4bd3676 commit 1f106b9

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

components/ui/resizable.tsx

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
'use client';
2+
3+
import { GripVertical } from 'lucide-react';
4+
import * as ResizablePrimitive from 'react-resizable-panels';
5+
6+
import { cn } from '@/lib/utils';
7+
8+
const ResizablePanelGroup = ({ className, ...props }: React.ComponentProps<typeof ResizablePrimitive.PanelGroup>) => (
9+
<ResizablePrimitive.PanelGroup
10+
className={cn('flex h-full w-full data-[panel-group-direction=vertical]:flex-col', className)}
11+
{...props}
12+
/>
13+
);
14+
15+
const ResizablePanel = ResizablePrimitive.Panel;
16+
17+
const ResizableHandle = ({
18+
withHandle,
19+
className,
20+
...props
21+
}: React.ComponentProps<typeof ResizablePrimitive.PanelResizeHandle> & {
22+
withHandle?: boolean;
23+
}) => (
24+
<ResizablePrimitive.PanelResizeHandle
25+
className={cn(
26+
'relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90',
27+
className,
28+
)}
29+
{...props}
30+
>
31+
{withHandle && (
32+
<div className="z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border">
33+
<GripVertical className="h-2.5 w-2.5" />
34+
</div>
35+
)}
36+
</ResizablePrimitive.PanelResizeHandle>
37+
);
38+
39+
export { ResizablePanelGroup, ResizablePanel, ResizableHandle };

0 commit comments

Comments
 (0)