import * as React from 'react'; import { markAsElement } from '../element-marker.js'; export type PreviewProps = Readonly< React.ComponentPropsWithoutRef<'div'> & { /** * @default true */ useTitleTag?: boolean; children: string | string[]; } >; const PREVIEW_MAX_LENGTH = 200; export const Preview = React.forwardRef( ({ children = '', useTitleTag = true, ...props }, ref) => { const text = ( Array.isArray(children) ? children.join('') : children ).substring(0, PREVIEW_MAX_LENGTH); return ( <> {useTitleTag ? {text} : null}
{text} {renderWhiteSpace(text)}
); }, ); Preview.displayName = 'Preview'; markAsElement(Preview); // Spam filters such as rspamd ignore these as preview padding, but count the // direction marks U+200E and U+200F as hidden text, so those are left out. const whiteSpaceCodes = '\xa0\u200C\u200B\u200D\uFEFF'; export const renderWhiteSpace = (text: string) => { if (text.length >= PREVIEW_MAX_LENGTH) { return null; } return
{whiteSpaceCodes.repeat(PREVIEW_MAX_LENGTH - text.length)}
; };