Refined UI

An opinionated, customizable superset of shadcn/ui

AgentsPrimitivesSkillsSkins
Guides
  • Overview
  • Get started
  • Shadcn compatibility
  • Architecture
  • Agent surface
Primitives
  • Accordion
  • Alert
  • Alert dialog
  • Aspect ratio
  • Autocomplete
  • Avatar
  • Badge
  • Button
  • Button group
  • Calendar
  • Card
  • Checkbox
  • Checkbox Group
  • Code
  • Code Diff
  • Collapsible
  • Color Picker
  • Combobox
  • Command
  • Date Picker
  • Dialog
  • Drawer
  • Empty
  • Field
  • Form
  • Gradient Editor
  • Hover card
  • Input
  • Input group
  • Input OTP
  • Item
  • Kbd
  • Markdown
  • Menu
  • Menubar
  • Meter
  • Native select
  • Navigation menu
  • Number Field
  • Pagination
  • Popover
  • Progress
  • Radio group
  • Resizable
  • Scroll area
  • Select
  • Sidebar
  • Skeleton
  • Slider
  • Spinner
  • Switch
  • Table
  • Table of contents
  • Tabs
  • Textarea
  • Toast
  • Toggle
  • Toolbar
  • Tooltip
  • Tree
  • Trigger Menu
  • Typography
Hooks
  • Use Chat Message
  • Use Chat Input
  • Use User Ask
  • Use Audio Recorder
  • Use Environment Variables
  • Use Copy To Clipboard
  • Use Tool Call
  • Use Sidebar Resize
Utils
  • cn
  • Skin
  • Contracts
  • Serialize
Extensions
  • Control Effects
  • View Transition
  • Send Aurora
  1. Reference
  2. useSidebarResize
Hooks

useSidebarResize

Pointer and keyboard resizing state for Sidebar.

Installed to components/refined-ui/hooks/use-sidebar-resize.ts with the Sidebar primitive. It is local UI behavior — yours to own and edit.

Used by Sidebar

Source

Installed hook source

Behavior hook
src/registry/hooks/use-sidebar-resize.ts
"use client";
​
import type { KeyboardEvent, PointerEvent as ReactPointerEvent } from "react";
import { useEffect, useRef, useState } from "react";
​
export type UseSidebarResizeOptions = {
defaultWidth: number;
minWidth: number;
maxWidth: number;
};
​
export type SidebarResize = {
width: number;
dragging: boolean;
onPointerDown: (event: ReactPointerEvent) => void;
onKeyDown: (event: KeyboardEvent) => void;
};
​
// component owns handle markup so a skin can style it; hook just returns width + handlers to wire on
export function useSidebarResize({ defaultWidth, minWidth, maxWidth }: UseSidebarResizeOptions): SidebarResize {
const [width, setWidth] = useState(defaultWidth);
const [dragging, setDragging] = useState(false);
const start = useRef({ x: 0, width: defaultWidth });
​
useEffect(() => {
if (!dragging) return;
​
function onMove(event: globalThis.PointerEvent) {
const next = Math.min(maxWidth, Math.max(minWidth, start.current.width + (event.clientX - start.current.x)));
setWidth(next);
}
function onUp() {
setDragging(false);
}
​
const previousCursor = document.body.style.cursor;
const previousSelect = document.body.style.userSelect;
document.body.style.cursor = "col-resize";
document.body.style.userSelect = "none";
window.addEventListener("pointermove", onMove);
window.addEventListener("pointerup", onUp);
​
return () => {
window.removeEventListener("pointermove", onMove);
window.removeEventListener("pointerup", onUp);
document.body.style.cursor = previousCursor;
document.body.style.userSelect = previousSelect;
};
}, [dragging, minWidth, maxWidth]);
​
function onPointerDown(event: ReactPointerEvent) {
start.current = { x: event.clientX, width };
setDragging(true);
event.preventDefault();
}
​
function onKeyDown(event: KeyboardEvent) {
if (event.key !== "ArrowLeft" && event.key !== "ArrowRight") return;
event.preventDefault();
const delta = event.key === "ArrowRight" ? 16 : -16;
setWidth((current) => Math.min(maxWidth, Math.max(minWidth, current + delta)));
}
​
return { width, dragging, onPointerDown, onKeyDown };
}
​

On this page

  • Installation
  • Source