import React, { DetailedHTMLProps, HTMLAttributes, ReactElement, ReactHTML, useCallback, useEffect, useRef, } from "react"; import { autoTextSize, Options } from "./auto-text-size-standalone.js"; /** * Make text fit container, prevent overflow and underflow. */ export function AutoTextSize({ mode, minFontSizePx, maxFontSizePx, fontSizePrecisionPx, as: Comp = "div", // TODO: The `...rest` props are not typed to reflect another `as`. children, ...rest }: Options & { as?: keyof ReactHTML | React.ComponentType; } & DetailedHTMLProps< HTMLAttributes, HTMLDivElement >): ReactElement { const updateTextSizeRef = useRef>(); useEffect(() => updateTextSizeRef.current?.(), [children]); const refCallback = useCallback( (innerEl: HTMLElement | null) => { updateTextSizeRef.current?.disconnect(); const containerEl = innerEl?.parentElement; if (!innerEl || !containerEl) return; updateTextSizeRef.current = autoTextSize({ innerEl, containerEl, mode, minFontSizePx, maxFontSizePx, fontSizePrecisionPx, }); }, [mode, minFontSizePx, maxFontSizePx, fontSizePrecisionPx] ); return ( {children} ); }