UNPKG

@rexxars/react-split-pane

Version:
1 lines 23.3 kB
{"version":3,"file":"index.cjs","sources":["../src/Pane.tsx","../src/Resizer.tsx","../src/SplitPane.tsx"],"sourcesContent":["import type {\n CSSProperties,\n FunctionComponent,\n PropsWithChildren,\n} from 'react';\n\n/**\n * @public\n */\nexport type PaneProps = PropsWithChildren<{\n className?: string;\n size?: number;\n split?: 'vertical' | 'horizontal';\n style?: CSSProperties;\n eleRef?: (el: HTMLDivElement) => void;\n}>;\n\n/**\n * @public\n */\nexport const Pane: FunctionComponent<PaneProps> = function Pane(props) {\n const { children, className, split, style: styleProps, size, eleRef } = props;\n\n let style: CSSProperties = {\n flex: 1,\n position: 'relative',\n outline: 'none',\n };\n\n if (size !== undefined) {\n if (split === 'vertical') {\n style.width = size;\n } else {\n style.height = size;\n style.display = 'flex';\n }\n style.flex = 'none';\n }\n\n style = { ...style, ...styleProps };\n\n const classes = ['Pane', split, className].filter(Boolean).join(' ');\n return (\n <div role=\"region\" ref={eleRef} className={classes} style={style}>\n {children}\n </div>\n );\n};\n","import type { CSSProperties, FunctionComponent } from 'react';\n\nexport const RESIZER_DEFAULT_CLASSNAME = 'Resizer';\n\ninterface ResizerProps {\n className?: string;\n onClick?: (event: MouseEvent) => void;\n onDoubleClick?: (event: MouseEvent) => void;\n onMouseDown: (event: MouseEvent) => void;\n onTouchEnd: (event: TouchEvent) => void;\n onTouchStart: (event: TouchEvent) => void;\n resizerClassName?: string;\n split: 'vertical' | 'horizontal';\n style: CSSProperties;\n}\n\nexport const Resizer: FunctionComponent<ResizerProps> = function Resizer(\n props\n) {\n const {\n className = RESIZER_DEFAULT_CLASSNAME,\n onClick,\n onDoubleClick,\n onMouseDown,\n onTouchEnd,\n onTouchStart,\n resizerClassName,\n split,\n style,\n } = props;\n\n const classes = [resizerClassName, split, className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <span\n role=\"separator\"\n className={classes}\n style={style}\n onMouseDown={(event) => onMouseDown(event.nativeEvent)}\n onTouchStart={(event) => {\n event.preventDefault();\n onTouchStart(event.nativeEvent);\n }}\n onTouchEnd={(event) => {\n event.preventDefault();\n onTouchEnd(event.nativeEvent);\n }}\n onClick={(event) => {\n if (onClick) {\n event.preventDefault();\n onClick(event.nativeEvent);\n }\n }}\n onDoubleClick={(event) => {\n if (onDoubleClick) {\n event.preventDefault();\n onDoubleClick(event.nativeEvent);\n }\n }}\n />\n );\n};\n","import { Children, Component, CSSProperties, ReactNode } from 'react';\nimport { Pane } from './Pane.js';\nimport { Resizer, RESIZER_DEFAULT_CLASSNAME } from './Resizer.js';\n\nconst BASE_STYLES: CSSProperties = {\n display: 'flex',\n flex: 1,\n height: '100%',\n position: 'absolute',\n outline: 'none',\n overflow: 'hidden',\n MozUserSelect: 'text',\n WebkitUserSelect: 'text',\n msUserSelect: 'text',\n userSelect: 'text',\n};\n\nconst VERTICAL_STYLES: CSSProperties = {\n ...BASE_STYLES,\n flexDirection: 'row',\n left: 0,\n right: 0,\n};\n\nconst HORIZONTAL_STYLES: CSSProperties = {\n ...BASE_STYLES,\n bottom: 0,\n flexDirection: 'column',\n minHeight: '100%',\n top: 0,\n width: '100%',\n};\n\nconst EMPTY_STYLES: CSSProperties = {};\n\n/**\n * @public\n */\nexport interface SplitPaneProps {\n allowResize?: boolean;\n className?: string;\n primary?: 'first' | 'second';\n minSize?: number;\n maxSize?: number;\n defaultSize?: number;\n size?: number;\n split?: 'vertical' | 'horizontal';\n onDragStarted?: () => void;\n onDragFinished?: (newSize: number) => void;\n onChange?: (newSize: number) => void;\n onResizerClick?: (event: MouseEvent) => void;\n onResizerDoubleClick?: (event: MouseEvent) => void;\n style?: CSSProperties;\n resizerStyle?: CSSProperties;\n paneStyle?: CSSProperties;\n pane1Style?: CSSProperties;\n pane2Style?: CSSProperties;\n paneClassName?: string;\n pane1ClassName?: string;\n pane2ClassName?: string;\n resizerClassName?: string;\n step?: number;\n children?: ReactNode;\n}\n\n/**\n * @public\n */\nexport interface SplitPaneState {\n active: boolean;\n resized: boolean;\n\n pane1Size?: number;\n pane2Size?: number;\n\n position?: number;\n draggedSize?: number;\n\n instanceProps: { size?: number };\n}\n\n/**\n * @public\n */\nexport type MinimalTouchEvent = MouseEvent & {\n touches: Array<{ clientX: number; clientY: number }>;\n};\n\n/**\n * @public\n */\nexport class SplitPane extends Component<SplitPaneProps, SplitPaneState> {\n static defaultProps = {\n allowResize: true,\n minSize: 50,\n primary: 'first',\n split: 'vertical',\n paneClassName: '',\n pane1ClassName: '',\n pane2ClassName: '',\n };\n\n pane1: HTMLDivElement | null = null;\n pane2: HTMLDivElement | null = null;\n splitPane: HTMLDivElement | null = null;\n\n constructor(props: SplitPaneProps) {\n super(props);\n\n this.onMouseDown = this.onMouseDown.bind(this);\n this.onTouchStart = this.onTouchStart.bind(this);\n this.onMouseMove = this.onMouseMove.bind(this);\n this.onTouchMove = this.onTouchMove.bind(this);\n this.onMouseUp = this.onMouseUp.bind(this);\n\n // order of setting panel sizes.\n // 1. size\n // 2. getDefaultSize(defaultSize, minsize, maxSize)\n\n const { size, defaultSize, minSize, maxSize, primary } = props;\n\n const initialSize =\n size !== undefined\n ? size\n : getDefaultSize(defaultSize, minSize, maxSize, undefined);\n\n this.state = {\n active: false,\n resized: false,\n pane1Size: primary === 'first' ? initialSize : undefined,\n pane2Size: primary === 'second' ? initialSize : undefined,\n\n // these are props that are needed in static functions. ie: gDSFP\n instanceProps: {\n size,\n },\n };\n }\n\n componentDidMount() {\n document.addEventListener('mouseup', this.onMouseUp);\n document.addEventListener('mousemove', this.onMouseMove);\n document.addEventListener('touchmove', this.onTouchMove);\n this.setState(SplitPane.getSizeUpdate(this.props, this.state));\n }\n\n static getDerivedStateFromProps(\n nextProps: SplitPaneProps,\n prevState: SplitPaneState\n ) {\n return SplitPane.getSizeUpdate(nextProps, prevState);\n }\n\n componentWillUnmount() {\n document.removeEventListener('mouseup', this.onMouseUp);\n document.removeEventListener('mousemove', this.onMouseMove);\n document.removeEventListener('touchmove', this.onTouchMove);\n }\n\n onMouseDown(event: MouseEvent) {\n this.onTouchStart({\n ...event,\n touches: [{ clientX: event.clientX, clientY: event.clientY }],\n });\n }\n\n onTouchStart(event: MinimalTouchEvent | TouchEvent) {\n const { allowResize, onDragStarted, split } = this.props;\n if (allowResize) {\n unFocus(document, window);\n const position =\n split === 'vertical'\n ? event.touches[0].clientX\n : event.touches[0].clientY;\n\n if (typeof onDragStarted === 'function') {\n onDragStarted();\n }\n this.setState({\n active: true,\n position,\n });\n }\n }\n\n onMouseMove(event: MouseEvent) {\n const eventWithTouches = Object.assign({}, event, {\n touches: [{ clientX: event.clientX, clientY: event.clientY }],\n });\n this.onTouchMove(eventWithTouches);\n }\n\n onTouchMove(event: MinimalTouchEvent | TouchEvent) {\n if (!this.state.active || !this.props.allowResize) {\n return;\n }\n\n const { position = 0 } = this.state;\n const {\n maxSize,\n minSize = SplitPane.defaultProps.minSize,\n onChange,\n split = SplitPane.defaultProps.split,\n step,\n } = this.props;\n\n unFocus(document, window);\n const isPrimaryFirst = this.props.primary === 'first';\n const ref = isPrimaryFirst ? this.pane1 : this.pane2;\n const ref2 = isPrimaryFirst ? this.pane2 : this.pane1;\n\n if (!ref || !ref2 || !ref.getBoundingClientRect) {\n return;\n }\n\n const node = ref;\n const node2 = ref2;\n\n const width = node.getBoundingClientRect().width;\n const height = node.getBoundingClientRect().height;\n const current =\n split === 'vertical'\n ? event.touches[0].clientX\n : event.touches[0].clientY;\n const size = split === 'vertical' ? width : height;\n\n let positionDelta = position - current;\n if (step) {\n if (Math.abs(positionDelta) < step) {\n return;\n }\n // Integer division\n positionDelta = ~~(positionDelta / step) * step;\n }\n let sizeDelta = isPrimaryFirst ? positionDelta : -positionDelta;\n\n const pane1Order = parseInt(window.getComputedStyle(node).order);\n const pane2Order = parseInt(window.getComputedStyle(node2).order);\n if (pane1Order > pane2Order) {\n sizeDelta = -sizeDelta;\n }\n\n let newMaxSize = maxSize;\n if (this.splitPane && maxSize !== undefined && maxSize <= 0) {\n if (split === 'vertical') {\n newMaxSize = this.splitPane.getBoundingClientRect().width + maxSize;\n } else {\n newMaxSize = this.splitPane.getBoundingClientRect().height + maxSize;\n }\n }\n\n let newSize = size - sizeDelta;\n const newPosition = position - positionDelta;\n\n if (minSize && newSize < minSize) {\n newSize = minSize;\n } else if (newMaxSize !== undefined && newSize > newMaxSize) {\n newSize = newMaxSize;\n } else {\n this.setState({\n position: newPosition,\n resized: true,\n });\n }\n\n if (onChange) onChange(newSize);\n\n const sizeState = isPrimaryFirst\n ? { pane1Size: newSize, pane2Size: undefined }\n : { pane2Size: newSize, pane1Size: undefined };\n\n this.setState({ draggedSize: newSize, ...sizeState });\n }\n\n onMouseUp() {\n if (!this.state.active || !this.props.allowResize) {\n return;\n }\n\n const { onDragFinished } = this.props;\n const { draggedSize } = this.state;\n\n if (\n typeof draggedSize !== 'undefined' &&\n typeof onDragFinished === 'function'\n ) {\n onDragFinished(draggedSize);\n }\n\n this.setState({ active: false });\n }\n\n // we have to check values since gDSFP is called on every render and more in StrictMode\n static getSizeUpdate(props: SplitPaneProps, state: SplitPaneState) {\n const { instanceProps } = state;\n\n if (instanceProps.size === props.size && props.size !== undefined) {\n return {};\n }\n\n const newSize =\n props.size !== undefined\n ? props.size\n : getDefaultSize(\n props.defaultSize,\n props.minSize,\n props.maxSize,\n state.draggedSize\n );\n\n const isPrimaryFirst = props.primary === 'first';\n const sizeState = isPrimaryFirst\n ? { pane1Size: newSize, pane2Size: undefined }\n : { pane2Size: newSize, pane1Size: undefined };\n\n return {\n ...sizeState,\n ...(typeof props.size === 'undefined' ? {} : { draggedSize: newSize }),\n instanceProps: { size: props.size },\n };\n }\n\n render() {\n const {\n allowResize,\n children,\n className,\n onResizerClick,\n onResizerDoubleClick,\n paneClassName,\n pane1ClassName,\n pane2ClassName,\n paneStyle,\n pane1Style: pane1StyleProps,\n pane2Style: pane2StyleProps,\n resizerClassName = RESIZER_DEFAULT_CLASSNAME,\n resizerStyle,\n split,\n style: styleProps,\n } = this.props;\n\n const { pane1Size, pane2Size } = this.state;\n\n const disabledClass = allowResize ? '' : 'disabled';\n const resizerClassNamesIncludingDefault = resizerClassName\n ? `${resizerClassName} ${RESIZER_DEFAULT_CLASSNAME}`\n : resizerClassName;\n\n const notNullChildren = removeNullChildren(children);\n\n const baseStyles =\n split === 'vertical' ? VERTICAL_STYLES : HORIZONTAL_STYLES;\n\n const style: CSSProperties = styleProps\n ? { ...baseStyles, ...styleProps }\n : baseStyles;\n\n const classes = ['SplitPane', className, split, disabledClass]\n .filter(Boolean)\n .join(' ');\n\n const pane1Style = coalesceOnEmpty(\n { ...paneStyle, ...pane1StyleProps },\n EMPTY_STYLES\n );\n const pane2Style = coalesceOnEmpty(\n { ...paneStyle, ...pane2StyleProps },\n EMPTY_STYLES\n );\n\n const pane1Classes = ['Pane1', paneClassName, pane1ClassName].join(' ');\n const pane2Classes = ['Pane2', paneClassName, pane2ClassName].join(' ');\n\n return (\n <div\n data-testid=\"split-pane\"\n className={classes}\n style={style}\n ref={(node) => {\n this.splitPane = node;\n }}\n >\n <Pane\n className={pane1Classes}\n key=\"pane1\"\n eleRef={(node) => {\n this.pane1 = node;\n }}\n size={pane1Size}\n split={split}\n style={pane1Style}\n >\n {notNullChildren[0]}\n </Pane>\n <Resizer\n className={disabledClass}\n onClick={onResizerClick}\n onDoubleClick={onResizerDoubleClick}\n onMouseDown={this.onMouseDown}\n onTouchStart={this.onTouchStart}\n onTouchEnd={this.onMouseUp}\n key=\"resizer\"\n resizerClassName={resizerClassNamesIncludingDefault}\n split={split || 'vertical'}\n style={resizerStyle || EMPTY_STYLES}\n />\n <Pane\n className={pane2Classes}\n key=\"pane2\"\n eleRef={(node) => {\n this.pane2 = node;\n }}\n size={pane2Size}\n split={split}\n style={pane2Style}\n >\n {notNullChildren[1]}\n </Pane>\n </div>\n );\n }\n}\n\nfunction unFocus(\n document: (typeof globalThis)['document'],\n window: (typeof globalThis)['window']\n) {\n if (\n 'selection' in document &&\n typeof document.selection === 'object' &&\n document.selection &&\n 'empty' in document.selection &&\n typeof document.selection.empty === 'function'\n ) {\n try {\n document.selection.empty();\n } catch (e) {}\n } else if (\n typeof window !== 'undefined' &&\n typeof window.getSelection === 'function'\n ) {\n try {\n window.getSelection()?.removeAllRanges();\n } catch (e) {}\n }\n}\n\nfunction getDefaultSize(\n defaultSize: number | undefined,\n minSize: number | undefined,\n maxSize: number | undefined,\n draggedSize: number | undefined\n) {\n if (typeof draggedSize === 'number') {\n const min = typeof minSize === 'number' ? minSize : 0;\n const max =\n typeof maxSize === 'number' && maxSize >= 0 ? maxSize : Infinity;\n return Math.max(min, Math.min(max, draggedSize));\n }\n if (defaultSize !== undefined) {\n return defaultSize;\n }\n return minSize;\n}\n\nfunction removeNullChildren(children: ReactNode): ReactNode[] {\n return Children.toArray(children).filter((c) => c);\n}\n\nfunction isEmptyish(obj: Record<string, unknown> | null | undefined): boolean {\n return (\n obj === null || typeof obj === 'undefined' || Object.keys(obj).length === 0\n );\n}\n\nfunction coalesceOnEmpty<T>(\n obj: Record<string, unknown> | null | undefined,\n useOnEmpty: T\n): T {\n return isEmptyish(obj) ? useOnEmpty : (obj as T);\n}\n"],"names":["__spreadValues","jsx","_SplitPane","Component","jsxs","document","window","Children"],"mappings":"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"}