{"version":3,"file":"index.cjs","sources":["../src/scrollama-context.js","../src/scrollama.jsx","../src/step.jsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\n\n/**\n * @typedef {(ref: import(\"react\").RefObject<HTMLElement | null>) => void | (() => void)} RegisterStep\n */\n\nconst ScrollamaContext = createContext(\n  /** @type {RegisterStep | undefined} */ (undefined)\n);\n\n/**\n * @returns {RegisterStep}\n */\nconst useScrollamaContext = () => {\n  const context = useContext(ScrollamaContext);\n  if (typeof context !== \"function\") {\n    throw new Error(\"useScrollamaContext must be used within a ScrollamaProvider\");\n  }\n  return context;\n};\n\nexport { ScrollamaContext, useScrollamaContext };\n","import React, { useRef, useEffect, useCallback } from \"react\";\nimport { ScrollamaContext } from \"./scrollama-context\";\nimport scrollama from \"scrollama\";\n\n/**\n * @typedef {object} ScrollamaInstance\n * @property {(options: object) => ScrollamaInstance} setup\n * @property {(callback: Function) => ScrollamaInstance} onStepEnter\n * @property {(callback: Function) => ScrollamaInstance} onStepExit\n * @property {(callback: Function) => ScrollamaInstance} onStepProgress\n * @property {() => ScrollamaInstance} resize\n * @property {() => ScrollamaInstance} destroy\n */\n\nconst createScrollama =\n  /** @type {() => ScrollamaInstance} */ (\n    /** @type {unknown} */ (scrollama)\n  );\n\n/**\n * @typedef {object} StepCallbackResponse\n * @property {HTMLElement} element\n * @property {number} index\n * @property {\"up\" | \"down\"} direction\n */\n\n/**\n * @typedef {object} StepProgressCallbackResponse\n * @property {HTMLElement} element\n * @property {number} index\n * @property {number} progress\n * @property {\"up\" | \"down\"} [direction]\n */\n\n/**\n * @typedef {import(\"react\").HTMLAttributes<HTMLDivElement> & {\n *   children?: import(\"react\").ReactNode,\n *   offset?: number | `${number}px`,\n *   progress?: boolean,\n *   debug?: boolean,\n *   onStepEnter?: (response: StepCallbackResponse) => void,\n *   onStepExit?: (response: StepCallbackResponse) => void,\n *   onStepProgress?: (response: StepProgressCallbackResponse) => void,\n *   threshold?: number,\n *   once?: boolean,\n *   parent?: HTMLElement | Document\n * }} ScrollamaProps\n */\n\n/**\n * @param {ScrollamaProps} props\n */\nconst Scrollama = ({\n  children,\n  offset = 0.5,\n  progress = false,\n  debug = false,\n  onStepEnter = () => {},\n  onStepExit = () => {},\n  onStepProgress = () => {},\n  threshold = 4,\n  once = false,\n  parent = undefined,\n  ...primitiveProps\n}) => {\n  const scrollerRef = useRef(null);\n  const stepsRef = useRef([]);\n  const hasSetupRef = useRef(false);\n\n  const getScroller = useCallback(() => {\n    if (!scrollerRef.current) {\n      scrollerRef.current = createScrollama();\n    }\n    return scrollerRef.current;\n  }, []);\n\n  const initialize = useCallback(() => {\n    if (typeof window === \"undefined\") {\n      return;\n    }\n\n    const scroller = getScroller();\n\n    if (hasSetupRef.current) {\n      scroller.destroy();\n      hasSetupRef.current = false;\n    }\n\n    if (stepsRef.current.length === 0) {\n      return;\n    }\n\n    scroller\n      .setup({\n        step: stepsRef.current,\n        offset,\n        progress: progress ? true : false,\n        debug: debug ? true : false,\n        threshold,\n        once,\n        parent,\n      })\n      .onStepEnter(onStepEnter)\n      .onStepExit(onStepExit)\n      .onStepProgress(onStepProgress);\n\n    hasSetupRef.current = true;\n  }, [getScroller, offset, progress, debug, threshold, once, parent, onStepEnter, onStepExit, onStepProgress]);\n\n  const setupRef = useCallback(\n    /**\n     * @param {import(\"react\").RefObject<HTMLElement | null>} ref\n     */\n    (ref) => {\n      if (!ref || !ref.current) {\n        return undefined;\n      }\n\n      const element = ref.current;\n\n      if (!stepsRef.current.includes(element)) {\n        stepsRef.current.push(element);\n      }\n\n      initialize();\n\n      return () => {\n        stepsRef.current = stepsRef.current.filter((step) => step !== element);\n        initialize();\n      };\n    },\n    [initialize]\n  );\n\n  useEffect(() => {\n    initialize();\n  }, [initialize]);\n\n  useEffect(() => {\n    if (typeof window === \"undefined\") {\n      return undefined;\n    }\n\n    const scroller = getScroller();\n    window.addEventListener(\"resize\", scroller.resize);\n\n    return () => {\n      window.removeEventListener(\"resize\", scroller.resize);\n      scroller.destroy();\n      scrollerRef.current = null;\n      hasSetupRef.current = false;\n    };\n  }, [getScroller]);\n\n  return (\n    <div {...primitiveProps}>\n      <ScrollamaContext.Provider value={setupRef}>\n        {children}\n      </ScrollamaContext.Provider>\n    </div>\n  );\n};\n\nexport default Scrollama;\n","import React, { useRef, useEffect } from \"react\";\nimport { useScrollamaContext } from \"./scrollama-context\";\n\n/**\n * @typedef {import(\"react\").HTMLAttributes<HTMLDivElement> & {\n *   children?: import(\"react\").ReactNode\n * }} StepProps\n */\n\n/**\n * @param {StepProps} props\n */\nconst Step = ({ children, ...primitiveProps }) => {\n  /** @type {import(\"react\").RefObject<HTMLDivElement | null>} */\n  const stepRef = useRef(null);\n  const registerStep = useScrollamaContext();\n\n  useEffect(() => {\n    const remove = registerStep(stepRef);\n    return () => {\n      if (typeof remove === \"function\") {\n        remove();\n      }\n    };\n  }, [registerStep]);\n\n  return (\n    <div ref={stepRef} {...primitiveProps}>\n      {children}\n    </div>\n  );\n};\n\nexport default Step;\n"],"names":["ScrollamaContext","createContext","undefined","useScrollamaContext","context","useContext","Error","createScrollama","scrollama","Scrollama","_ref","children","_ref$offset","offset","_ref$progress","progress","_ref$debug","debug","_ref$onStepEnter","onStepEnter","_ref$onStepExit","onStepExit","_ref$onStepProgress","onStepProgress","_ref$threshold","threshold","_ref$once","once","_ref$parent","parent","primitiveProps","_objectWithoutProperties","_excluded","scrollerRef","useRef","stepsRef","hasSetupRef","getScroller","useCallback","current","initialize","window","scroller","destroy","length","setup","step","setupRef","ref","element","includes","push","filter","useEffect","addEventListener","resize","removeEventListener","React","createElement","Provider","value","Step","stepRef","registerStep","remove","_extends"],"mappings":"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"}