Data Table Resize Handle
virtuoso/data-table-resize-handleFreeComponent
Slot-mounted resize handle for column headers.
Install it
npx shadcn@latest add https://virtuoso.dev/r/data-table-resize-handle.jsonSource
1'use client'23import { useState, type CSSProperties } from 'react'45import { usePublisher } from '@virtuoso.dev/data-table'6import { clearColumnWidthOverride$, resizeColumn$ } from '@virtuoso.dev/data-table/column-resize'78import type { HeaderSlotCustomComponent } from '@virtuoso.dev/data-table'910const MIN_WIDTH = 5011const HANDLE_HIT_AREA = 1012const HANDLE_STYLE: CSSProperties = {13 position: 'relative',14 display: 'flex',15 width: HANDLE_HIT_AREA,16 minWidth: HANDLE_HIT_AREA,17 alignSelf: 'stretch',18 justifyContent: 'center',19 cursor: 'col-resize',20 touchAction: 'none',21 userSelect: 'none',22 zIndex: 1,23}24const HANDLE_LINE_STYLE: CSSProperties = {25 position: 'absolute',26 right: 0,27 top: '50%',28 borderRadius: 9999,29 transform: 'translateY(-50%)',30}3132export const ResizeHandle: HeaderSlotCustomComponent = ({ columnKey, headerRef }) => {33 const resizeColumn = usePublisher(resizeColumn$)34 const clearColumnWidthOverride = usePublisher(clearColumnWidthOverride$)35 const [isResizing, setIsResizing] = useState(false)3637 return (38 <div39 data-table-element-role="resize-handle"40 data-resizing={isResizing ? 'true' : undefined}41 className="group flex cursor-col-resize touch-none items-stretch"42 style={HANDLE_STYLE}43 onDoubleClick={(event) => {44 event.preventDefault()45 clearColumnWidthOverride({ key: columnKey })46 }}47 onPointerDown={(event) => {48 event.preventDefault()49 const handle = event.currentTarget50 const ownerDocument = handle.ownerDocument51 const startWidth = headerRef.current?.getBoundingClientRect().width52 if (startWidth === undefined) {53 return54 }5556 const startX = event.clientX57 const pointerId = event.pointerId58 handle.setPointerCapture(pointerId)59 setIsResizing(true)6061 const handlePointerMove = (moveEvent: PointerEvent) => {62 resizeColumn({63 key: columnKey,64 width: Math.max(MIN_WIDTH, startWidth + moveEvent.clientX - startX),65 })66 }6768 const handlePointerEnd = () => {69 if (handle.hasPointerCapture(pointerId)) {70 handle.releasePointerCapture(pointerId)71 }72 setIsResizing(false)73 ownerDocument.removeEventListener('pointermove', handlePointerMove)74 ownerDocument.removeEventListener('pointerup', handlePointerEnd)75 ownerDocument.removeEventListener('pointercancel', handlePointerEnd)76 }7778// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from virtuoso
All 6 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Data Tabledata-table | virtuoso | Components | Free | 1 dep | |
| Data Table Draggable Group Headerdata-table-draggable-group-header | virtuoso | Components | Free | 1 dep | |
| Data Table Reorder Drop Zonedata-table-reorder-drop-zone | virtuoso | Components | Free | 2 deps · 4 files | |
| Data Table Reorder Gripdata-table-reorder-grip | virtuoso | Components | Free | 2 deps · 4 files | |
| Data Table Sort Header Buttondata-table-sort-header-button | virtuoso | Components | Free | 2 deps · 2 files |
