2026-07-17 23:20:34 +02:00
|
|
|
// A vertical drag handle for adjusting the width of the panel to its left.
|
|
|
|
|
export function Resizer({ onDelta }: { onDelta: (deltaX: number) => void }) {
|
|
|
|
|
const onMouseDown = (e: React.MouseEvent) => {
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
let lastX = e.clientX;
|
|
|
|
|
const onMove = (ev: MouseEvent) => {
|
|
|
|
|
onDelta(ev.clientX - lastX);
|
|
|
|
|
lastX = ev.clientX;
|
|
|
|
|
};
|
|
|
|
|
const onUp = () => {
|
|
|
|
|
document.removeEventListener("mousemove", onMove);
|
|
|
|
|
document.removeEventListener("mouseup", onUp);
|
|
|
|
|
document.body.style.userSelect = "";
|
|
|
|
|
document.body.style.cursor = "";
|
|
|
|
|
};
|
|
|
|
|
document.addEventListener("mousemove", onMove);
|
|
|
|
|
document.addEventListener("mouseup", onUp);
|
|
|
|
|
document.body.style.userSelect = "none";
|
|
|
|
|
document.body.style.cursor = "col-resize";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<div
|
|
|
|
|
onMouseDown={onMouseDown}
|
|
|
|
|
className="group relative z-20 -mx-0.5 w-1 shrink-0 cursor-col-resize"
|
|
|
|
|
role="separator"
|
|
|
|
|
aria-orientation="vertical"
|
|
|
|
|
>
|
|
|
|
|
<div className="absolute inset-y-0 left-1/2 w-px -translate-x-1/2 bg-transparent group-hover:bg-app-accent" />
|
2026-08-04 19:23:44 +02:00
|
|
|
{/* Small pill grab handle in the middle for easier grabbing. */}
|
|
|
|
|
<div className="absolute left-1/2 top-1/2 h-7 w-[5px] -translate-x-1/2 -translate-y-1/2 rounded-full border border-app-border bg-app-elevated group-hover:border-app-accent group-hover:bg-app-accent" />
|
2026-07-17 23:20:34 +02:00
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|