{"version":3,"file":"useScrollTo.utils.cjs","names":[],"sources":["../../../src/hooks/useScrollTo/useScrollTo.utils.ts"],"sourcesContent":["import { isWindow } from '@modern-kit/utils';\n\nexport interface ScrollToElementOptions {\n  offsetX?: number;\n  offsetY?: number;\n  behavior?: ScrollBehavior;\n  alignY?: Align; // 수직\n  alignX?: Align; // 수평\n}\n\ntype Align = 'start' | 'center' | 'end';\n\ninterface Position {\n  top: number;\n  left: number;\n}\n\ntype CalculatePositionOptions = Required<\n  Pick<ScrollToElementOptions, 'offsetX' | 'offsetY' | 'alignX' | 'alignY'>\n>;\n\n/**\n * @description 컨테이너 내에서 타겟 요소의 정렬 위치를 계산합니다.\n */\nconst getAlignPosition = (\n  containerDimension: number,\n  targetDimension: number,\n  align: Align\n) => {\n  if (align === 'start') {\n    return 0;\n  }\n  if (align === 'center') {\n    return -containerDimension / 2 + targetDimension / 2;\n  }\n  return -containerDimension + targetDimension;\n};\n\n/**\n * @description 윈도우를 기준으로 타겟 요소의 위치를 계산합니다.\n */\nconst calculateTargetPositionFromWindow = (\n  targetRect: DOMRect,\n  options: CalculatePositionOptions\n): Position => ({\n  top:\n    targetRect.top +\n    window.scrollY +\n    options.offsetY +\n    getAlignPosition(window.innerHeight, targetRect.height, options.alignY),\n  left:\n    targetRect.left +\n    window.scrollX +\n    options.offsetX +\n    getAlignPosition(window.innerWidth, targetRect.width, options.alignX),\n});\n\n/**\n * @description 특정 컨테이너 요소를 기준으로 타겟 요소의 스크롤 위치를 계산합니다.\n */\nconst calculateTargetPositionFromElement = (\n  targetRect: DOMRect,\n  container: HTMLElement,\n  options: CalculatePositionOptions\n): Position => {\n  const containerRect = container.getBoundingClientRect();\n\n  return {\n    top:\n      targetRect.top -\n      containerRect.top +\n      container.scrollTop +\n      options.offsetY +\n      getAlignPosition(containerRect.height, targetRect.height, options.alignY),\n    left:\n      targetRect.left -\n      containerRect.left +\n      container.scrollLeft +\n      options.offsetX +\n      getAlignPosition(containerRect.width, targetRect.width, options.alignX),\n  };\n};\n\n/**\n * @description parent가 window인지 특정 요소인지에 child의 위치 값을 가져오는 함수\n */\nexport const getRelativePosition = <T extends HTMLElement>(\n  container: T | Window,\n  target: HTMLElement,\n  scrollToOptions: ScrollToElementOptions\n): Position => {\n  const targetRect = target.getBoundingClientRect();\n  const options = {\n    offsetX: scrollToOptions?.offsetX ?? 0,\n    offsetY: scrollToOptions?.offsetY ?? 0,\n    alignY: scrollToOptions?.alignY ?? 'start',\n    alignX: scrollToOptions?.alignX ?? 'start',\n  };\n\n  return isWindow(container)\n    ? calculateTargetPositionFromWindow(targetRect, options)\n    : calculateTargetPositionFromElement(targetRect, container, options);\n};\n"],"mappings":";;;;;;AAwBA,MAAM,oBACJ,oBACA,iBACA,UACG;CACH,IAAI,UAAU,SACZ,OAAO;CAET,IAAI,UAAU,UACZ,OAAO,CAAC,qBAAqB,IAAI,kBAAkB;CAErD,OAAO,CAAC,qBAAqB;;;;;AAM/B,MAAM,qCACJ,YACA,aACc;CACd,KACE,WAAW,MACX,OAAO,UACP,QAAQ,UACR,iBAAiB,OAAO,aAAa,WAAW,QAAQ,QAAQ,OAAO;CACzE,MACE,WAAW,OACX,OAAO,UACP,QAAQ,UACR,iBAAiB,OAAO,YAAY,WAAW,OAAO,QAAQ,OAAO;CACxE;;;;AAKD,MAAM,sCACJ,YACA,WACA,YACa;CACb,MAAM,gBAAgB,UAAU,uBAAuB;CAEvD,OAAO;EACL,KACE,WAAW,MACX,cAAc,MACd,UAAU,YACV,QAAQ,UACR,iBAAiB,cAAc,QAAQ,WAAW,QAAQ,QAAQ,OAAO;EAC3E,MACE,WAAW,OACX,cAAc,OACd,UAAU,aACV,QAAQ,UACR,iBAAiB,cAAc,OAAO,WAAW,OAAO,QAAQ,OAAO;EAC1E;;;;;AAMH,MAAa,uBACX,WACA,QACA,oBACa;CACb,MAAM,aAAa,OAAO,uBAAuB;CACjD,MAAM,UAAU;EACd,SAAS,iBAAiB,WAAW;EACrC,SAAS,iBAAiB,WAAW;EACrC,QAAQ,iBAAiB,UAAU;EACnC,QAAQ,iBAAiB,UAAU;EACpC;CAED,QAAA,GAAA,kBAAA,UAAgB,UAAU,GACtB,kCAAkC,YAAY,QAAQ,GACtD,mCAAmC,YAAY,WAAW,QAAQ"}