{"version":3,"file":"utils.mjs","sources":["../../../../../../packages/components/anchor/src/utils.ts"],"sourcesContent":["import { rAF } from '@sgui-plus/utils/raf'\r\n\r\ninterface ScrollToOptions {\r\n  /** Scroll container, default as window */\r\n  container?: HTMLElement | Window | Document\r\n  /** Scroll end callback */\r\n  callback?: () => any\r\n  /** Animation duration, default as 450 */\r\n  duration?: number\r\n}\r\n\r\nexport function isWindow(obj: any): obj is Window {\r\n  return obj !== null && obj !== undefined && obj === obj.window\r\n}\r\n\r\nexport function getScroll(\r\n  target: HTMLElement | Window | Document | null,\r\n  top: boolean\r\n): number {\r\n  if (typeof window === 'undefined') {\r\n    return 0\r\n  }\r\n  const method = top ? 'scrollTop' : 'scrollLeft'\r\n  let result = 0\r\n  if (isWindow(target)) {\r\n    result = target[top ? 'pageYOffset' : 'pageXOffset']\r\n  } else if (target instanceof Document) {\r\n    result = target.documentElement[method]\r\n  } else if (target instanceof HTMLElement) {\r\n    result = target[method]\r\n  } else if (target) {\r\n    // According to the type inference, the `target` is `never` type.\r\n    // Since we configured the loose mode type checking, and supports mocking the target with such shape below::\r\n    //    `{ documentElement: { scrollLeft: 200, scrollTop: 400 } }`,\r\n    //    the program may falls into this branch.\r\n    // Check the corresponding tests for details. Don't sure what is the real scenario this happens.\r\n    result = target[method]\r\n  }\r\n\r\n  if (target && !isWindow(target) && typeof result !== 'number') {\r\n    result = ((target.ownerDocument ?? target) as any).documentElement?.[method]\r\n  }\r\n  return result\r\n}\r\n\r\nexport function easeInOutCubic(t: number, b: number, c: number, d: number) {\r\n  const cc = c - b;\r\n  t /= d / 2;\r\n  if (t < 1) {\r\n    return (cc / 2) * t * t * t + b;\r\n  }\r\n  return (cc / 2) * ((t -= 2) * t * t + 2) + b;\r\n}\r\n\r\nexport function moveScroll(y: number, options: ScrollToOptions = {}) {\r\n  const { container, callback, duration = 450 } = options\r\n\r\n  const scrollTop = getScroll(container as HTMLElement, true)\r\n  const startTime = Date.now()\r\n\r\n  const frameFunc = () => {\r\n    const timestamp = Date.now()\r\n    const time = timestamp - startTime\r\n    const nextScrollTop = easeInOutCubic(time > duration ? duration : time, scrollTop, y, duration)\r\n    if (isWindow(container)) {\r\n      (container as Window).scrollTo(window.pageXOffset, nextScrollTop)\r\n    } else if (container instanceof Document || container!.constructor.name === 'HTMLDocument') {\r\n      (container as Document).documentElement.scrollTop = nextScrollTop\r\n    } else {\r\n      (container as HTMLElement).scrollTop = nextScrollTop\r\n    }\r\n    if (time < duration) {\r\n      rAF(frameFunc)\r\n    } else if (typeof callback === 'function') {\r\n      callback()\r\n    }\r\n  }\r\n  rAF(frameFunc)\r\n}\r\n"],"names":[],"mappings":"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"}