{"version":3,"file":"Splitter.cjs","names":["createVarsResolver","rem","getThemeColor","factory","useProps","useDirection","Children","useStyles","GripHorizontalIcon","GripVerticalIcon","Box","SplitterProvider","classes","SplitterPane"],"sources":["../../../src/components/Splitter/Splitter.tsx"],"sourcesContent":["import { Children, cloneElement, useImperativeHandle } from 'react';\nimport {\n  SplitterPaneSize,\n  SplitterStep,\n  useMergedRef,\n  useSplitter,\n  UseSplitterRedistributeFn,\n  UseSplitterReturnValue,\n} from '@mantine/hooks';\nimport {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  getThemeColor,\n  MantineColor,\n  rem,\n  StylesApiProps,\n  useDirection,\n  useProps,\n  useStyles,\n} from '../../core';\nimport { GripHorizontalIcon, GripVerticalIcon } from './GripIcon';\nimport { SplitterProvider } from './Splitter.context';\nimport {\n  SplitterPane,\n  SplitterPaneProps,\n  SplitterPaneStylesNames,\n} from './SplitterPane/SplitterPane';\nimport classes from './Splitter.module.css';\n\nconst PX_RE = /^(-?[\\d.]+)px$/;\nconst REM_RE = /^(-?[\\d.]+)rem$/;\n\nfunction isFixedPaneSize(size: SplitterPaneSize): boolean {\n  return typeof size === 'string' && (PX_RE.test(size) || REM_RE.test(size));\n}\n\nfunction getPaneFlexStyle(size: SplitterPaneSize, pixelMode: boolean): React.CSSProperties {\n  const magnitude = typeof size === 'number' ? size : parseFloat(size);\n\n  if (!pixelMode) {\n    return { flexBasis: `${magnitude}%` };\n  }\n\n  if (isFixedPaneSize(size)) {\n    return { flexGrow: 0, flexShrink: 1, flexBasis: size as string };\n  }\n\n  return { flexGrow: magnitude, flexShrink: 1, flexBasis: 0 };\n}\n\nexport type SplitterStylesNames = 'root' | 'handle' | 'thumb' | SplitterPaneStylesNames;\n\nexport type SplitterCssVariables = {\n  root: '--splitter-line-size' | '--splitter-handle-color';\n};\n\nexport interface SplitterProps\n  extends BoxProps, StylesApiProps<SplitterFactory>, ElementProps<'div'> {\n  /** Layout direction @default 'horizontal' */\n  orientation?: 'horizontal' | 'vertical';\n\n  /** Controlled sizes, each value keeps the unit it was declared in (number/`%` flexible, `px`/`rem` fixed) */\n  sizes?: SplitterPaneSize[];\n\n  /** Called during resize with updated sizes, each value keeps its declared unit */\n  onSizeChange?: (sizes: SplitterPaneSize[]) => void;\n\n  /** Called when drag starts */\n  onResizeStart?: (handleIndex: number) => void;\n\n  /** Called when drag ends */\n  onResizeEnd?: (handleIndex: number, sizes: SplitterPaneSize[]) => void;\n\n  /** Called when a panel collapses or expands */\n  onCollapseChange?: (panelIndex: number, collapsed: boolean) => void;\n\n  /** How to redistribute space when immediate neighbor is at its min/max */\n  redistribute?: 'nearest' | 'equal' | UseSplitterRedistributeFn;\n\n  /** Keyboard step size, a `number`/`%` is a percentage, `px`/`rem` is resolved to pixels @default 1 */\n  step?: SplitterStep;\n\n  /** Shift+arrow step size, a `number`/`%` is a percentage, `px`/`rem` is resolved to pixels @default 10 */\n  shiftStep?: SplitterStep;\n\n  /** CSS value for separator line thickness between panes @default 2 */\n  lineSize?: number | string;\n\n  /** Key of `theme.colors` or any valid CSS color for the separator line */\n  handleColor?: MantineColor;\n\n  /** Custom icon displayed in the handle thumb, by default uses grip icon based on orientation */\n  handleIcon?: React.ReactNode;\n\n  /** Determines whether the thumb with grip icon is displayed on the handle @default true */\n  withHandle?: boolean;\n\n  /** Restore the two panes adjacent to a handle to their default ratio (preserving their combined size) when the handle is double-clicked @default true */\n  resetOnDoubleClick?: boolean;\n\n  /** Ref to imperative splitter API (sizes, collapse, expand, etc.) */\n  splitterRef?: React.RefObject<UseSplitterReturnValue | null>;\n\n  /** Splitter panes */\n  children?: React.ReactNode;\n}\n\nexport type SplitterFactory = Factory<{\n  props: SplitterProps;\n  ref: HTMLDivElement;\n  stylesNames: SplitterStylesNames;\n  vars: SplitterCssVariables;\n  staticComponents: {\n    Pane: typeof SplitterPane;\n  };\n}>;\n\nconst defaultProps = {\n  orientation: 'horizontal',\n  lineSize: 2,\n  withHandle: true,\n  resetOnDoubleClick: true,\n} satisfies Partial<SplitterProps>;\n\nconst varsResolver = createVarsResolver<SplitterFactory>((theme, { lineSize, handleColor }) => ({\n  root: {\n    '--splitter-line-size': rem(lineSize),\n    '--splitter-handle-color': handleColor ? getThemeColor(handleColor, theme) : undefined,\n  },\n}));\n\nexport const Splitter = factory<SplitterFactory>((_props) => {\n  const props = useProps('Splitter', defaultProps, _props);\n  const {\n    orientation,\n    sizes: controlledSizes,\n    onSizeChange,\n    onResizeStart,\n    onResizeEnd,\n    onCollapseChange,\n    redistribute,\n    step,\n    shiftStep,\n    lineSize,\n    handleColor,\n    handleIcon,\n    withHandle,\n    resetOnDoubleClick,\n    splitterRef,\n    children,\n    className,\n    classNames,\n    style,\n    styles,\n    unstyled,\n    vars,\n    mod,\n    attributes,\n    ref,\n    ...others\n  } = props;\n\n  const { dir } = useDirection();\n\n  const paneChildren = Children.toArray(children) as React.ReactElement<SplitterPaneProps>[];\n\n  const panels = paneChildren.map((child) => ({\n    defaultSize: child.props.defaultSize,\n    min: child.props.min,\n    max: child.props.max,\n    collapsible: child.props.collapsible,\n    collapseThreshold: child.props.collapseThreshold,\n  }));\n\n  const splitter = useSplitter({\n    panels,\n    orientation,\n    sizes: controlledSizes,\n    onSizeChange,\n    onResizeStart,\n    onResizeEnd,\n    onCollapseChange,\n    redistribute,\n    step,\n    shiftStep,\n    dir,\n    resetOnDoubleClick,\n  });\n\n  useImperativeHandle(splitterRef, () => splitter, [splitter]);\n\n  const getPaneStyle = (index: number) =>\n    getPaneFlexStyle(splitter.sizes[index], splitter.pixelMode);\n\n  const mergedRef = useMergedRef(ref, splitter.ref);\n\n  const getStyles = useStyles<SplitterFactory>({\n    name: 'Splitter',\n    classes,\n    props,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    attributes,\n    vars,\n    varsResolver,\n  });\n\n  const defaultIcon = orientation === 'vertical' ? <GripHorizontalIcon /> : <GripVerticalIcon />;\n  const thumbIcon = handleIcon !== undefined ? handleIcon : defaultIcon;\n\n  const items: React.ReactNode[] = [];\n\n  paneChildren.forEach((child, index) => {\n    if (index > 0) {\n      const handleProps = splitter.getHandleProps({ index: index - 1 });\n      const isActive = splitter.activeHandle === index - 1;\n      items.push(\n        <Box {...getStyles('handle')} key={`handle-${index - 1}`} {...handleProps}>\n          {withHandle && (\n            <div\n              {...getStyles('thumb')}\n              data-orientation={orientation}\n              data-active={isActive || undefined}\n            >\n              {thumbIcon}\n            </div>\n          )}\n        </Box>\n      );\n    }\n\n    items.push(\n      cloneElement(child, {\n        key: `pane-${index}`,\n        __index: index,\n      })\n    );\n  });\n\n  return (\n    <SplitterProvider\n      value={{\n        getStyles,\n        sizes: splitter.sizes,\n        collapsed: splitter.collapsed,\n        orientation: orientation!,\n        getPaneStyle,\n      }}\n    >\n      <Box ref={mergedRef} {...getStyles('root')} mod={[{ orientation }, mod]} {...others}>\n        {items}\n      </Box>\n    </SplitterProvider>\n  );\n});\n\nSplitter.classes = classes;\nSplitter.varsResolver = varsResolver;\nSplitter.displayName = '@mantine/core/Splitter';\nSplitter.Pane = SplitterPane;\n"],"mappings":"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"}