UNPKG

@grafana/ui

Version:
1 lines • 24.6 kB
{"version":3,"file":"useSplitter.mjs","sources":["../../../../src/components/Splitter/useSplitter.ts"],"sourcesContent":["import { css } from '@emotion/css';\nimport { clamp } from 'lodash';\nimport { useCallback, useId, useRef } from 'react';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { ComponentSize } from '../../types/size';\nimport { DragHandlePosition, getDragStyles } from '../DragHandle/DragHandle';\n\nexport interface UseSplitterOptions {\n /**\n * The initial size of the primary pane between 0-1, defaults to 0.5\n * If `usePixels` is true, this is the initial size in pixels of the second pane.\n */\n initialSize?: number;\n direction: 'row' | 'column';\n dragPosition?: DragHandlePosition;\n usePixels?: boolean;\n /**\n * Called when ever the size of the primary pane changes\n * @param flexSize (float from 0-1)\n */\n onSizeChanged?: (flexSize: number, firstPanePixels: number, secondPanePixels: number) => void;\n onResizing?: (flexSize: number, firstPanePixels: number, secondPanePixels: number) => void;\n\n // Size of the region left of the handle indicator that is responsive to dragging. At the same time acts as a margin\n // pushing the left pane content left.\n handleSize?: ComponentSize;\n}\n\nconst PIXELS_PER_MS = 0.3 as const;\nconst VERTICAL_KEYS = new Set(['ArrowUp', 'ArrowDown']);\nconst HORIZONTAL_KEYS = new Set(['ArrowLeft', 'ArrowRight']);\n\nconst propsForDirection = {\n row: {\n dim: 'width',\n axis: 'clientX',\n min: 'minWidth',\n max: 'maxWidth',\n },\n column: {\n dim: 'height',\n axis: 'clientY',\n min: 'minHeight',\n max: 'maxHeight',\n },\n} as const;\n\nexport function useSplitter(options: UseSplitterOptions) {\n const {\n direction,\n initialSize = options.usePixels ? 300 : 0.5,\n dragPosition = 'middle',\n onResizing,\n onSizeChanged,\n usePixels,\n } = options;\n\n const handleSize = getPixelSize(options.handleSize);\n const splitterRef = useRef<HTMLDivElement | null>(null);\n const firstPaneRef = useRef<HTMLDivElement | null>(null);\n const secondPaneRef = useRef<HTMLDivElement | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const containerSize = useRef<number | null>(null);\n const primarySizeRef = useRef<number | null>(null);\n const referencePaneSize = useRef<MeasureResult | undefined>(undefined);\n const savedPos = useRef<string | undefined>(undefined);\n\n const measurementProp = propsForDirection[direction].dim;\n const clientAxis = propsForDirection[direction].axis;\n const minDimProp = propsForDirection[direction].min;\n const maxDimProp = propsForDirection[direction].max;\n const dragStart = useRef<number | null>(null);\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (!firstPaneRef.current || !secondPaneRef.current) {\n return;\n }\n\n // measure left-side width\n primarySizeRef.current = firstPaneRef.current!.getBoundingClientRect()[measurementProp];\n containerSize.current = containerRef.current!.getBoundingClientRect()[measurementProp];\n\n dragStart.current = e[clientAxis];\n splitterRef.current!.setPointerCapture(e.pointerId);\n\n if (usePixels) {\n referencePaneSize.current = measureElement(secondPaneRef.current, usePixels);\n } else {\n referencePaneSize.current = measureElement(firstPaneRef.current);\n }\n\n savedPos.current = undefined;\n },\n [measurementProp, clientAxis, usePixels]\n );\n\n const onUpdateSize = useCallback(\n (diff: number) => {\n if (!containerSize.current || !primarySizeRef.current || !secondPaneRef.current) {\n return;\n }\n\n const firstPanePixels = primarySizeRef.current;\n const secondPanePixels = containerSize.current - firstPanePixels - handleSize;\n const dims = referencePaneSize.current!;\n\n if (usePixels) {\n const newSize = clamp(secondPanePixels - diff, dims[minDimProp], dims[maxDimProp]);\n secondPaneRef.current!.style.flexBasis = `${newSize}px`;\n splitterRef.current!.ariaValueNow = `${newSize}`;\n onResizing?.(newSize, firstPanePixels + diff, newSize);\n } else {\n const newSize = clamp(primarySizeRef.current + diff, dims[minDimProp], dims[maxDimProp]);\n const newFlex = newSize / (containerSize.current! - handleSize);\n firstPaneRef.current!.style.flexGrow = `${newFlex}`;\n secondPaneRef.current!.style.flexGrow = `${1 - newFlex}`;\n splitterRef.current!.ariaValueNow = ariaValue(newSize, dims[minDimProp], dims[maxDimProp]);\n onResizing?.(newFlex, newSize, secondPanePixels - diff);\n }\n },\n [onResizing, handleSize, usePixels, minDimProp, maxDimProp]\n );\n\n const onPointerMove = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n if (dragStart.current !== null) {\n onUpdateSize(e[clientAxis] - dragStart.current);\n }\n },\n [onUpdateSize, clientAxis]\n );\n\n const onPointerUp = useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n dragStart.current = null;\n\n splitterRef.current!.releasePointerCapture(e.pointerId);\n\n const firstPaneSize = firstPaneRef.current!.getBoundingClientRect()[measurementProp];\n const secondPanePixels = containerSize.current! - firstPaneSize - handleSize;\n\n onSizeChanged?.(parseFloat(firstPaneRef.current!.style.flexGrow), firstPaneSize, secondPanePixels);\n },\n [onSizeChanged, handleSize, measurementProp]\n );\n\n const pressedKeys = useRef(new Set<string>());\n const keysLastHandledAt = useRef<number | null>(null);\n const handlePressedKeys = useCallback(\n (time: number) => {\n const nothingPressed = pressedKeys.current.size === 0;\n if (nothingPressed) {\n keysLastHandledAt.current = null;\n return;\n } else if (primarySizeRef.current === null) {\n return;\n }\n\n const dt = time - (keysLastHandledAt.current ?? time);\n const dx = dt * PIXELS_PER_MS;\n let sizeChange = 0;\n\n if (direction === 'row') {\n if (pressedKeys.current.has('ArrowLeft')) {\n sizeChange -= dx;\n }\n if (pressedKeys.current.has('ArrowRight')) {\n sizeChange += dx;\n }\n } else {\n if (pressedKeys.current.has('ArrowUp')) {\n sizeChange -= dx;\n }\n if (pressedKeys.current.has('ArrowDown')) {\n sizeChange += dx;\n }\n }\n\n // measure primary and container\n primarySizeRef.current = firstPaneRef.current!.getBoundingClientRect()[measurementProp];\n containerSize.current = containerRef.current!.getBoundingClientRect()[measurementProp];\n\n onUpdateSize(sizeChange);\n\n keysLastHandledAt.current = time;\n\n window.requestAnimationFrame(handlePressedKeys);\n },\n [direction, measurementProp, onUpdateSize]\n );\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!firstPaneRef.current || !secondPaneRef.current || !splitterRef.current || !containerRef.current) {\n return;\n }\n\n if (\n !(\n (direction === 'column' && VERTICAL_KEYS.has(e.key)) ||\n (direction === 'row' && HORIZONTAL_KEYS.has(e.key))\n ) ||\n pressedKeys.current.has(e.key)\n ) {\n return;\n }\n\n savedPos.current = undefined;\n e.preventDefault();\n e.stopPropagation();\n\n primarySizeRef.current = firstPaneRef.current.getBoundingClientRect()[measurementProp];\n containerSize.current = containerRef.current!.getBoundingClientRect()[measurementProp];\n\n if (usePixels) {\n referencePaneSize.current = measureElement(secondPaneRef.current!);\n } else {\n referencePaneSize.current = measureElement(firstPaneRef.current!);\n }\n\n const newKey = !pressedKeys.current.has(e.key);\n\n if (newKey) {\n const initiateAnimationLoop = pressedKeys.current.size === 0;\n pressedKeys.current.add(e.key);\n\n if (initiateAnimationLoop) {\n window.requestAnimationFrame(handlePressedKeys);\n }\n }\n },\n [direction, handlePressedKeys, , measurementProp, usePixels]\n );\n\n const onKeyUp = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (\n (direction === 'row' && !HORIZONTAL_KEYS.has(e.key)) ||\n (direction === 'column' && !VERTICAL_KEYS.has(e.key))\n ) {\n return;\n }\n\n pressedKeys.current.delete(e.key);\n\n if (primarySizeRef.current !== null) {\n const secondPanePixels = containerSize.current! - primarySizeRef.current - handleSize;\n onSizeChanged?.(parseFloat(firstPaneRef.current!.style.flexGrow), primarySizeRef.current, secondPanePixels);\n }\n },\n [direction, onSizeChanged, handleSize]\n );\n\n const onDoubleClick = useCallback(() => {\n if (!firstPaneRef.current || !secondPaneRef.current) {\n return;\n }\n\n if (usePixels) {\n secondPaneRef.current.style.flexBasis = `${initialSize}px`;\n } else {\n firstPaneRef.current.style.flexGrow = '0.5';\n secondPaneRef.current.style.flexGrow = '0.5';\n primarySizeRef.current = firstPaneRef.current!.getBoundingClientRect()[measurementProp];\n splitterRef.current!.ariaValueNow = `50`;\n }\n }, [measurementProp, usePixels, initialSize]);\n\n const onBlur = useCallback(() => {\n // If focus is lost while keys are held, stop changing panel sizes\n if (pressedKeys.current.size > 0) {\n pressedKeys.current.clear();\n dragStart.current = null;\n\n if (typeof primarySizeRef.current === 'number') {\n const secondPanePixels = containerSize.current! - primarySizeRef.current - handleSize;\n onSizeChanged?.(parseFloat(firstPaneRef.current!.style.flexGrow), primarySizeRef.current, secondPanePixels);\n }\n }\n }, [onSizeChanged, handleSize]);\n\n const styles = useStyles2(getStyles, direction);\n const dragStyles = useStyles2(getDragStyles, dragPosition);\n const dragHandleStyle = direction === 'column' ? dragStyles.dragHandleHorizontal : dragStyles.dragHandleVertical;\n const id = useId();\n\n const primaryStyles: React.CSSProperties = {\n flexGrow: clamp(initialSize, 0, 1),\n [minDimProp]: 'min-content',\n };\n\n const secondaryStyles: React.CSSProperties = {\n flexGrow: clamp(1 - initialSize, 0, 1),\n [minDimProp]: 'min-content',\n };\n\n if (usePixels) {\n primaryStyles.flexGrow = 1;\n secondaryStyles.flexGrow = 'unset';\n secondaryStyles.flexBasis = `${initialSize}px`;\n }\n\n const primaryId = `start-panel-${id}`;\n\n return {\n containerProps: {\n ref: containerRef,\n className: styles.container,\n },\n primaryProps: {\n ref: firstPaneRef,\n className: styles.panel,\n style: primaryStyles,\n id: primaryId,\n },\n secondaryProps: {\n ref: secondPaneRef,\n className: styles.panel,\n style: secondaryStyles,\n },\n splitterProps: {\n onPointerUp,\n onPointerDown,\n onPointerMove,\n onKeyDown,\n onKeyUp,\n onDoubleClick,\n onBlur,\n ref: splitterRef,\n style: { [measurementProp]: `${handleSize}px` },\n role: 'separator',\n 'aria-valuemin': 0,\n 'aria-valuemax': 100,\n 'aria-valuenow': initialSize * 100,\n 'aria-controls': primaryId,\n 'aria-label': 'Pane resize widget',\n tabIndex: 0,\n className: dragHandleStyle,\n },\n };\n}\n\nfunction ariaValue(value: number, min: number, max: number) {\n return `${clamp(((value - min) / (max - min)) * 100, 0, 100)}`;\n}\n\ninterface MeasureResult {\n minWidth: number;\n maxWidth: number;\n minHeight: number;\n maxHeight: number;\n}\n\nfunction measureElement<T extends HTMLElement>(ref: T, usePixels?: boolean): MeasureResult {\n const savedBodyOverflow = document.body.style.overflow;\n const savedWidth = ref.style.width;\n const savedHeight = ref.style.height;\n const savedFlex = ref.style.flexGrow;\n const savedFlexBasis = ref.style.flexBasis;\n\n document.body.style.overflow = 'hidden';\n\n ref.style.flexGrow = '0';\n ref.style.flexBasis = '0';\n\n const { width: minWidth, height: minHeight } = ref.getBoundingClientRect();\n\n ref.style.flexGrow = '100';\n\n const { width: maxWidth, height: maxHeight } = ref.getBoundingClientRect();\n\n document.body.style.overflow = savedBodyOverflow;\n\n ref.style.width = savedWidth;\n ref.style.height = savedHeight;\n ref.style.flexGrow = savedFlex;\n ref.style.flexBasis = savedFlexBasis;\n\n return { minWidth, maxWidth, minHeight, maxHeight };\n}\n\nfunction getStyles(theme: GrafanaTheme2, direction: UseSplitterOptions['direction']) {\n return {\n container: css({\n display: 'flex',\n flexDirection: direction === 'row' ? 'row' : 'column',\n width: '100%',\n flexGrow: 1,\n overflow: 'hidden',\n }),\n panel: css({ display: 'flex', position: 'relative', flexBasis: 0 }),\n };\n}\n\nfunction getPixelSize(size: ComponentSize = 'md') {\n return {\n xs: 4,\n sm: 8,\n md: 16,\n lg: 32,\n }[size];\n}\n"],"names":[],"mappings":"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"}