Files
tolaria/src/components/ResizeHandle.tsx
lucaronin 57083ad12c Add four-panel layout shell with vault scanning on load
- Sidebar (250px, resizable): navigation placeholder
- Note list (300px, resizable): displays vault entries from scan
- Editor (flex grow): placeholder for CodeMirror 6
- Inspector (280px, collapsible): properties/relationships placeholder
- Resizable panels with drag handles
- Calls list_vault on app load and displays results in note list

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 18:22:42 +01:00

49 lines
1.3 KiB
TypeScript

import { useCallback, useEffect, useRef } from 'react'
import './ResizeHandle.css'
interface ResizeHandleProps {
onResize: (delta: number) => void
}
export function ResizeHandle({ onResize }: ResizeHandleProps) {
const isDragging = useRef(false)
const lastX = useRef(0)
const handleMouseDown = useCallback(
(e: React.MouseEvent) => {
e.preventDefault()
isDragging.current = true
lastX.current = e.clientX
document.body.style.cursor = 'col-resize'
document.body.style.userSelect = 'none'
},
[],
)
useEffect(() => {
const handleMouseMove = (e: MouseEvent) => {
if (!isDragging.current) return
const delta = e.clientX - lastX.current
lastX.current = e.clientX
onResize(delta)
}
const handleMouseUp = () => {
if (isDragging.current) {
isDragging.current = false
document.body.style.cursor = ''
document.body.style.userSelect = ''
}
}
document.addEventListener('mousemove', handleMouseMove)
document.addEventListener('mouseup', handleMouseUp)
return () => {
document.removeEventListener('mousemove', handleMouseMove)
document.removeEventListener('mouseup', handleMouseUp)
}
}, [onResize])
return <div className="resize-handle" onMouseDown={handleMouseDown} />
}