# FitText Component Adaptive text component that automatically scales font size down so the content fits within its container, with optional multi-line clamping. Built with a small hook wrapper around ResizeObserver and MutationObserver for reliable, responsive fitting. ## Features - ๐Ÿ“ Auto-fit text to available width (and optional line count) - ๐Ÿงต Single-line and multi-line support with clamping and ellipsis - ๐Ÿ” React hook + component interface - โšก Efficient: observers and rAF, minimal layout thrash - ๐ŸŽ›๏ธ Configurable min scale, max font size, and step size ## Behavior - On mount and whenever size/text changes, the font is reduced (never increased) until the text fits the given constraints. - If `lines` is provided, height is constrained to an estimated maximum based on computed line-height. ## Basic Usage ```tsx import FitText from '@/components/shared/FitText'; export function CardTitle({ title }: { title: string }) { return ( ); } ``` ## API Reference ### Props | Prop | Type | Default | Description | |------|------|---------|-------------| | `text` | `string` | โ€” | The string to render and fit | | `fontSize` | `number` | computed | Maximum starting font size in rem (e.g., 1.2, 0.9) | | `minimumFontScale` | `number` | `0.8` | Smallest scale relative to the max (0..1) | | `lines` | `number` | `1` | Maximum number of lines to display and fit | | `className` | `string` | โ€” | Optional class on the rendered element | | `style` | `CSSProperties` | โ€” | Inline styles (merged with internal clamp styles) | | `as` | `'span' | 'div'` | `'span'` | HTML tag to render | Notes: - For multi-line, the component applies WebKit line clamping (with reasonable fallbacks) and fits within that height. - The component only scales down; if the content already fits, it keeps the starting size. ## Examples ### Single-line title (default) ```tsx ``` ### Multi-line label (up to 3 lines) ```tsx ``` ### Explicit starting size ```tsx ``` ### Render as a div ```tsx ``` ## Hook Usage (Advanced) If you need to control your own element, you can use the underlying hook directly. ```tsx import React, { useRef } from 'react'; import { useAdjustFontSizeToFit } from '@/components/shared/fitText/textFit'; export function CustomFit() { const ref = useRef(null); useAdjustFontSizeToFit(ref as any, { maxFontSizePx: 20, minFontScale: 0.6, maxLines: 2, singleLine: false, }); return ( Arbitrary text that will scale to fit two lines. ); } ``` ## Tips - For predictable measurements, ensure the container has a fixed width (or stable layout) when fitting occurs. - Avoid animating width while fitting; update after animation completes for best results. - When you need more control of typography, pass `fontSize` to define the starting ceiling. - **Important**: The `fontSize` prop expects `rem` values (e.g., 1.2, 0.9) to ensure text scales with global font size changes.