{"version":3,"file":"useIsTruncated.cjs","sources":["../../../src/hooks/useIsTruncated.ts"],"sourcesContent":["import { RefCallback, useCallback, useEffect, useLayoutEffect, useState } from 'react';\n\nconst useIsomorphicLayoutEffect =\n  typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport interface UseIsTruncatedOptions {\n  /** Set `false` to skip measuring; `isTruncated` then stays `false`. Defaults to `true`. */\n  enabled?: boolean;\n}\n\nexport interface UseIsTruncatedResult<E extends HTMLElement = HTMLElement> {\n  /** Attach to the element that clips the text. */\n  ref: RefCallback<E>;\n  /** Whether the element's content is wider than the element. */\n  isTruncated: boolean;\n}\n\n/** Tracks whether the element's text overflows its width, re-measuring on resize and content changes. */\nexport const useIsTruncated = <E extends HTMLElement = HTMLElement>({\n  enabled = true,\n}: UseIsTruncatedOptions = {}): UseIsTruncatedResult<E> => {\n  const [element, setElement] = useState<E | null>(null);\n  const [isTruncated, setIsTruncated] = useState(false);\n\n  const measure = useCallback(() => {\n    setIsTruncated(\n      enabled && element !== null && element.scrollWidth > element.clientWidth\n    );\n  }, [element, enabled]);\n\n  useIsomorphicLayoutEffect(() => {\n    measure();\n\n    if (!enabled || !element) {\n      return undefined;\n    }\n\n    const mutationObserver = new MutationObserver(measure);\n    mutationObserver.observe(element, {\n      childList: true,\n      subtree: true,\n      characterData: true,\n    });\n\n    if (typeof ResizeObserver === 'undefined') {\n      return () => mutationObserver.disconnect();\n    }\n\n    const resizeObserver = new ResizeObserver(measure);\n    resizeObserver.observe(element);\n\n    return () => {\n      mutationObserver.disconnect();\n      resizeObserver.disconnect();\n    };\n  }, [element, enabled, measure]);\n\n  return { ref: setElement, isTruncated };\n};\n"],"names":["useLayoutEffect","useEffect","useState","useCallback"],"mappings":";;;;;;AAEA,MAAM,yBAAA,GACJ,OAAO,MAAA,KAAW,WAAA,GAAcA,qBAAA,GAAkBC,eAAA;AAe7C,MAAM,iBAAiB,CAAsC;AAAA,EAClE,OAAA,GAAU;AACZ,CAAA,GAA2B,EAAC,KAA+B;AACzD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,eAAmB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEpD,EAAA,MAAM,OAAA,GAAUC,kBAAY,MAAM;AAChC,IAAA,cAAA;AAAA,MACE,OAAA,IAAW,OAAA,KAAY,IAAA,IAAQ,OAAA,CAAQ,cAAc,OAAA,CAAQ;AAAA,KAC/D;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,OAAO,CAAC,CAAA;AAErB,EAAA,yBAAA,CAA0B,MAAM;AAC9B,IAAA,OAAA,EAAQ;AAER,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,EAAS;AACxB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,gBAAA,GAAmB,IAAI,gBAAA,CAAiB,OAAO,CAAA;AACrD,IAAA,gBAAA,CAAiB,QAAQ,OAAA,EAAS;AAAA,MAChC,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS,IAAA;AAAA,MACT,aAAA,EAAe;AAAA,KAChB,CAAA;AAED,IAAA,IAAI,OAAO,mBAAmB,WAAA,EAAa;AACzC,MAAA,OAAO,MAAM,iBAAiB,UAAA,EAAW;AAAA,IAC3C;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe,OAAO,CAAA;AACjD,IAAA,cAAA,CAAe,QAAQ,OAAO,CAAA;AAE9B,IAAA,OAAO,MAAM;AACX,MAAA,gBAAA,CAAiB,UAAA,EAAW;AAC5B,MAAA,cAAA,CAAe,UAAA,EAAW;AAAA,IAC5B,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,OAAA,EAAS,OAAO,CAAC,CAAA;AAE9B,EAAA,OAAO,EAAE,GAAA,EAAK,UAAA,EAAY,WAAA,EAAY;AACxC;;"}