|
|
@@ -8,6 +8,8 @@ export interface ResizeHandleProps extends Omit<JSX.HTMLAttributes<HTMLDivElemen
|
|
|
max: number
|
|
|
onResize: (size: number) => void
|
|
|
onCollapse?: () => void
|
|
|
+ /** Called while dragging when size crosses `collapseThreshold`. */
|
|
|
+ onCollapseChange?: (collapsed: boolean) => void
|
|
|
collapseThreshold?: number
|
|
|
}
|
|
|
|
|
|
@@ -20,17 +22,26 @@ export function ResizeHandle(props: ResizeHandleProps) {
|
|
|
"max",
|
|
|
"onResize",
|
|
|
"onCollapse",
|
|
|
+ "onCollapseChange",
|
|
|
"collapseThreshold",
|
|
|
"class",
|
|
|
"classList",
|
|
|
])
|
|
|
|
|
|
const handleMouseDown = (e: MouseEvent) => {
|
|
|
+ if (e.detail > 1) return
|
|
|
e.preventDefault()
|
|
|
const edge = local.edge ?? (local.direction === "vertical" ? "start" : "end")
|
|
|
const start = local.direction === "horizontal" ? e.clientX : e.clientY
|
|
|
const startSize = local.size
|
|
|
+ const min = local.min
|
|
|
+ const max = local.max
|
|
|
+ const threshold = local.collapseThreshold ?? 0
|
|
|
+ const onResize = local.onResize
|
|
|
+ const onCollapse = local.onCollapse
|
|
|
+ const onCollapseChange = local.onCollapseChange
|
|
|
let current = startSize
|
|
|
+ let collapsed = false
|
|
|
|
|
|
document.body.style.userSelect = "none"
|
|
|
document.body.style.overflow = "hidden"
|
|
|
@@ -46,8 +57,12 @@ export function ResizeHandle(props: ResizeHandleProps) {
|
|
|
? start - pos
|
|
|
: pos - start
|
|
|
current = startSize + delta
|
|
|
- const clamped = Math.min(local.max, Math.max(local.min, current))
|
|
|
- local.onResize(clamped)
|
|
|
+ const nextCollapsed = threshold > 0 && current < threshold
|
|
|
+ if (nextCollapsed !== collapsed) {
|
|
|
+ collapsed = nextCollapsed
|
|
|
+ onCollapseChange?.(collapsed)
|
|
|
+ }
|
|
|
+ onResize(Math.min(max, Math.max(min, current)))
|
|
|
}
|
|
|
|
|
|
const onMouseUp = () => {
|
|
|
@@ -56,10 +71,11 @@ export function ResizeHandle(props: ResizeHandleProps) {
|
|
|
document.removeEventListener("mousemove", onMouseMove)
|
|
|
document.removeEventListener("mouseup", onMouseUp)
|
|
|
|
|
|
- const threshold = local.collapseThreshold ?? 0
|
|
|
- if (local.onCollapse && threshold > 0 && current < threshold) {
|
|
|
- local.onCollapse()
|
|
|
+ if (collapsed) {
|
|
|
+ onCollapse?.()
|
|
|
+ return
|
|
|
}
|
|
|
+ onCollapseChange?.(false)
|
|
|
}
|
|
|
|
|
|
document.addEventListener("mousemove", onMouseMove)
|