{"version":3,"file":"useComboboxFloat.mjs","sources":["../../../../src/components/Combobox/useComboboxFloat.ts"],"sourcesContent":["import { autoUpdate, autoPlacement, size, useFloating } from '@floating-ui/react';\nimport { useMemo, useRef, useState } from 'react';\n\nimport { BOUNDARY_ELEMENT_ID } from '../../utils/floating';\nimport { measureText } from '../../utils/measureText';\n\nimport {\n  MENU_ITEM_FONT_SIZE,\n  MENU_ITEM_FONT_WEIGHT,\n  MENU_ITEM_PADDING,\n  MENU_OPTION_HEIGHT,\n  POPOVER_MAX_HEIGHT,\n} from './getComboboxStyles';\nimport { ComboboxOption } from './types';\n\n// Only consider the first n items when calculating the width of the popover.\nconst WIDTH_CALCULATION_LIMIT_ITEMS = 100_000;\n\n// Clearance around the popover to prevent it from being too close to the edge of the viewport\nconst POPOVER_PADDING = 16;\n\nconst SCROLL_CONTAINER_PADDING = 8;\n\nexport const useComboboxFloat = (items: Array<ComboboxOption<string | number>>, isOpen: boolean) => {\n  const inputRef = useRef<HTMLInputElement>(null);\n  const floatingRef = useRef<HTMLDivElement>(null);\n  const scrollRef = useRef<HTMLDivElement>(null);\n  const [popoverMaxSize, setPopoverMaxSize] = useState<{ width: number; height: number }>({\n    width: 0,\n    height: 0,\n  }); // set initial values to prevent infinite size, briefly removing the list virtualization\n\n  const scrollbarWidth = useMemo(() => getScrollbarWidth(), []);\n\n  // the order of middleware is important!\n  const middleware = [\n    autoPlacement({\n      // see https://floating-ui.com/docs/autoplacement\n      allowedPlacements: ['bottom-start', 'bottom-end', 'top-start', 'top-end'],\n      boundary: document.getElementById(BOUNDARY_ELEMENT_ID) ?? undefined,\n      crossAxis: true,\n    }),\n    size({\n      apply({ availableWidth, availableHeight }) {\n        const preferredMaxWidth = availableWidth - POPOVER_PADDING;\n        const preferredMaxHeight = availableHeight - POPOVER_PADDING;\n\n        const width = Math.max(preferredMaxWidth, 0);\n        const height = Math.min(Math.max(preferredMaxHeight, MENU_OPTION_HEIGHT * 6), POPOVER_MAX_HEIGHT);\n\n        setPopoverMaxSize({ width, height });\n      },\n    }),\n  ];\n  const elements = { reference: inputRef.current, floating: floatingRef.current };\n  const { floatingStyles } = useFloating({\n    strategy: 'fixed',\n    open: isOpen,\n    placement: 'bottom-start',\n    middleware,\n    elements,\n    whileElementsMounted: autoUpdate,\n  });\n\n  const longestItemWidth = useMemo(() => {\n    let longestItem = '';\n    const itemsToLookAt = Math.min(items.length, WIDTH_CALCULATION_LIMIT_ITEMS);\n\n    for (let i = 0; i < itemsToLookAt; i++) {\n      const itemLabel = items[i].label ?? items[i].value.toString();\n      longestItem = itemLabel.length > longestItem.length ? itemLabel : longestItem;\n    }\n\n    const size = measureText(longestItem, MENU_ITEM_FONT_SIZE, MENU_ITEM_FONT_WEIGHT).width;\n\n    return size + SCROLL_CONTAINER_PADDING + MENU_ITEM_PADDING * 2 + scrollbarWidth;\n  }, [items, scrollbarWidth]);\n\n  const floatStyles = {\n    ...floatingStyles,\n    width: longestItemWidth,\n    maxWidth: popoverMaxSize.width,\n    minWidth: inputRef.current?.offsetWidth,\n\n    maxHeight: popoverMaxSize.height,\n  };\n\n  return { inputRef, floatingRef, scrollRef, floatStyles };\n};\n\n// Creates a temporary div with a scrolling inner div to calculate the width of the scrollbar\nfunction getScrollbarWidth(): number {\n  const outer = document.createElement('div');\n  outer.style.visibility = 'hidden';\n  outer.style.overflow = 'scroll';\n  document.body.appendChild(outer);\n\n  const inner = document.createElement('div');\n  outer.appendChild(inner);\n\n  const scrollbarWidth = outer.offsetWidth - inner.offsetWidth;\n\n  outer.parentNode?.removeChild(outer);\n\n  return scrollbarWidth;\n}\n"],"names":["_a","size"],"mappings":"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"}