{"version":3,"sources":["../src/useLineClamp.ts"],"names":[],"mappings":";;;;;AAEA,SAAS,iBAAiB,QAAQ,gBAAgB;AAGlD,IAAM,mBAAmB;AAElB,SAAS,aAAa;AAAA,EAC5B,QAAQ;AAAA,EACR;AACD,GAGG;AACF,QAAM,iBAAiB,OAAuB,IAAI;AAClD,QAAM,cAAc,OAAe,EAAE;AACrC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAkB,KAAK;AAEzD,kBAAgB,MAAM;AACrB,aAAS,QAAQ;AAChB,UAAI,OAAO,SAAS,YAAY,KAAK,UAAU;AAAG;AAClD,YAAM,iBAAiB,CAAC,YAA0B;AACjD,oBAAY,UAAU;AAEtB,YAAI,eAAe,WAAW,MAAM;AACnC,yBAAe,QAAQ,YAAY;AAAA,QACpC;AAAA,MACD;AAEA,qBAAe,GAAG;AAElB,YAAM,cACL,eAAe,SAAS,eAAe,eAAe;AACvD,YAAM,aAAa,eAAe,SAAS,gBAAgB;AAC3D,YAAM,YAAY,aAAa,QAAQ;AAEvC,YAAM,iBAAiB;AAEvB,UAAI,QAAQ;AACZ,UAAI,MAAM,KAAK;AAEf,aAAO,SAAS,KAAK;AACpB,cAAM,aAAa,KAAK,MAAM,GAAG,GAAG;AACpC,uBAAe,UAAU;AAEzB,aACE,eAAe,SAAS,gBAAgB,MAAM,cAC9C,eAAe,SAAS,eAAe,MAAM,aAC7C;AACD;AAAA,QACD;AAEA;AAAA,MACD;AACA,UAAI,QAAQ,KAAK,QAAQ;AACxB,qBAAa,KAAK;AAClB;AAAA,MACD;AACA,YAAM,mBACL,KAAK,MAAM,GAAG,KAAK,IAAI,MAAM,gBAAgB,CAAC,CAAC,EAAE,KAAK,IACtD;AAED,qBAAe,gBAAgB;AAC/B,mBAAa,IAAI;AAAA,IAClB;AAEA,UAAM;AAEN,UAAM,iBAAiB,SAAS,OAAO,GAAG;AAE1C,WAAO,iBAAiB,UAAU,cAAc;AAEhD,WAAO,MAAM;AACZ,qBAAe,OAAO;AACtB,aAAO,oBAAoB,UAAU,cAAc;AAAA,IACpD;AAAA,EACD,GAAG,CAAC,OAAO,IAAI,CAAC;AAEhB,SAAO,EAAE,cAAc,gBAAgB,UAAU;AAClD","sourcesContent":["'use client'\n\nimport { useLayoutEffect, useRef, useState } from \"react\";\nimport { debounce } from \"./debounce\";\n\nconst DEFAULT_ELLIPSIS = \"...\";\n\nexport function useLineClamp({\n\tlines = 1,\n\ttext,\n}: {\n\tlines?: number;\n\ttext: string;\n}) {\n\tconst textElementRef = useRef<HTMLDivElement>(null);\n\tconst clampedText = useRef<string>(\"\");\n\tconst [isClamped, setIsClamped] = useState<boolean>(false);\n\n\tuseLayoutEffect(() => {\n\t\tfunction clamp() {\n\t\t\tif (typeof text !== \"string\" || text.length <= 0) return;\n\t\t\tconst updateTextRefs = (newText: string): void => {\n\t\t\t\tclampedText.current = newText;\n\n\t\t\t\tif (textElementRef.current != null) {\n\t\t\t\t\ttextElementRef.current.innerText = newText;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tupdateTextRefs(\".\");\n\n\t\t\tconst parentWidth =\n\t\t\t\ttextElementRef.current?.parentElement?.offsetWidth ?? 0;\n\t\t\tconst lineHeight = textElementRef.current?.offsetHeight ?? 0;\n\t\t\tconst maxHeight = lineHeight * lines + 1;\n\n\t\t\tconst ellipsisLength = 3;\n\n\t\t\tlet start = 0;\n\t\t\tlet end = text.length;\n\n\t\t\twhile (start <= end) {\n\t\t\t\tconst slicedText = text.slice(0, end);\n\t\t\t\tupdateTextRefs(slicedText);\n\n\t\t\t\tif (\n\t\t\t\t\t(textElementRef.current?.clientHeight ?? 0) <= maxHeight &&\n\t\t\t\t\t(textElementRef.current?.clientWidth ?? 0) <= parentWidth\n\t\t\t\t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tend--;\n\t\t\t}\n\t\t\tif (end === text.length) {\n\t\t\t\tsetIsClamped(false);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst textPlusEllipsis =\n\t\t\t\ttext.slice(0, Math.max(end - ellipsisLength, 0)).trim() +\n\t\t\t\tDEFAULT_ELLIPSIS;\n\n\t\t\tupdateTextRefs(textPlusEllipsis);\n\t\t\tsetIsClamped(true);\n\t\t}\n\n\t\tclamp();\n\n\t\tconst debouncedClamp = debounce(clamp, 100);\n\n\t\twindow.addEventListener(\"resize\", debouncedClamp);\n\n\t\treturn () => {\n\t\t\tdebouncedClamp.cancel();\n\t\t\twindow.removeEventListener(\"resize\", debouncedClamp);\n\t\t};\n\t}, [lines, text]);\n\n\treturn { containerRef: textElementRef, isClamped };\n}\n"]}