DesignX
Core@paxeer/core/resizableimplemented

Resizable

shadcn Resizable. split-handle wraps this.

Install

$pnpm exec designx add @paxeer/core/resizable

Source code

components/designx/core/resizable.tsxtsx
"use client";

import { GripVerticalIcon } from "lucide-react";
import {
  Panel,
  PanelGroup,
  PanelResizeHandle,
  type ImperativePanelHandle,
  type PanelGroupProps,
  type PanelProps,
  type PanelResizeHandleProps,
} from "react-resizable-panels";
import { cn } from "../lib/cn";

/** Adapted from shadcn/ui Resizable (react-resizable-panels v3 PanelGroup API). */

export function ResizablePanelGroup({ className, ...props }: PanelGroupProps) {
  return (
    <PanelGroup
      data-slot="resizable-panel-group"
      className={cn("flex h-full w-full data-[panel-group-direction=vertical]:flex-col", className)}
      {...props}
    />
  );
}

export function ResizablePanel({ ...props }: PanelProps) {
  return <Panel data-slot="resizable-panel" {...props} />;
}

export function ResizableHandle({
  withHandle,
  className,
  ...props
}: PanelResizeHandleProps & { withHandle?: boolean }) {
  return (
    <PanelResizeHandle
      data-slot="resizable-handle"
      className={cn(
        "dx-focus-ring relative flex w-px items-center justify-center bg-outline-variant after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 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-x-0 data-[panel-group-direction=vertical]:after:-translate-y-1/2 [&[data-panel-group-direction=vertical]>div]:rotate-90",
        className,
      )}
      {...props}
    >
      {withHandle ? (
        <div className="z-10 flex h-4 w-3 items-center justify-center rounded-[var(--md-sys-shape-corner-extra-small)] border border-outline-variant bg-surface-container-highest">
          <GripVerticalIcon className="size-2.5" />
        </div>
      ) : null}
    </PanelResizeHandle>
  );
}

export type { ImperativePanelHandle };

Dependencies

npm packages

react-resizable-panelslucide-react

Registry dependencies