import React, { forwardRef, Ref } from "react"; import classNames from "classnames"; import { Tooltip } from "../tooltip"; import { StyledProps } from "../_type"; import { useConfig } from "../_util/config-context"; import { CopyProps, Copy } from "../copy"; /** * 支持当前 `parent` 标签原生支持的属性 */ export interface TextProps

extends StyledProps { /** * 使用什么标签来渲染文本,对应标签原生属性可透传至组件 * @default span */ parent?: P; /** * 文本的水平居中方式 */ align?: "left" | "center" | "right" | "justify"; /** * 文本的垂直居中方式 */ verticalAlign?: | "baseline" | "top" | "middle" | "bottom" | "text-top" | "text-bottom"; /** * 指定 `overflow` 为 `true` 对文本进行单行溢出控制,宽度溢出的文本会以 ... 显示 */ overflow?: boolean; /** * 指定 `nowrap` 为 `true` 强制文本不换行,超长溢出 */ nowrap?: boolean; /** * 指定 `underline` 为 `true` 显示虚下划线 */ underline?: boolean; /** * 内容所使用的 `tooltip` * * - 2.7.0 支持传递 `true`,将默认使用文字内容 */ tooltip?: boolean | React.ReactNode; /** * 文本的颜色主题 */ theme?: | "text" | "label" | "weak" | "strong" | "primary" | "success" | "warning" | "danger" | "cost"; /** * 文本的背景颜色主题 */ bgTheme?: "success" | "warning" | "danger"; /** * 文本浮动方式,配置 `clear` 以清除浮动 */ float?: "left" | "right" | "clear"; /** * 重置文字 fontSize * * @default false */ reset?: boolean; /** * 文本内容 */ children?: React.ReactNode; /** * 是否支持复制 */ copyable?: boolean | CopyProps; } export type TextPropsType< P extends keyof JSX.IntrinsicElements > = JSX.IntrinsicElements[P] & TextProps

; function TextRaw

( props: TextPropsType

, ref: Ref ) { const { classPrefix } = useConfig(); const { parent, align, verticalAlign, overflow, nowrap, underline, tooltip, className, style, theme, bgTheme, float, reset, copyable, ...htmlProps } = props; const { children: rawChildren } = props; let children = rawChildren; if (copyable && !overflow) { const copyProps = typeof copyable === "object" ? copyable : {}; children = ( <> {children} ); } let element: JSX.Element = React.createElement( parent || "span", { ref, className: classNames(className, { [`${classPrefix}-bg-${bgTheme}`]: bgTheme, [`${classPrefix}-text`]: theme === "text", [`${classPrefix}-text-${theme}`]: theme && theme !== "text", [`${classPrefix}-text-${align}`]: align, [`${classPrefix}-align-${verticalAlign}`]: verticalAlign, [`${classPrefix}-text-overflow`]: overflow, [`${classPrefix}-text-nowrap`]: nowrap, [`${classPrefix}-text-underline`]: underline, [`${classPrefix}-float-${float}`]: float && float !== "clear", [`${classPrefix}-fz-reset`]: reset, [`clearfix`]: float === "clear", }), style, ...htmlProps, }, children ); if (copyable && overflow) { const copyProps = typeof copyable === "object" ? copyable : {}; element = React.createElement( parent || "span", { style: { display: "flex" }, }, <> {element} ); } // 提供快捷 tooltip 使用方式 if (tooltip) { const title = typeof tooltip === "boolean" ? rawChildren : tooltip; element = {element}; } return element; } export const Text = (forwardRef(TextRaw) as any) as typeof TextRaw; (Text as any).displayName = "Text";