Files
vf_react/src/components/FUI/FuiCorners.tsx
zdl 2720946ccf fix(types): 修复 ECharts 类型导出和组件类型冲突
- echarts.ts: 将 EChartsOption 改为 EChartsCoreOption 的类型别名
- FuiCorners: 移除 extends BoxProps,position 重命名为 corner
- KLineChartModal/TimelineChartModal/ConcentrationCard: 使用导入的 EChartsOption
- LoadingState: 新增骨架屏 variant 支持
- FinancialPanorama: 使用骨架屏加载状态
- useFinancialData/financialService: 优化数据获取逻辑
- Company/index: 简化组件结构

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-18 18:42:19 +08:00

127 lines
2.5 KiB
TypeScript

/**
* FUI 角落装饰组件
* Ash Thorp 风格的科幻 UI 角落装饰
*/
import React, { memo } from 'react';
import { Box, BoxProps } from '@chakra-ui/react';
export interface FuiCornersProps {
/** 装饰框大小 */
size?: number;
/** 边框宽度 */
borderWidth?: number;
/** 边框颜色 */
borderColor?: string;
/** 透明度 */
opacity?: number;
/** 距离容器边缘的距离 */
offset?: number;
}
interface CornerBoxProps {
corner: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
size: number;
borderWidth: number;
borderColor: string;
opacity: number;
offset: number;
}
const CornerBox = memo<CornerBoxProps>(({
corner,
size,
borderWidth,
borderColor,
opacity,
offset,
}) => {
const cornerStyles: Record<string, BoxProps> = {
'top-left': {
top: `${offset}px`,
left: `${offset}px`,
borderTop: `${borderWidth}px solid`,
borderLeft: `${borderWidth}px solid`,
},
'top-right': {
top: `${offset}px`,
right: `${offset}px`,
borderTop: `${borderWidth}px solid`,
borderRight: `${borderWidth}px solid`,
},
'bottom-left': {
bottom: `${offset}px`,
left: `${offset}px`,
borderBottom: `${borderWidth}px solid`,
borderLeft: `${borderWidth}px solid`,
},
'bottom-right': {
bottom: `${offset}px`,
right: `${offset}px`,
borderBottom: `${borderWidth}px solid`,
borderRight: `${borderWidth}px solid`,
},
};
return (
<Box
position="absolute"
w={`${size}px`}
h={`${size}px`}
borderColor={borderColor}
opacity={opacity}
pointerEvents="none"
{...cornerStyles[corner]}
/>
);
});
CornerBox.displayName = 'CornerBox';
/**
* FUI 角落装饰组件
* 在容器四角添加科幻风格的装饰边框
*
* @example
* ```tsx
* <Box position="relative">
* <FuiCorners />
* {children}
* </Box>
* ```
*/
const FuiCorners = memo<FuiCornersProps>(({
size = 16,
borderWidth = 2,
borderColor = 'rgba(212, 175, 55, 0.4)',
opacity = 0.6,
offset = 12,
}) => {
const corners: CornerBoxProps['corner'][] = [
'top-left',
'top-right',
'bottom-left',
'bottom-right',
];
return (
<>
{corners.map((corner) => (
<CornerBox
key={corner}
corner={corner}
size={size}
borderWidth={borderWidth}
borderColor={borderColor}
opacity={opacity}
offset={offset}
/>
))}
</>
);
});
FuiCorners.displayName = 'FuiCorners';
export default FuiCorners;