// @flow strict import * as React from 'react'; import {classify} from '../../utils/classify'; import css from './Truncate.module.css'; export type TruncateProps = { children?: React.Node, line?: number, showFullTextOnHover?: boolean, wordBreak?: string, className?: string, }; export const BaseTruncate: React$AbstractComponent< TruncateProps, HTMLSpanElement, > = React.forwardRef( ( { children, line = 1, showFullTextOnHover = false, wordBreak = 'break-all', className, }: TruncateProps, ref, ): React.Node => ( {children} ), ); export const Truncate: React$AbstractComponent = React.forwardRef( ( { children, line = 1, showFullTextOnHover = false, wordBreak = 'break-all', className: truncateClassName, }: TruncateProps, ref, ): React.Node => { const arrayChildren = React.Children.toArray(children); if (arrayChildren.length) { const child = arrayChildren[0]; if (React.isValidElement(child)) { const {className, children} = child.props; return React.cloneElement(child, { className: classify( css.truncateLineClamp, className, truncateClassName, ), style: {'--line-clamp': line, '--word-break': wordBreak}, title: showFullTextOnHover ? children : '', ref, }); } return ( {children} ); } return null; }, );