{"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';\nimport { ComponentSize } from '../../types';\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  return {\n    containerProps: {\n      ref: containerRef,\n      className: styles.container,\n    },\n    primaryProps: {\n      ref: firstPaneRef,\n      className: styles.panel,\n      style: primaryStyles,\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': `start-panel-${id}`,\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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"}