This commit is contained in:
2025-03-21 22:40:00 +08:00
parent 7a4578c16d
commit 6e921e82fb
12 changed files with 146 additions and 19 deletions

79
widgets/Text/index.tsx Normal file
View File

@@ -0,0 +1,79 @@
import React, { CSSProperties } from 'react';
import { DraggablePropsType } from '../../components/Draggable/Draggable';
export const id = "text";
export const name = "文字";
export const version = "1.0.0";
type FontData = {
content: string;
fontSize?: number; // 字体大小px
fontFamily?: string; // 字体类型
color?: string; // 字体颜色
fontWeight?: number; // 字重
lineHeight?: number; // 行高比例
textAlign?: 'left' | 'center' | 'right'; // 对齐方式
letterSpacing?: number; // 字间距px
customStyles?: CSSProperties; // 自定义CSS扩展
};
interface ResponsiveTextProps {
data: DraggablePropsType["data"] & FontData;
className?: string; // 外部容器类名
}
const Text: React.FC<ResponsiveTextProps> = ({
data,
className
}) => {
// 合并默认样式与传入样式
const textStyles: CSSProperties = {
fontSize: `${data.fontSize || 16}px`,
fontFamily: data.fontFamily || 'Arial, sans-serif',
color: data.color || '#333',
fontWeight: data.fontWeight || 400,
lineHeight: data.lineHeight ? `${data.lineHeight}em` : '1.5',
textAlign: data.textAlign || 'left',
letterSpacing: `${data.letterSpacing || 0}px`,
width: '100%',
height: '100%',
overflow: 'hidden',
textOverflow: 'ellipsis',
display: 'flex',
alignItems: 'center',
justifyContent: data.textAlign === 'center' ? 'center' :
data.textAlign === 'right' ? 'flex-end' : 'flex-start',
...data.customStyles
};
return (
<div
className={className}
style={{
position: 'relative',
width: '100%',
height: '100%',
minWidth: '50px', // 防止容器坍缩
minHeight: '1em' // 最小高度保障
}}
>
<div
style={{
...textStyles,
position: 'absolute',
top: 0,
left: 0,
right: 0,
bottom: 0,
whiteSpace: 'pre-wrap',
wordBreak: 'break-word',
padding: '0.2em' // 防止文本贴边
}}
title={data.content} // 添加tooltip
>
{data.content}
</div>
</div>
);
};
export default Text;