Resizable
Draggable split-view divider.
SwiftUI: NavigationSplitView divider
Sidebar
Content
Installation
npx shadcn@latest add https://cupertino-ui.baltoon.jp/r/resizable.jsonRequires the theme tokens — see Installation if this is your first component.
Source
"use client";
import * as React from "react";
import * as ResizablePrimitive from "react-resizable-panels";
import { cn } from "@/lib/utils";
/**
* NavigationSplitView's draggable divider: a hairline separator
* whose hit area extends invisibly, highlighting the accent color
* while dragging.
*/
function ResizablePanelGroup({
className,
...props
}: React.ComponentProps<typeof ResizablePrimitive.Group>) {
return (
<ResizablePrimitive.Group
data-slot="resizable-panel-group"
className={cn("flex h-full w-full", className)}
{...props}
/>
);
}
function ResizablePanel({
className,
...props
}: React.ComponentProps<typeof ResizablePrimitive.Panel>) {
return (
<ResizablePrimitive.Panel
data-slot="resizable-panel"
className={cn("overflow-hidden", className)}
{...props}
/>
);
}
function ResizableHandle({
className,
...props
}: React.ComponentProps<typeof ResizablePrimitive.Separator>) {
return (
<ResizablePrimitive.Separator
data-slot="resizable-handle"
className={cn(
"relative shrink-0 bg-separator outline-none transition-colors focus-visible:ring-[3px] focus-visible:ring-blue/40 active:bg-blue",
// A separator between side-by-side panels is aria-vertical.
"aria-[orientation=vertical]:w-px aria-[orientation=vertical]:after:absolute aria-[orientation=vertical]:after:inset-y-0 aria-[orientation=vertical]:after:-left-1 aria-[orientation=vertical]:after:w-2",
"aria-[orientation=horizontal]:h-px aria-[orientation=horizontal]:after:absolute aria-[orientation=horizontal]:after:inset-x-0 aria-[orientation=horizontal]:after:-top-1 aria-[orientation=horizontal]:after:h-2",
className
)}
{...props}
/>
);
}
export { ResizableHandle, ResizablePanel, ResizablePanelGroup };