{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n  Instance,\n  Modifier,\n  Placement,\n  VirtualElement,\n} from \"@popperjs/core\"\nimport type { PropGetter, Token } from \"@yamada-ui/core\"\nimport { createPopper } from \"@popperjs/core\"\nimport { useValue } from \"@yamada-ui/use-value\"\nimport { mergeRefs, noop } from \"@yamada-ui/utils\"\nimport { useCallback, useEffect, useRef } from \"react\"\n\nexport type PopperProperty = (typeof popperProperties)[number]\n\nexport const popperProperties = [\n  \"enabled\",\n  \"offset\",\n  \"gutter\",\n  \"preventOverflow\",\n  \"flip\",\n  \"matchWidth\",\n  \"boundary\",\n  \"eventListeners\",\n  \"strategy\",\n  \"placement\",\n  \"modifiers\",\n] as const\n\nexport interface UsePopperProps {\n  /**\n   * The boundary area for the popper. Used within the `preventOverflow` modifier.\n   *\n   * @default 'clippingParents'\n   */\n  boundary?: \"clippingParents\" | \"scrollParent\" | HTMLElement\n  /**\n   * Whether the popper.js should be enabled.\n   *\n   * @default true\n   */\n  enabled?: boolean\n  /**\n   * If provided, determines whether the popper will reposition itself on `scroll`  and `resize` of the window.\n   *\n   * @default true\n   */\n  eventListeners?: { resize?: boolean; scroll?: boolean } | boolean\n  /**\n   * If `true`, the popper will change its placement and flip when it's about to overflow its boundary area.\n   *\n   * @default true\n   */\n  flip?: boolean\n  /**\n   * The distance or margin between the reference and popper.\n   * It is used internally to create an `offset` modifier.\n   *\n   * @default 8\n   */\n  gutter?: Token<number>\n  /**\n   * If `true`, the popper will match the width of the reference at all times.\n   * It's useful for `autocomplete`, `date-picker` and `select` patterns.\n   *\n   * @default false\n   */\n  matchWidth?: boolean\n  /**\n   * Array of popper.js modifiers.\n   * Check the docs to see the list of possible modifiers you can pass.\n   *\n   * @see Docs https://popper.js.org/docs/v2/modifiers/\n   */\n  modifiers?: Partial<Modifier<string, any>>[]\n  /**\n   * The main and cross-axis offset to displace popper element from its reference element.\n   */\n  offset?: [number, number]\n  /**\n   * The placement of the popper relative to its reference.\n   *\n   * @default 'bottom'\n   */\n  placement?: Token<Placement>\n  /**\n   * If `true`, will prevent the popper from being cut off and ensure it's visible within the boundary area.\n   *\n   * @default true\n   */\n  preventOverflow?: boolean\n  /**\n   * The CSS positioning strategy to use.\n   *\n   * @default 'absolute'\n   */\n  strategy?: \"absolute\" | \"fixed\"\n}\n\nconst defaultEventListeners = {\n  resize: true,\n  scroll: true,\n}\n\nconst transforms: {\n  [key in Placement]?: string\n} = {\n  bottom: \"top center\",\n  \"bottom-end\": \"top right\",\n  \"bottom-start\": \"top left\",\n\n  left: \"right center\",\n  \"left-end\": \"right bottom\",\n  \"left-start\": \"right top\",\n\n  right: \"left center\",\n  \"right-end\": \"left bottom\",\n  \"right-start\": \"left top\",\n\n  top: \"bottom center\",\n  \"top-end\": \"bottom right\",\n  \"top-start\": \"bottom left\",\n}\n\nexport const usePopper = ({\n  boundary = \"clippingParents\",\n  enabled = true,\n  eventListeners = true,\n  flip = true,\n  gutter: _gutter = 8,\n  matchWidth,\n  modifiers,\n  offset,\n  placement: _placement = \"bottom\",\n  preventOverflow = true,\n  strategy = \"absolute\",\n}: UsePopperProps = {}) => {\n  const reference = useRef<Element | null | VirtualElement>(null)\n  const popper = useRef<HTMLElement | null>(null)\n  const instance = useRef<Instance | null>(null)\n\n  const gutter = useValue(_gutter)\n  const placement = useValue(_placement)\n\n  const cleanup = useRef(noop)\n\n  const setupPopper = useCallback(() => {\n    if (!enabled || !reference.current || !popper.current) return\n\n    cleanup.current()\n\n    const modifierTransformOrigin: Modifier<\"transformOrigin\", any> = {\n      name: \"transformOrigin\",\n      effect:\n        ({ state }) =>\n        () => {\n          state.elements.popper.style.setProperty(\n            \"--popper-transform-origin\",\n            transforms[state.placement] ?? \"\",\n          )\n        },\n      enabled: true,\n      fn: ({ state }) => {\n        state.elements.popper.style.setProperty(\n          \"--popper-transform-origin\",\n          transforms[state.placement] ?? \"\",\n        )\n      },\n      phase: \"write\",\n    }\n\n    const modifierEventListeners = {\n      name: \"eventListeners\",\n      ...(typeof eventListeners === \"object\"\n        ? {\n            enabled: true,\n            options: { ...defaultEventListeners, ...eventListeners },\n          }\n        : {\n            enabled: eventListeners,\n            options: defaultEventListeners,\n          }),\n    }\n\n    const modifierOffset = {\n      name: \"offset\",\n      options: { offset: offset ?? [0, gutter] },\n    }\n\n    const modifierFlip = {\n      name: \"flip\",\n      enabled: !!flip,\n      options: { padding: 8 },\n    }\n\n    const modifierPreventOverflow = {\n      name: \"preventOverflow\",\n      enabled: !!preventOverflow,\n      options: { boundary },\n    }\n\n    const modifierMatchWidth: Modifier<\"matchWidth\", any> = {\n      name: \"matchWidth\",\n      effect:\n        ({ state }) =>\n        () => {\n          state.elements.popper.style.width = `${\n            (state.elements.reference as HTMLElement).offsetWidth\n          }px`\n        },\n      enabled: !!matchWidth,\n      fn: ({ state }) => {\n        if (state.styles.popper)\n          state.styles.popper.width = `${state.rects.reference.width}px`\n      },\n      phase: \"beforeWrite\",\n      requires: [\"computeStyles\"],\n    }\n\n    instance.current = createPopper(reference.current, popper.current, {\n      modifiers: [\n        modifierTransformOrigin,\n        modifierMatchWidth,\n        modifierEventListeners,\n        modifierOffset,\n        modifierFlip,\n        modifierPreventOverflow,\n        ...(modifiers ?? []),\n      ],\n      placement,\n      strategy,\n    })\n\n    instance.current.forceUpdate()\n\n    cleanup.current = instance.current.destroy\n  }, [\n    placement,\n    enabled,\n    modifiers,\n    matchWidth,\n    eventListeners,\n    offset,\n    gutter,\n    flip,\n    preventOverflow,\n    boundary,\n    strategy,\n  ])\n\n  useEffect(() => {\n    return () => {\n      if (reference.current || popper.current) return\n\n      instance.current?.destroy()\n      instance.current = null\n    }\n  }, [])\n\n  const referenceRef = useCallback(\n    <T extends Element | VirtualElement>(el: null | T) => {\n      reference.current = el\n\n      setupPopper()\n    },\n    [setupPopper],\n  )\n\n  const getReferenceProps: PropGetter = useCallback(\n    (props = {}, ref = null) => ({\n      ...props,\n      ref: mergeRefs(referenceRef, ref),\n    }),\n    [referenceRef],\n  )\n\n  const popperRef = useCallback(\n    <T extends HTMLElement>(el: null | T) => {\n      popper.current = el\n\n      setupPopper()\n    },\n    [setupPopper],\n  )\n\n  const getPopperProps: PropGetter = useCallback(\n    (props = {}, ref = null) => ({\n      ...props,\n      ref: mergeRefs(popperRef, ref),\n      style: {\n        ...props.style,\n        inset: \"0 auto auto 0\",\n        minWidth: matchWidth ? undefined : \"max-content\",\n        position: strategy,\n      },\n    }),\n    [strategy, popperRef, matchWidth],\n  )\n\n  return {\n    forceUpdate: () => instance.current?.forceUpdate(),\n    popperRef,\n    referenceRef,\n    transformOrigin: \"var(--popper-transform-origin)\",\n    update: async () => instance.current?.update(),\n    getPopperProps,\n    getReferenceProps,\n  }\n}\n\nexport type UsePopperReturn = ReturnType<typeof usePopper>\n"],"mappings":";;;AAOA,SAAS,oBAAoB;AAC7B,SAAS,gBAAgB;AACzB,SAAS,WAAW,YAAY;AAChC,SAAS,aAAa,WAAW,cAAc;AAIxC,IAAM,mBAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAwEA,IAAM,wBAAwB;AAAA,EAC5B,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,IAAM,aAEF;AAAA,EACF,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,gBAAgB;AAAA,EAEhB,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,cAAc;AAAA,EAEd,OAAO;AAAA,EACP,aAAa;AAAA,EACb,eAAe;AAAA,EAEf,KAAK;AAAA,EACL,WAAW;AAAA,EACX,aAAa;AACf;AAEO,IAAM,YAAY,CAAC;AAAA,EACxB,WAAW;AAAA,EACX,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,QAAQ,UAAU;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW,aAAa;AAAA,EACxB,kBAAkB;AAAA,EAClB,WAAW;AACb,IAAoB,CAAC,MAAM;AACzB,QAAM,YAAY,OAAwC,IAAI;AAC9D,QAAM,SAAS,OAA2B,IAAI;AAC9C,QAAM,WAAW,OAAwB,IAAI;AAE7C,QAAM,SAAS,SAAS,OAAO;AAC/B,QAAM,YAAY,SAAS,UAAU;AAErC,QAAM,UAAU,OAAO,IAAI;AAE3B,QAAM,cAAc,YAAY,MAAM;AACpC,QAAI,CAAC,WAAW,CAAC,UAAU,WAAW,CAAC,OAAO,QAAS;AAEvD,YAAQ,QAAQ;AAEhB,UAAM,0BAA4D;AAAA,MAChE,MAAM;AAAA,MACN,QACE,CAAC,EAAE,MAAM,MACT,MAAM;AA1Jd;AA2JU,cAAM,SAAS,OAAO,MAAM;AAAA,UAC1B;AAAA,WACA,gBAAW,MAAM,SAAS,MAA1B,YAA+B;AAAA,QACjC;AAAA,MACF;AAAA,MACF,SAAS;AAAA,MACT,IAAI,CAAC,EAAE,MAAM,MAAM;AAjKzB;AAkKQ,cAAM,SAAS,OAAO,MAAM;AAAA,UAC1B;AAAA,WACA,gBAAW,MAAM,SAAS,MAA1B,YAA+B;AAAA,QACjC;AAAA,MACF;AAAA,MACA,OAAO;AAAA,IACT;AAEA,UAAM,yBAAyB;AAAA,MAC7B,MAAM;AAAA,MACN,GAAI,OAAO,mBAAmB,WAC1B;AAAA,QACE,SAAS;AAAA,QACT,SAAS,EAAE,GAAG,uBAAuB,GAAG,eAAe;AAAA,MACzD,IACA;AAAA,QACE,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACN;AAEA,UAAM,iBAAiB;AAAA,MACrB,MAAM;AAAA,MACN,SAAS,EAAE,QAAQ,0BAAU,CAAC,GAAG,MAAM,EAAE;AAAA,IAC3C;AAEA,UAAM,eAAe;AAAA,MACnB,MAAM;AAAA,MACN,SAAS,CAAC,CAAC;AAAA,MACX,SAAS,EAAE,SAAS,EAAE;AAAA,IACxB;AAEA,UAAM,0BAA0B;AAAA,MAC9B,MAAM;AAAA,MACN,SAAS,CAAC,CAAC;AAAA,MACX,SAAS,EAAE,SAAS;AAAA,IACtB;AAEA,UAAM,qBAAkD;AAAA,MACtD,MAAM;AAAA,MACN,QACE,CAAC,EAAE,MAAM,MACT,MAAM;AACJ,cAAM,SAAS,OAAO,MAAM,QAAQ,GACjC,MAAM,SAAS,UAA0B,WAC5C;AAAA,MACF;AAAA,MACF,SAAS,CAAC,CAAC;AAAA,MACX,IAAI,CAAC,EAAE,MAAM,MAAM;AACjB,YAAI,MAAM,OAAO;AACf,gBAAM,OAAO,OAAO,QAAQ,GAAG,MAAM,MAAM,UAAU,KAAK;AAAA,MAC9D;AAAA,MACA,OAAO;AAAA,MACP,UAAU,CAAC,eAAe;AAAA,IAC5B;AAEA,aAAS,UAAU,aAAa,UAAU,SAAS,OAAO,SAAS;AAAA,MACjE,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAI,gCAAa,CAAC;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,aAAS,QAAQ,YAAY;AAE7B,YAAQ,UAAU,SAAS,QAAQ;AAAA,EACrC,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,YAAU,MAAM;AACd,WAAO,MAAM;AA1PjB;AA2PM,UAAI,UAAU,WAAW,OAAO,QAAS;AAEzC,qBAAS,YAAT,mBAAkB;AAClB,eAAS,UAAU;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe;AAAA,IACnB,CAAqC,OAAiB;AACpD,gBAAU,UAAU;AAEpB,kBAAY;AAAA,IACd;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,oBAAgC;AAAA,IACpC,CAAC,QAAQ,CAAC,GAAG,MAAM,UAAU;AAAA,MAC3B,GAAG;AAAA,MACH,KAAK,UAAU,cAAc,GAAG;AAAA,IAClC;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,YAAY;AAAA,IAChB,CAAwB,OAAiB;AACvC,aAAO,UAAU;AAEjB,kBAAY;AAAA,IACd;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,iBAA6B;AAAA,IACjC,CAAC,QAAQ,CAAC,GAAG,MAAM,UAAU;AAAA,MAC3B,GAAG;AAAA,MACH,KAAK,UAAU,WAAW,GAAG;AAAA,MAC7B,OAAO;AAAA,QACL,GAAG,MAAM;AAAA,QACT,OAAO;AAAA,QACP,UAAU,aAAa,SAAY;AAAA,QACnC,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,CAAC,UAAU,WAAW,UAAU;AAAA,EAClC;AAEA,SAAO;AAAA,IACL,aAAa,MAAG;AA3SpB;AA2SuB,4BAAS,YAAT,mBAAkB;AAAA;AAAA,IACrC;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,QAAQ,YAAS;AA/SrB;AA+SwB,4BAAS,YAAT,mBAAkB;AAAA;AAAA,IACtC;AAAA,IACA;AAAA,EACF;AACF;","names":[]}