{"version":3,"sources":["../../src/use-focus/index.ts"],"sourcesContent":["import { useCreation } from '../use-creation'\nimport { useEventListener } from '../use-event-listener'\nimport { useMount } from '../use-mount'\nimport { useSafeState } from '../use-safe-state'\nimport { useStableFn } from '../use-stable-fn'\nimport { normalizeElement, useTargetElement } from '../use-target-element'\n\nimport type { ElementTarget } from '../use-target-element'\n\nexport interface UseFocusOptions {\n  /**\n   * initial focus state\n   *\n   * @defaultValue false\n   */\n  initialValue?: boolean\n}\n\nexport type UseFocusReturns = readonly [\n  /**\n   * focus state\n   */\n  focused: boolean,\n  /**\n   * focus actions\n   */\n  actions: {\n    /**\n     * focus the target element\n     */\n    focus(): void\n    /**\n     * blur the target element\n     */\n    blur(): void\n  },\n]\n\n/**\n * A React Hook that allows you to focus on an element when it is mounted.\n */\nexport function useFocus<T extends HTMLElement = HTMLElement>(\n  target: ElementTarget<T>,\n  options: UseFocusOptions = {},\n): UseFocusReturns {\n  const el = useTargetElement<T>(target)\n  const [focused, setFocused] = useSafeState(options?.initialValue ?? false)\n\n  useEventListener(el, 'focus', () => setFocused(true))\n  useEventListener(el, 'blur', () => setFocused(false))\n\n  useMount(() => {\n    const isCurrentFocused = isElActive(el)\n\n    if (focused && !isCurrentFocused) focus()\n    if (!focused && isCurrentFocused) setFocused(true)\n  })\n\n  const focus = useStableFn(() => el.current?.focus())\n  const blur = useStableFn(() => el.current?.blur())\n  const actions = useCreation(() => ({ focus, blur }))\n\n  return [focused, actions] as const\n}\n\nfunction isElActive<T extends HTMLElement>(target: ElementTarget<T>) {\n  return normalizeElement(target) === document.activeElement\n}\n"],"names":["useFocus","target","options","el","useTargetElement","useSafeState","initialValue","focused","setFocused","useEventListener","useMount","isCurrentFocused","isElActive","focus","useStableFn","current","blur","actions","useCreation","normalizeElement","document","activeElement"],"mappings":";;;;+BAyCgBA;;;eAAAA;;;2BAzCY;gCACK;wBACR;4BACI;2BACD;gCACuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoC5C,SAASA,SACdC,MAAwB;QACxBC,UAAAA,iEAA2B,CAAC;IAE5B,IAAMC,KAAKC,IAAAA,kCAAgB,EAAIH;QACYC;IAA3C,IAA8BG,iCAAAA,IAAAA,0BAAY,EAACH,CAAAA,wBAAAA,oBAAAA,8BAAAA,QAASI,YAAY,cAArBJ,mCAAAA,wBAAyB,YAA7DK,UAAuBF,kBAAdG,aAAcH;IAE9BI,IAAAA,kCAAgB,EAACN,IAAI,SAAS;eAAMK,WAAW;;IAC/CC,IAAAA,kCAAgB,EAACN,IAAI,QAAQ;eAAMK,WAAW;;IAE9CE,IAAAA,kBAAQ,EAAC;QACP,IAAMC,mBAAmBC,WAAWT;QAEpC,IAAII,WAAW,CAACI,kBAAkBE;QAClC,IAAI,CAACN,WAAWI,kBAAkBH,WAAW;IAC/C;IAEA,IAAMK,QAAQC,IAAAA,wBAAW,EAAC;YAAMX;gBAAAA,cAAAA,GAAGY,OAAO,cAAVZ,kCAAAA,YAAYU,KAAK;;IACjD,IAAMG,OAAOF,IAAAA,wBAAW,EAAC;YAAMX;gBAAAA,cAAAA,GAAGY,OAAO,cAAVZ,kCAAAA,YAAYa,IAAI;;IAC/C,IAAMC,UAAUC,IAAAA,wBAAW,EAAC;eAAO;YAAEL,OAAAA;YAAOG,MAAAA;QAAK;;IAEjD,OAAO;QAACT;QAASU;KAAQ;AAC3B;AAEA,SAASL,WAAkCX,MAAwB;IACjE,OAAOkB,IAAAA,kCAAgB,EAAClB,YAAYmB,SAASC,aAAa;AAC5D"}