Use Line Breakdown
fancy/use-line-breakdownFreeHook
A hook component.
Install it
npx shadcn@latest add https://www.fancycomponents.dev/r/use-line-breakdown.jsonSource
1import { RefObject, useEffect, useState } from "react"23interface UseLineBreakdownResult {4 lineCount: number5 lines: string[][]6}78export function useLineBreakdown(9 elementRef: RefObject<HTMLElement | null>,10 text: string11): UseLineBreakdownResult {12 const [breakdown, setBreakdown] = useState<UseLineBreakdownResult>({13 lineCount: 0,14 lines: [[]],15 })1617 useEffect(() => {18 const element = elementRef.current19 if (!element) return2021 const calculateLines = () => {22 // Get basic measurements23 const style = window.getComputedStyle(element)24 const lineHeight = parseInt(style.lineHeight)25 const elementHeight = element.offsetHeight2627 const linesCount = Math.ceil(elementHeight / lineHeight)2829 console.log(elementHeight / lineHeight)3031 // Create temporary elements to measure text32 const tempSpan = element.appendChild(document.createElement("span"))33 tempSpan.style.visibility = "hidden"34 tempSpan.style.position = "absolute"35 tempSpan.style.whiteSpace = "nowrap"36 element.appendChild(tempSpan)3738 // Split text into words39 const words = text.split(" ")40 const lineGroups: string[][] = [[]]41 let currentLine = 042 let previousTop = 04344 // Group words into lines45 words.forEach((word, index) => {46 tempSpan.textContent = word47 const rect = tempSpan.getBoundingClientRect()4849 if (rect.top > previousTop && index > 0) {50 currentLine++51 lineGroups[currentLine] = []52 previousTop = rect.top53 }5455 lineGroups[currentLine].push(word)56 })5758 element.removeChild(tempSpan)5960 setBreakdown({61 lineCount: lineGroups.length,62 lines: lineGroups,63 })64 }6566 calculateLines()6768 const resizeObserver = new ResizeObserver(calculateLines)69 resizeObserver.observe(element)7071 return () => {72 resizeObserver.disconnect()73 }74 }, [elementRef, text])7576 return breakdown77}
Files it writes
More from fancy
All 158 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Use Debounced Dimensionsuse-debounced-dimensions | fancy | Hooks | Free | no deps | |
| Use Detect Browseruse-detect-browser | fancy | Hooks | Free | no deps | |
| Use Dimensionsuse-dimensions | fancy | Hooks | Free | no deps | |
| Use Elastic Line Eventsuse-elastic-line-events | fancy | Hooks | Free | no deps | |
| Use Line Countuse-line-count | fancy | Hooks | Free | no deps | |
| Use Mounteduse-mounted | fancy | Hooks | Free | no deps | |
| Use Mouse Positionuse-mouse-position | fancy | Hooks | Free | no deps | |
| Use Mouse Position Refuse-mouse-position-ref | fancy | Hooks | Free | no deps |
