/** * @fileoverview 令牌卡片组件 * @description 展示设计系统令牌的可视化组件 */ import React, { useState } from 'react'; import { motion } from 'framer-motion'; import { Copy, Check, Edit3, Trash2, Tag } from 'lucide-react'; import { Card, CardBody, CardHeader } from '../ui/Card'; import { Button, IconButton } from '../ui/Button'; import { DesignToken, ColorToken, TypographyToken, SpacingToken, ShadowToken, BorderRadiusToken, AnimationToken } from '../../types/design-system'; import { useDesignSystemStore } from '../../store/design-system-store'; import { clsx } from 'clsx'; // 令牌卡片属性接口 interface TokenCardProps { token: DesignToken; variant?: 'default' | 'compact' | 'detailed'; interactive?: boolean; showActions?: boolean; className?: string; } /** * 令牌卡片主组件 */ const TokenCard: React.FC = ({ token, variant = 'default', interactive = true, showActions = true, className }) => { const [copied, setCopied] = useState(false); const [isEditing, setIsEditing] = useState(false); const { setSelectedToken } = useDesignSystemStore(); // 复制令牌值 const copyToken = async () => { try { await navigator.clipboard.writeText(String(token.value)); setCopied(true); setTimeout(() => setCopied(false), 2000); } catch (error) { console.error('Failed to copy token:', error); } }; // 选择令牌 const handleSelect = () => { if (interactive) { setSelectedToken(token); } }; // 渲染令牌预览 const renderTokenPreview = () => { switch (token.category) { case 'color': return ; case 'typography': return ; case 'spacing': return ; case 'shadow': return ; case 'border-radius': return ; case 'animation': return ; default: return ; } }; // 渲染令牌信息 const renderTokenInfo = () => { const categoryIcons = { color: '🎨', typography: '📝', spacing: '📏', shadow: '🌑', 'border-radius': '🔘', 'z-index': '📊', animation: '⚡', }; return (
{categoryIcons[token.category]}

{token.name}

{token.deprecated && ( Deprecated )}
{token.description && (

{token.description}

)} {token.tags && token.tags.length > 0 && (
{token.tags.slice(0, 3).map((tag, index) => ( {tag} ))} {token.tags.length > 3 && ( +{token.tags.length - 3} more )}
)}
); }; return ( {/* 令牌预览 */}
{renderTokenPreview()}
{/* 令牌信息 */} {renderTokenInfo()} {/* 令牌值和操作 */}
{typeof token.value === 'object' ? JSON.stringify(token.value) : token.value}
{showActions && (
{ e.stopPropagation(); copyToken(); }} aria-label="Copy token value" data-component="IconButton" data-element="copy-button" data-action="copy-value" > {copied ? ( ) : ( )} {interactive && ( { e.stopPropagation(); setIsEditing(!isEditing); }} aria-label="Edit token" data-component="IconButton" data-element="edit-button" data-action="edit-token" > )}
)}
{/* 编辑模式 */} {isEditing && interactive && (