@yamada-ui/react
Version:
React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion
1 lines • 4.86 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","names":["isRefObject"],"sources":["../../../../src/hooks/use-focus/index.ts"],"sourcesContent":["\"use client\"\n\nimport type { RefObject } from \"react\"\nimport { useCallback, useRef } from \"react\"\nimport {\n getActiveElement,\n getDocument,\n getFirstFocusableElement,\n isRefObject,\n isSafari,\n useUpdateEffect,\n} from \"../../utils\"\nimport { useEventListener } from \"../use-event-listener\"\n\nexport interface UseFocusOnShowProps {\n focusTarget?: HTMLElement | null | RefObject<HTMLElement | null>\n preventScroll?: boolean\n shouldFocus?: boolean\n visible?: boolean\n}\n\n/**\n * `useFocusOnShow` is a custom hook that focuses on the target element when it is shown.\n *\n * @see https://yamada-ui.com/docs/hooks/use-focus-on-show\n */\nexport const useFocusOnShow = <Y extends HTMLElement>(\n refOrEl: RefObject<null | Y> | Y,\n {\n focusTarget: focusRefOrEl,\n preventScroll,\n shouldFocus,\n visible,\n }: UseFocusOnShowProps = {\n preventScroll: true,\n shouldFocus: false,\n },\n) => {\n const trulyShouldFocus = shouldFocus && visible\n const focused = useRef(false)\n\n const getTarget = useCallback(() => {\n return isRefObject(refOrEl) ? refOrEl.current : refOrEl\n }, [refOrEl])\n\n const getFocusTarget = useCallback(() => {\n return isRefObject(focusRefOrEl) ? focusRefOrEl.current : focusRefOrEl\n }, [focusRefOrEl])\n\n const onFocus = useCallback(() => {\n const target = getTarget()\n\n if (!target || !trulyShouldFocus || focused.current) return\n if (target.contains(document.activeElement as HTMLElement)) return\n\n const focusTarget = getFocusTarget()\n\n if (focusTarget) {\n requestAnimationFrame(() => {\n focusTarget.focus({ preventScroll })\n\n focused.current = true\n })\n } else {\n const firstFocusable = getFirstFocusableElement(target)\n\n if (firstFocusable) {\n requestAnimationFrame(() => {\n firstFocusable.focus({ preventScroll })\n\n focused.current = true\n })\n } else {\n requestAnimationFrame(() => {\n target.focus({ preventScroll })\n\n focused.current = true\n })\n }\n }\n }, [getTarget, trulyShouldFocus, getFocusTarget, preventScroll])\n\n useUpdateEffect(() => {\n focused.current = !trulyShouldFocus\n }, [trulyShouldFocus])\n\n useUpdateEffect(() => {\n requestAnimationFrame(onFocus)\n }, [onFocus])\n\n useEventListener(getTarget, \"transitionend\", onFocus)\n}\n\nexport interface UseFocusOnMouseDownProps {\n ref: RefObject<HTMLElement | null>\n elements?: (HTMLElement | null | RefObject<HTMLElement | null>)[]\n enabled?: boolean\n}\n\n/**\n * `useFocusOnPointerDown` is a custom hook that focuses on the target element when it is clicked.\n *\n * @see https://yamada-ui.com/docs/hooks/use-focus-on-pointer-down\n */\nexport const useFocusOnPointerDown = ({\n ref,\n elements,\n enabled,\n}: UseFocusOnMouseDownProps) => {\n useEventListener(\n () => getDocument(ref.current),\n \"pointerdown\",\n (ev) => {\n if (!isSafari() || !enabled) return\n const target = ev.target as HTMLElement\n\n const els = elements ?? [ref]\n\n const validTarget = els.some((elOrRef) => {\n const el = isRefObject(elOrRef) ? elOrRef.current : elOrRef\n\n return el?.contains(target) || el === target\n })\n\n if (\n getActiveElement(getDocument(ref.current)) !== target &&\n validTarget\n ) {\n ev.preventDefault()\n\n target.focus()\n }\n },\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA0BA,MAAa,kBACX,SACA,EACE,aAAa,cACb,eACA,aACA,YACuB;CACvB,eAAe;CACf,aAAa;CACd,KACE;CACH,MAAM,mBAAmB,eAAe;CACxC,MAAM,4BAAiB,MAAM;CAE7B,MAAM,yCAA8B;AAClC,SAAOA,wBAAY,QAAQ,GAAG,QAAQ,UAAU;IAC/C,CAAC,QAAQ,CAAC;CAEb,MAAM,8CAAmC;AACvC,SAAOA,wBAAY,aAAa,GAAG,aAAa,UAAU;IACzD,CAAC,aAAa,CAAC;CAElB,MAAM,uCAA4B;EAChC,MAAM,SAAS,WAAW;AAE1B,MAAI,CAAC,UAAU,CAAC,oBAAoB,QAAQ,QAAS;AACrD,MAAI,OAAO,SAAS,SAAS,cAA6B,CAAE;EAE5D,MAAM,cAAc,gBAAgB;AAEpC,MAAI,YACF,6BAA4B;AAC1B,eAAY,MAAM,EAAE,eAAe,CAAC;AAEpC,WAAQ,UAAU;IAClB;OACG;GACL,MAAM,iFAA0C,OAAO;AAEvD,OAAI,eACF,6BAA4B;AAC1B,mBAAe,MAAM,EAAE,eAAe,CAAC;AAEvC,YAAQ,UAAU;KAClB;OAEF,6BAA4B;AAC1B,WAAO,MAAM,EAAE,eAAe,CAAC;AAE/B,YAAQ,UAAU;KAClB;;IAGL;EAAC;EAAW;EAAkB;EAAgB;EAAc,CAAC;AAEhE,sCAAsB;AACpB,UAAQ,UAAU,CAAC;IAClB,CAAC,iBAAiB,CAAC;AAEtB,sCAAsB;AACpB,wBAAsB,QAAQ;IAC7B,CAAC,QAAQ,CAAC;AAEb,yDAAiB,WAAW,iBAAiB,QAAQ;;;;;;;AAcvD,MAAa,yBAAyB,EACpC,KACA,UACA,cAC8B;AAC9B,kHACoB,IAAI,QAAQ,EAC9B,gBACC,OAAO;AACN,MAAI,kDAAW,IAAI,CAAC,QAAS;EAC7B,MAAM,SAAS,GAAG;EAIlB,MAAM,eAFM,YAAY,CAAC,IAAI,EAEL,MAAM,YAAY;GACxC,MAAM,KAAKA,wBAAY,QAAQ,GAAG,QAAQ,UAAU;AAEpD,UAAO,IAAI,SAAS,OAAO,IAAI,OAAO;IACtC;AAEF,iHAC+B,IAAI,QAAQ,CAAC,KAAK,UAC/C,aACA;AACA,MAAG,gBAAgB;AAEnB,UAAO,OAAO;;GAGnB"}