{"version":3,"file":"index.cjs","names":["noop","usePreservedCallback"],"sources":["../../../src/hooks/useResizeObserver/index.ts"],"sourcesContent":["import { noop } from '@modern-kit/utils';\nimport { usePreservedCallback } from '../usePreservedCallback';\nimport { useEffect, useRef, useState } from 'react';\n\ninterface UseResizeObserver<T extends HTMLElement> {\n  ref: React.RefObject<T | null>;\n  contentRect: ContentRect;\n}\n\ntype ContentRect = Omit<DOMRectReadOnly, 'toJSON'>;\n\nconst initialState: ContentRect = {\n  bottom: 0,\n  height: 0,\n  left: 0,\n  right: 0,\n  top: 0,\n  width: 0,\n  x: 0,\n  y: 0,\n};\n\n/**\n * @description 지정된 타겟 요소의 크기 변화를 감지하는 React 커스텀 훅입니다.\n * 이 훅은 `ResizeObserver` API를 사용하여 요소의 크기가 변경될 때마다 특정 액션을 호출 할 수 있습니다.\n *\n * @template T - 관찰하려는 타겟 요소의 타입\n * @param {((entry: ResizeObserverEntry) => void) | undefined} [action] - 요소의 크기가 변경될 때마다 호출되는 콜백 함수. `ResizeObserverEntry` 객체를 인자로 받습니다.\n *\n * @returns {UseResizeObserver<T>} 타겟 요소에 대한 참조 객체(`ref`)와 해당 요소의 현재 크기 정보(`contentRect`)입니다.\n *\n * @example\n * ```tsx\n * const { ref, contentRect } = useResizeObserver<HTMLDivElement>();\n *\n * return (\n *   <div ref={ref}>\n *     <p>Width: {contentRect.width}</p>\n *     <p>Height: {contentRect.height}</p>\n *   </div>\n * );\n * ```\n */\nexport function useResizeObserver<T extends HTMLElement>(\n  action: (entry: ResizeObserverEntry) => void = noop\n): UseResizeObserver<T> {\n  const [contentRect, setContentRect] = useState<ContentRect>(initialState);\n  const targetRef = useRef<T>(null);\n\n  const preservedCallbackAction = usePreservedCallback(\n    ([entry]: ResizeObserverEntry[]) => {\n      if (!entry) return;\n\n      action(entry);\n      setContentRect(entry.contentRect);\n    }\n  );\n\n  useEffect(() => {\n    if (!targetRef.current) {\n      return;\n    }\n\n    const targetElement = targetRef.current;\n\n    const observer = new ResizeObserver(preservedCallbackAction);\n\n    observer.observe(targetElement);\n\n    return () => {\n      observer.unobserve(targetElement);\n    };\n  }, [preservedCallbackAction]);\n\n  return { ref: targetRef, contentRect };\n}\n"],"mappings":";;;;;AAWA,MAAM,eAA4B;CAChC,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,OAAO;CACP,KAAK;CACL,OAAO;CACP,GAAG;CACH,GAAG;CACJ;;;;;;;;;;;;;;;;;;;;;;AAuBD,SAAgB,kBACd,SAA+CA,kBAAAA,MACzB;CACtB,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,UAAwC,aAAa;CACzE,MAAM,aAAA,GAAA,MAAA,QAAsB,KAAK;CAEjC,MAAM,0BAA0BC,cAAAA,sBAC7B,CAAC,WAAkC;EAClC,IAAI,CAAC,OAAO;EAEZ,OAAO,MAAM;EACb,eAAe,MAAM,YAAY;GAEpC;CAED,CAAA,GAAA,MAAA,iBAAgB;EACd,IAAI,CAAC,UAAU,SACb;EAGF,MAAM,gBAAgB,UAAU;EAEhC,MAAM,WAAW,IAAI,eAAe,wBAAwB;EAE5D,SAAS,QAAQ,cAAc;EAE/B,aAAa;GACX,SAAS,UAAU,cAAc;;IAElC,CAAC,wBAAwB,CAAC;CAE7B,OAAO;EAAE,KAAK;EAAW;EAAa"}