{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["export type eventType = 'init' | 'scroll' | 'resize' | 'heightChange'\n\nexport interface Memory {\n  prevPosition?: number | null\n}\n\nexport interface CallbackParams {\n  position: number\n  prevPosition: number\n  hasUpdated: boolean\n  eventType: eventType\n  hasScroll: boolean\n  eventDate: number\n}\n\nexport interface PositionIndicatorInstance {\n  init: () => void\n  destroy: () => void\n}\n\nexport interface Options {\n  onInit?: (data: CallbackParams) => {} | void\n  onUpdate: (data: CallbackParams) => {} | void\n  useResizeListener?: boolean\n  useResizeObserver?: boolean\n}\n\ninterface Events {\n  onScroll?: () => void\n  onResize?: () => void\n  onHeightChange?: () => void\n  resizeObserver?: ResizeObserver\n}\n\nlet _getFullDocumentHeight = () =>\n  Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)\n\nlet _getViewPortHeight = () => window.innerHeight\n\nlet _getScrollYPosition = () => window.pageYOffset\n\nlet _hasScroll = () => _getFullDocumentHeight() > _getViewPortHeight()\n\nlet _clamp = (value: number, min: number, max: number) =>\n  Math.min(Math.max(value, min), max)\n\nlet _onUpdate = (eventType: eventType, memory: Memory): CallbackParams => {\n  let fullDocumentHeight = _getFullDocumentHeight()\n  let viewPortHeight = _getViewPortHeight()\n  let scrollYPosition = _getScrollYPosition()\n\n  let relative = fullDocumentHeight - viewPortHeight\n  let position = _clamp(scrollYPosition / (relative || 1), 0, 1)\n  let prevPosition = memory.prevPosition\n  memory.prevPosition = position\n  return {\n    position,\n    prevPosition,\n    hasUpdated: position !== prevPosition,\n    eventType,\n    hasScroll: _hasScroll(),\n    eventDate: Date.now(),\n  }\n}\n\nlet _init = (\n  {\n    onInit: initCallback,\n    onUpdate: updateCallback,\n    useResizeListener = true,\n    useResizeObserver = true,\n  }: Options,\n  events: Events,\n  memory: Memory,\n) => {\n  events.onScroll = () => {\n    if (updateCallback) {\n      updateCallback(_onUpdate('scroll', memory))\n    }\n  }\n  if (useResizeListener) {\n    events.onResize = () => {\n      if (updateCallback) {\n        updateCallback(_onUpdate('resize', memory))\n      }\n    }\n  }\n\n  if (useResizeObserver) {\n    events.onHeightChange = () => {\n      if (updateCallback) {\n        updateCallback(_onUpdate('heightChange', memory))\n      }\n    }\n\n    if (typeof ResizeObserver !== 'undefined') {\n      events.resizeObserver = new ResizeObserver(events.onHeightChange)\n      events.resizeObserver.observe(document.body)\n    }\n  }\n\n  /**\n   * Throttling for event is not used.\n   * Because it has the same effect same as rAF.\n   * https://stackoverflow.com/a/44779316/815507\n   */\n  window.addEventListener('scroll', events.onScroll)\n  window.addEventListener('resize', events.onResize)\n\n  initCallback && initCallback(_onUpdate('init', memory))\n}\n\nlet _destroy = (events: Events) => {\n  events.onScroll && window.removeEventListener('scroll', events.onScroll)\n  events.onResize && window.removeEventListener('resize', events.onResize)\n  events.resizeObserver && events.resizeObserver.unobserve(document.body)\n}\n\nexport const createPositionIndicator = (\n  options: Options,\n): PositionIndicatorInstance => {\n  let events: Events = {\n    onScroll: null,\n    onResize: null,\n    onHeightChange: null,\n    resizeObserver: null,\n  }\n  let memory: Memory = {}\n\n  return {\n    init: () => _init(options, events, memory),\n    destroy: () => {\n      _destroy(events)\n      events = {}\n      memory = {}\n    },\n  }\n}\n"],"names":[],"mappings":"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"}