lvetech-ui-lib 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +242 -0
- package/dist/index.d.ts +1072 -0
- package/dist/index.esm.js +4595 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +90 -0
- package/dist/index.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/utils/cn.ts","../src/components/Button.tsx","../src/hooks/index.ts","../src/components/Input.tsx","../src/components/Card.tsx","../src/components/Select.tsx","../src/components/Checkbox.tsx","../src/components/Switch.tsx","../src/components/Radio.tsx","../src/components/Textarea.tsx","../src/components/Dialog.tsx","../src/components/Toast.tsx","../src/components/Alert.tsx","../src/components/Progress.tsx","../src/components/Skeleton.tsx","../src/components/Spinner.tsx","../src/components/Container.tsx","../src/components/Divider.tsx","../src/components/Avatar.tsx","../src/components/Tag.tsx","../src/components/Tabs.tsx","../src/components/Popover.tsx","../src/theme/index.ts","../src/designer/types.ts","../src/designer/useDesignerHistory.ts","../src/designer/templates.ts","../src/designer/ComponentDesigner.tsx","../src/designer/CodeEditor.tsx","../src/styles/index.ts"],"sourcesContent":["// ============================================\r\n// 🔧 样式工具函数\r\n// ============================================\r\n\r\ntype ClassValue = string | number | boolean | undefined | null | ClassValue[]\r\ntype ClassObject = Record<string, boolean | undefined | null>\r\n\r\n/**\r\n * 合并 CSS 类名,支持条件类名\r\n * @example\r\n * cn('base', condition && 'conditional', { active: isActive })\r\n */\r\nexport function cn(...inputs: (ClassValue | ClassObject)[]): string {\r\n const classes: string[] = []\r\n\r\n for (const input of inputs) {\r\n if (!input) continue\r\n\r\n if (typeof input === 'string' || typeof input === 'number') {\r\n classes.push(String(input))\r\n } else if (Array.isArray(input)) {\r\n const nested = cn(...input)\r\n if (nested) classes.push(nested)\r\n } else if (typeof input === 'object') {\r\n for (const [key, value] of Object.entries(input)) {\r\n if (value) classes.push(key)\r\n }\r\n }\r\n }\r\n\r\n return classes.join(' ')\r\n}\r\n\r\n/**\r\n * 创建带有变体的样式生成器\r\n */\r\nexport function createVariants<T extends Record<string, Record<string, string>>>(\r\n base: string,\r\n variants: T\r\n) {\r\n return function getClassName(\r\n variantProps: Partial<{ [K in keyof T]: keyof T[K] }>\r\n ): string {\r\n const variantClasses = Object.entries(variantProps)\r\n .map(([key, value]) => {\r\n const variant = variants[key as keyof T]\r\n return variant?.[value as string] || ''\r\n })\r\n .filter(Boolean)\r\n\r\n return cn(base, ...variantClasses)\r\n }\r\n}\r\n\r\n","// ============================================\r\n// 🔘 Button 按钮组件\r\n// ============================================\r\n\r\nimport React, { forwardRef } from 'react'\r\nimport { cn } from '../utils/cn'\r\n\r\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\r\n /** 按钮内容 */\r\n children: React.ReactNode\r\n /** 按钮变体 */\r\n variant?: 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger' | 'success'\r\n /** 按钮尺寸 */\r\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\r\n /** 是否占满宽度 */\r\n fullWidth?: boolean\r\n /** 是否加载中 */\r\n loading?: boolean\r\n /** 左侧图标 */\r\n leftIcon?: React.ReactNode\r\n /** 右侧图标 */\r\n rightIcon?: React.ReactNode\r\n /** 是否为圆形按钮 */\r\n rounded?: boolean\r\n /** 是否只显示图标 */\r\n iconOnly?: boolean\r\n}\r\n\r\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\r\n (\r\n {\r\n children,\r\n variant = 'primary',\r\n size = 'md',\r\n fullWidth = false,\r\n loading = false,\r\n leftIcon,\r\n rightIcon,\r\n rounded = false,\r\n iconOnly = false,\r\n disabled,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const baseStyles = cn(\r\n 'inline-flex items-center justify-center font-semibold',\r\n 'transition-all duration-200 ease-out',\r\n 'focus:outline-none focus:ring-2 focus:ring-offset-2',\r\n 'disabled:opacity-50 disabled:cursor-not-allowed disabled:pointer-events-none',\r\n 'active:scale-[0.98] transform'\r\n )\r\n\r\n const variantStyles = {\r\n primary: cn(\r\n 'bg-gradient-to-r from-violet-600 to-purple-600',\r\n 'text-white shadow-md shadow-violet-500/25',\r\n 'hover:from-violet-700 hover:to-purple-700 hover:shadow-lg hover:shadow-violet-500/30',\r\n 'focus:ring-violet-500'\r\n ),\r\n secondary: cn(\r\n 'bg-gradient-to-r from-cyan-500 to-teal-500',\r\n 'text-white shadow-md shadow-cyan-500/25',\r\n 'hover:from-cyan-600 hover:to-teal-600 hover:shadow-lg hover:shadow-cyan-500/30',\r\n 'focus:ring-cyan-500'\r\n ),\r\n outline: cn(\r\n 'border-2 border-violet-500 text-violet-600',\r\n 'bg-transparent hover:bg-violet-50',\r\n 'focus:ring-violet-500'\r\n ),\r\n ghost: cn(\r\n 'text-gray-700 bg-transparent',\r\n 'hover:bg-gray-100 hover:text-gray-900',\r\n 'focus:ring-gray-500'\r\n ),\r\n danger: cn(\r\n 'bg-gradient-to-r from-rose-500 to-red-500',\r\n 'text-white shadow-md shadow-rose-500/25',\r\n 'hover:from-rose-600 hover:to-red-600 hover:shadow-lg hover:shadow-rose-500/30',\r\n 'focus:ring-rose-500'\r\n ),\r\n success: cn(\r\n 'bg-gradient-to-r from-emerald-500 to-green-500',\r\n 'text-white shadow-md shadow-emerald-500/25',\r\n 'hover:from-emerald-600 hover:to-green-600 hover:shadow-lg hover:shadow-emerald-500/30',\r\n 'focus:ring-emerald-500'\r\n ),\r\n }\r\n\r\n const sizeStyles = {\r\n xs: iconOnly ? 'p-1.5' : 'px-2.5 py-1 text-xs gap-1',\r\n sm: iconOnly ? 'p-2' : 'px-3 py-1.5 text-sm gap-1.5',\r\n md: iconOnly ? 'p-2.5' : 'px-4 py-2 text-sm gap-2',\r\n lg: iconOnly ? 'p-3' : 'px-5 py-2.5 text-base gap-2',\r\n xl: iconOnly ? 'p-4' : 'px-6 py-3 text-lg gap-2.5',\r\n }\r\n\r\n const radiusStyles = rounded ? 'rounded-full' : 'rounded-lg'\r\n\r\n const LoadingSpinner = () => (\r\n <svg\r\n className=\"animate-spin h-4 w-4\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <circle\r\n className=\"opacity-25\"\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"4\"\r\n />\r\n <path\r\n className=\"opacity-75\"\r\n fill=\"currentColor\"\r\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\r\n />\r\n </svg>\r\n )\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n className={cn(\r\n baseStyles,\r\n variantStyles[variant],\r\n sizeStyles[size],\r\n radiusStyles,\r\n fullWidth && 'w-full',\r\n className\r\n )}\r\n disabled={disabled || loading}\r\n {...props}\r\n >\r\n {loading ? (\r\n <>\r\n <LoadingSpinner />\r\n {!iconOnly && <span>加载中...</span>}\r\n </>\r\n ) : (\r\n <>\r\n {leftIcon && <span className=\"flex-shrink-0\">{leftIcon}</span>}\r\n {!iconOnly && children}\r\n {rightIcon && <span className=\"flex-shrink-0\">{rightIcon}</span>}\r\n </>\r\n )}\r\n </button>\r\n )\r\n }\r\n)\r\n\r\nButton.displayName = 'Button'\r\n\r\nexport default Button\r\n","// ============================================\r\n// 🪝 通用 Hooks\r\n// ============================================\r\n\r\nimport { useState, useEffect, useRef, useCallback } from 'react'\r\n\r\n// 生成唯一 ID\r\nlet idCounter = 0\r\nexport function useId(prefix = 'mui') {\r\n const [id] = useState(() => `${prefix}-${++idCounter}`)\r\n return id\r\n}\r\n\r\n// 受控/非受控状态\r\nexport function useControllableState<T>(\r\n controlledValue: T | undefined,\r\n defaultValue: T,\r\n onChange?: (value: T) => void\r\n) {\r\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue)\r\n const isControlled = controlledValue !== undefined\r\n const value = isControlled ? controlledValue : uncontrolledValue\r\n\r\n const setValue = useCallback(\r\n (nextValue: T | ((prev: T) => T)) => {\r\n const newValue = typeof nextValue === 'function' \r\n ? (nextValue as (prev: T) => T)(value) \r\n : nextValue\r\n \r\n if (!isControlled) {\r\n setUncontrolledValue(newValue)\r\n }\r\n onChange?.(newValue)\r\n },\r\n [isControlled, onChange, value]\r\n )\r\n\r\n return [value, setValue] as const\r\n}\r\n\r\n// 点击外部关闭\r\nexport function useClickOutside<T extends HTMLElement>(\r\n callback: () => void\r\n) {\r\n const ref = useRef<T>(null)\r\n\r\n useEffect(() => {\r\n function handleClick(event: MouseEvent) {\r\n if (ref.current && !ref.current.contains(event.target as Node)) {\r\n callback()\r\n }\r\n }\r\n\r\n document.addEventListener('mousedown', handleClick)\r\n return () => document.removeEventListener('mousedown', handleClick)\r\n }, [callback])\r\n\r\n return ref\r\n}\r\n\r\n// 键盘导航\r\nexport function useKeyboardNavigation(\r\n itemCount: number,\r\n onSelect: (index: number) => void\r\n) {\r\n const [activeIndex, setActiveIndex] = useState(-1)\r\n\r\n const handleKeyDown = useCallback(\r\n (event: React.KeyboardEvent) => {\r\n switch (event.key) {\r\n case 'ArrowDown':\r\n event.preventDefault()\r\n setActiveIndex((prev) => (prev + 1) % itemCount)\r\n break\r\n case 'ArrowUp':\r\n event.preventDefault()\r\n setActiveIndex((prev) => (prev - 1 + itemCount) % itemCount)\r\n break\r\n case 'Enter':\r\n case ' ':\r\n event.preventDefault()\r\n if (activeIndex >= 0) {\r\n onSelect(activeIndex)\r\n }\r\n break\r\n case 'Escape':\r\n setActiveIndex(-1)\r\n break\r\n }\r\n },\r\n [itemCount, activeIndex, onSelect]\r\n )\r\n\r\n return { activeIndex, setActiveIndex, handleKeyDown }\r\n}\r\n\r\n// 动画状态\r\nexport function useAnimation(isOpen: boolean, duration = 300) {\r\n const [shouldRender, setShouldRender] = useState(isOpen)\r\n const [isAnimating, setIsAnimating] = useState(false)\r\n\r\n useEffect(() => {\r\n if (isOpen) {\r\n setShouldRender(true)\r\n requestAnimationFrame(() => setIsAnimating(true))\r\n } else {\r\n setIsAnimating(false)\r\n const timer = setTimeout(() => setShouldRender(false), duration)\r\n return () => clearTimeout(timer)\r\n }\r\n }, [isOpen, duration])\r\n\r\n return { shouldRender, isAnimating }\r\n}\r\n\r\n// 媒体查询\r\nexport function useMediaQuery(query: string) {\r\n const [matches, setMatches] = useState(false)\r\n\r\n useEffect(() => {\r\n const media = window.matchMedia(query)\r\n setMatches(media.matches)\r\n\r\n const listener = (event: MediaQueryListEvent) => setMatches(event.matches)\r\n media.addEventListener('change', listener)\r\n return () => media.removeEventListener('change', listener)\r\n }, [query])\r\n\r\n return matches\r\n}\r\n\r\n// 复制到剪贴板\r\nexport function useCopyToClipboard() {\r\n const [copied, setCopied] = useState(false)\r\n\r\n const copy = useCallback(async (text: string) => {\r\n try {\r\n await navigator.clipboard.writeText(text)\r\n setCopied(true)\r\n setTimeout(() => setCopied(false), 2000)\r\n return true\r\n } catch {\r\n return false\r\n }\r\n }, [])\r\n\r\n return { copied, copy }\r\n}\r\n\r\n// 本地存储\r\nexport function useLocalStorage<T>(key: string, initialValue: T) {\r\n const [storedValue, setStoredValue] = useState<T>(() => {\r\n try {\r\n const item = window.localStorage.getItem(key)\r\n return item ? JSON.parse(item) : initialValue\r\n } catch {\r\n return initialValue\r\n }\r\n })\r\n\r\n const setValue = useCallback(\r\n (value: T | ((val: T) => T)) => {\r\n try {\r\n const valueToStore = value instanceof Function ? value(storedValue) : value\r\n setStoredValue(valueToStore)\r\n window.localStorage.setItem(key, JSON.stringify(valueToStore))\r\n } catch (error) {\r\n console.error(error)\r\n }\r\n },\r\n [key, storedValue]\r\n )\r\n\r\n return [storedValue, setValue] as const\r\n}\r\n\r\n","// ============================================\r\n// 📝 Input 输入框组件\r\n// ============================================\r\n\r\nimport React, { forwardRef, useState } from 'react'\r\nimport { cn } from '../utils/cn'\r\nimport { useId } from '../hooks'\r\n\r\nexport interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\r\n /** 标签文本 */\r\n label?: string\r\n /** 错误信息 */\r\n error?: string\r\n /** 帮助文本 */\r\n helper?: string\r\n /** 输入框尺寸 */\r\n size?: 'sm' | 'md' | 'lg'\r\n /** 变体样式 */\r\n variant?: 'default' | 'filled' | 'flushed'\r\n /** 左侧图标 */\r\n leftIcon?: React.ReactNode\r\n /** 右侧图标 */\r\n rightIcon?: React.ReactNode\r\n /** 前缀文本 */\r\n prefix?: string\r\n /** 后缀文本 */\r\n suffix?: string\r\n /** 是否必填 */\r\n required?: boolean\r\n /** 清除按钮 */\r\n clearable?: boolean\r\n /** 清除回调 */\r\n onClear?: () => void\r\n}\r\n\r\nconst Input = forwardRef<HTMLInputElement, InputProps>(\r\n (\r\n {\r\n label,\r\n error,\r\n helper,\r\n size = 'md',\r\n variant = 'default',\r\n leftIcon,\r\n rightIcon,\r\n prefix,\r\n suffix,\r\n required,\r\n clearable,\r\n onClear,\r\n className,\r\n disabled,\r\n value,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const id = useId('input')\r\n const [isFocused, setIsFocused] = useState(false)\r\n const inputId = props.id || id\r\n\r\n const wrapperStyles = cn(\r\n 'relative flex items-center w-full transition-all duration-200',\r\n {\r\n // 变体样式\r\n default: cn(\r\n 'border rounded-lg bg-white',\r\n isFocused\r\n ? 'border-violet-500 ring-2 ring-violet-500/20'\r\n : error\r\n ? 'border-rose-400'\r\n : 'border-gray-300 hover:border-gray-400'\r\n ),\r\n filled: cn(\r\n 'rounded-lg bg-gray-100',\r\n isFocused\r\n ? 'bg-white ring-2 ring-violet-500/20'\r\n : error\r\n ? 'bg-rose-50'\r\n : 'hover:bg-gray-200'\r\n ),\r\n flushed: cn(\r\n 'border-b-2 rounded-none bg-transparent',\r\n isFocused\r\n ? 'border-violet-500'\r\n : error\r\n ? 'border-rose-400'\r\n : 'border-gray-300'\r\n ),\r\n }[variant],\r\n disabled && 'opacity-50 cursor-not-allowed'\r\n )\r\n\r\n const sizeStyles = {\r\n sm: 'text-sm py-1.5 px-3',\r\n md: 'text-sm py-2.5 px-4',\r\n lg: 'text-base py-3 px-5',\r\n }\r\n\r\n const iconSizeStyles = {\r\n sm: 'w-4 h-4',\r\n md: 'w-5 h-5',\r\n lg: 'w-6 h-6',\r\n }\r\n\r\n const ClearIcon = () => (\r\n <button\r\n type=\"button\"\r\n onClick={onClear}\r\n className=\"p-1 rounded-full hover:bg-gray-200 transition-colors\"\r\n >\r\n <svg\r\n className={cn(iconSizeStyles[size], 'text-gray-400')}\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M6 18L18 6M6 6l12 12\"\r\n />\r\n </svg>\r\n </button>\r\n )\r\n\r\n return (\r\n <div className=\"w-full\">\r\n {label && (\r\n <label\r\n htmlFor={inputId}\r\n className={cn(\r\n 'block font-medium mb-1.5 transition-colors',\r\n size === 'sm' ? 'text-xs' : 'text-sm',\r\n error ? 'text-rose-600' : 'text-gray-700'\r\n )}\r\n >\r\n {label}\r\n {required && <span className=\"text-rose-500 ml-1\">*</span>}\r\n </label>\r\n )}\r\n\r\n <div className={wrapperStyles}>\r\n {leftIcon && (\r\n <span className={cn('flex-shrink-0 pl-3 text-gray-400', iconSizeStyles[size])}>\r\n {leftIcon}\r\n </span>\r\n )}\r\n\r\n {prefix && (\r\n <span className=\"flex-shrink-0 pl-3 text-gray-500 select-none\">\r\n {prefix}\r\n </span>\r\n )}\r\n\r\n <input\r\n ref={ref}\r\n id={inputId}\r\n value={value}\r\n disabled={disabled}\r\n className={cn(\r\n 'flex-1 w-full bg-transparent outline-none',\r\n 'placeholder:text-gray-400',\r\n 'disabled:cursor-not-allowed',\r\n sizeStyles[size],\r\n leftIcon && 'pl-2',\r\n rightIcon && 'pr-2',\r\n className\r\n )}\r\n onFocus={(e) => {\r\n setIsFocused(true)\r\n props.onFocus?.(e)\r\n }}\r\n onBlur={(e) => {\r\n setIsFocused(false)\r\n props.onBlur?.(e)\r\n }}\r\n {...props}\r\n />\r\n\r\n {clearable && value && !disabled && <ClearIcon />}\r\n\r\n {suffix && (\r\n <span className=\"flex-shrink-0 pr-3 text-gray-500 select-none\">\r\n {suffix}\r\n </span>\r\n )}\r\n\r\n {rightIcon && (\r\n <span className={cn('flex-shrink-0 pr-3 text-gray-400', iconSizeStyles[size])}>\r\n {rightIcon}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {(error || helper) && (\r\n <p\r\n className={cn(\r\n 'mt-1.5',\r\n size === 'sm' ? 'text-xs' : 'text-sm',\r\n error ? 'text-rose-600' : 'text-gray-500'\r\n )}\r\n >\r\n {error || helper}\r\n </p>\r\n )}\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nInput.displayName = 'Input'\r\n\r\nexport default Input\r\n","// ============================================\n// 🃏 Card 卡片组件\n// ============================================\n\nimport React, { forwardRef } from 'react'\nimport { cn } from '../utils/cn'\n\nexport interface CardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** 卡片内容 */\n children?: React.ReactNode\n /** 卡片标题 */\n title?: React.ReactNode\n /** 卡片副标题 */\n subtitle?: string\n /** 头部额外内容 */\n extra?: React.ReactNode\n /** 底部内容 */\n footer?: React.ReactNode\n /** 封面图片 */\n cover?: string\n /** 变体样式 */\n variant?: 'elevated' | 'outlined' | 'filled' | 'glass'\n /** 是否可悬浮 */\n hoverable?: boolean\n /** 是否可点击 */\n clickable?: boolean\n /** 是否有边框 */\n bordered?: boolean\n /** 内边距大小 */\n padding?: 'none' | 'sm' | 'md' | 'lg'\n}\n\nconst Card = forwardRef<HTMLDivElement, CardProps>(\n (\n {\n children,\n title,\n subtitle,\n extra,\n footer,\n cover,\n variant = 'elevated',\n hoverable = false,\n clickable = false,\n bordered = false,\n padding = 'md',\n className,\n ...props\n },\n ref\n ) => {\n const baseStyles = cn(\n 'rounded-2xl overflow-hidden transition-all duration-300',\n clickable && 'cursor-pointer'\n )\n\n const variantStyles = {\n elevated: cn(\n 'bg-white',\n 'shadow-lg shadow-gray-200/50',\n hoverable && 'hover:shadow-xl hover:shadow-violet-500/10 hover:-translate-y-1'\n ),\n outlined: cn(\n 'bg-white border-2 border-gray-200',\n hoverable && 'hover:border-violet-500 hover:shadow-lg hover:shadow-violet-500/10'\n ),\n filled: cn(\n 'bg-gray-50',\n hoverable && 'hover:bg-gray-100'\n ),\n glass: cn(\n 'bg-white/70 backdrop-blur-xl',\n 'border border-white/20',\n 'shadow-lg shadow-gray-200/30',\n hoverable && 'hover:bg-white/80 hover:shadow-xl'\n ),\n }\n\n const paddingStyles = {\n none: '',\n sm: 'p-3',\n md: 'p-5',\n lg: 'p-8',\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n baseStyles,\n variantStyles[variant],\n bordered && 'border border-gray-200',\n className\n )}\n {...props}\n >\n {/* 封面图片 */}\n {cover && (\n <div className=\"relative overflow-hidden aspect-video\">\n <img\n src={cover}\n alt=\"\"\n className=\"w-full h-full object-cover transition-transform duration-500 hover:scale-105\"\n />\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/20 to-transparent\" />\n </div>\n )}\n\n {/* 卡片头部 */}\n {(title || extra) && (\n <div\n className={cn(\n 'flex items-start justify-between',\n paddingStyles[padding],\n cover && 'pt-4',\n !footer && children && 'pb-0'\n )}\n >\n <div className=\"flex-1 min-w-0\">\n {title && (\n <h3 className=\"text-lg font-semibold text-gray-900 truncate\">\n {title}\n </h3>\n )}\n {subtitle && (\n <p className=\"mt-1 text-sm text-gray-500\">{subtitle}</p>\n )}\n </div>\n {extra && <div className=\"flex-shrink-0 ml-4\">{extra}</div>}\n </div>\n )}\n\n {/* 卡片内容 */}\n {children && (\n <div\n className={cn(\n paddingStyles[padding],\n (title || cover) && 'pt-3'\n )}\n >\n {children}\n </div>\n )}\n\n {/* 卡片底部 */}\n {footer && (\n <div\n className={cn(\n 'border-t border-gray-100',\n paddingStyles[padding]\n )}\n >\n {footer}\n </div>\n )}\n </div>\n )\n }\n)\n\nCard.displayName = 'Card'\n\nexport default Card\n","// ============================================\r\n// 📋 Select 选择器组件\r\n// ============================================\r\n\r\nimport React, { forwardRef, useState, useRef, useEffect } from 'react'\r\nimport { cn } from '../utils/cn'\r\nimport { useId, useClickOutside, useKeyboardNavigation } from '../hooks'\r\n\r\nexport interface SelectOption {\r\n value: string | number\r\n label: string\r\n disabled?: boolean\r\n icon?: React.ReactNode\r\n}\r\n\r\nexport interface SelectProps {\r\n /** 选项列表 */\r\n options?: SelectOption[]\r\n /** 当前值 */\r\n value?: string | number\r\n /** 默认值 */\r\n defaultValue?: string | number\r\n /** 占位文本 */\r\n placeholder?: string\r\n /** 标签文本 */\r\n label?: string\r\n /** 错误信息 */\r\n error?: string\r\n /** 帮助文本 */\r\n helper?: string\r\n /** 是否禁用 */\r\n disabled?: boolean\r\n /** 是否必填 */\r\n required?: boolean\r\n /** 尺寸 */\r\n size?: 'sm' | 'md' | 'lg'\r\n /** 是否可搜索 */\r\n searchable?: boolean\r\n /** 是否可清除 */\r\n clearable?: boolean\r\n /** 值变化回调 */\r\n onChange?: (value: string | number) => void\r\n /** 自定义类名 */\r\n className?: string\r\n}\r\n\r\nconst Select = forwardRef<HTMLDivElement, SelectProps>(\r\n (\r\n {\r\n options = [\r\n { value: '1', label: '选项1' },\r\n { value: '2', label: '选项2' },\r\n { value: '3', label: '选项3' },\r\n ],\r\n value,\r\n defaultValue,\r\n placeholder = '请选择',\r\n label,\r\n error,\r\n helper,\r\n disabled = false,\r\n required = false,\r\n size = 'md',\r\n searchable = false,\r\n clearable = false,\r\n onChange,\r\n className,\r\n },\r\n ref\r\n ) => {\r\n const id = useId('select')\r\n const [isOpen, setIsOpen] = useState(false)\r\n const [search, setSearch] = useState('')\r\n const [selectedValue, setSelectedValue] = useState<string | number | undefined>(\r\n value ?? defaultValue\r\n )\r\n\r\n const dropdownRef = useClickOutside<HTMLDivElement>(() => setIsOpen(false))\r\n const inputRef = useRef<HTMLInputElement>(null)\r\n\r\n // 同步受控值\r\n useEffect(() => {\r\n if (value !== undefined) {\r\n setSelectedValue(value)\r\n }\r\n }, [value])\r\n \r\n const filteredOptions = options.filter((option) =>\r\n option.label.toLowerCase().includes(search.toLowerCase())\r\n )\r\n\r\n const selectedOption = options.find((opt) => opt.value === selectedValue)\r\n\r\n const { activeIndex, setActiveIndex, handleKeyDown } = useKeyboardNavigation(\r\n filteredOptions.length,\r\n (index) => {\r\n const option = filteredOptions[index]\r\n if (option && !option.disabled) {\r\n handleSelect(option.value)\r\n }\r\n }\r\n )\r\n\r\n const handleSelect = (val: string | number) => {\r\n setSelectedValue(val)\r\n setIsOpen(false)\r\n setSearch('')\r\n onChange?.(val)\r\n }\r\n\r\n const handleClear = (e: React.MouseEvent) => {\r\n e.stopPropagation()\r\n setSelectedValue(undefined)\r\n onChange?.('' as string | number)\r\n }\r\n\r\n const sizeStyles = {\r\n sm: 'py-1.5 px-3 text-sm',\r\n md: 'py-2.5 px-4 text-sm',\r\n lg: 'py-3 px-5 text-base',\r\n }\r\n\r\n const ChevronIcon = ({ isOpen }: { isOpen: boolean }) => (\r\n <svg\r\n className={cn(\r\n 'w-5 h-5 text-gray-400 transition-transform duration-200',\r\n isOpen && 'rotate-180'\r\n )}\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n )\r\n\r\n const CheckIcon = () => (\r\n <svg className=\"w-5 h-5 text-violet-600\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n )\r\n\r\n return (\r\n <div ref={ref} className={cn('w-full', className)}>\r\n {label && (\r\n <label\r\n htmlFor={id}\r\n className={cn(\r\n 'block font-medium mb-1.5 text-sm',\r\n error ? 'text-rose-600' : 'text-gray-700'\r\n )}\r\n >\r\n {label}\r\n {required && <span className=\"text-rose-500 ml-1\">*</span>}\r\n </label>\r\n )}\r\n\r\n <div ref={dropdownRef} className=\"relative\">\r\n {/* 触发器 */}\r\n <button\r\n type=\"button\"\r\n id={id}\r\n disabled={disabled}\r\n onClick={() => {\r\n if (!disabled) {\r\n setIsOpen(!isOpen)\r\n if (searchable && !isOpen) {\r\n setTimeout(() => inputRef.current?.focus(), 0)\r\n }\r\n }\r\n }}\r\n onKeyDown={handleKeyDown}\r\n className={cn(\r\n 'w-full flex items-center justify-between',\r\n 'border rounded-lg bg-white transition-all duration-200',\r\n sizeStyles[size],\r\n isOpen\r\n ? 'border-violet-500 ring-2 ring-violet-500/20'\r\n : error\r\n ? 'border-rose-400'\r\n : 'border-gray-300 hover:border-gray-400',\r\n disabled && 'opacity-50 cursor-not-allowed bg-gray-50'\r\n )}\r\n >\r\n <span\r\n className={cn(\r\n 'flex-1 text-left truncate',\r\n !selectedOption && 'text-gray-400'\r\n )}\r\n >\r\n {selectedOption ? (\r\n <span className=\"flex items-center gap-2\">\r\n {selectedOption.icon}\r\n {selectedOption.label}\r\n </span>\r\n ) : (\r\n placeholder\r\n )}\r\n </span>\r\n\r\n <span className=\"flex items-center gap-1 ml-2\">\r\n {clearable && selectedValue && !disabled && (\r\n <button\r\n type=\"button\"\r\n onClick={handleClear}\r\n className=\"p-1 rounded-full hover:bg-gray-100\"\r\n >\r\n <svg className=\"w-4 h-4 text-gray-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n )}\r\n <ChevronIcon isOpen={isOpen} />\r\n </span>\r\n </button>\r\n\r\n {/* 下拉菜单 */}\r\n {isOpen && (\r\n <div\r\n className={cn(\r\n 'absolute z-50 w-full mt-1',\r\n 'bg-white border border-gray-200 rounded-xl shadow-xl',\r\n 'animate-in fade-in slide-in-from-top-2 duration-200'\r\n )}\r\n >\r\n {/* 搜索框 */}\r\n {searchable && (\r\n <div className=\"p-2 border-b border-gray-100\">\r\n <input\r\n ref={inputRef}\r\n type=\"text\"\r\n value={search}\r\n onChange={(e) => setSearch(e.target.value)}\r\n placeholder=\"搜索...\"\r\n className=\"w-full px-3 py-2 text-sm bg-gray-50 rounded-lg outline-none focus:bg-white focus:ring-2 focus:ring-violet-500/20\"\r\n />\r\n </div>\r\n )}\r\n\r\n {/* 选项列表 */}\r\n <div className=\"max-h-60 overflow-auto py-1\">\r\n {filteredOptions.length === 0 ? (\r\n <div className=\"px-4 py-3 text-sm text-gray-500 text-center\">\r\n 无匹配选项\r\n </div>\r\n ) : (\r\n filteredOptions.map((option, index) => (\r\n <button\r\n key={option.value}\r\n type=\"button\"\r\n disabled={option.disabled}\r\n onClick={() => handleSelect(option.value)}\r\n onMouseEnter={() => setActiveIndex(index)}\r\n className={cn(\r\n 'w-full flex items-center justify-between px-4 py-2.5 text-left',\r\n 'transition-colors duration-100',\r\n option.disabled\r\n ? 'text-gray-300 cursor-not-allowed'\r\n : activeIndex === index\r\n ? 'bg-violet-50 text-violet-700'\r\n : 'text-gray-700 hover:bg-gray-50',\r\n option.value === selectedValue && 'font-medium'\r\n )}\r\n >\r\n <span className=\"flex items-center gap-2\">\r\n {option.icon}\r\n {option.label}\r\n </span>\r\n {option.value === selectedValue && <CheckIcon />}\r\n </button>\r\n ))\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {(error || helper) && (\r\n <p className={cn('mt-1.5 text-sm', error ? 'text-rose-600' : 'text-gray-500')}>\r\n {error || helper}\r\n </p>\r\n )}\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nSelect.displayName = 'Select'\r\n\r\nexport default Select\r\n\r\n","// ============================================\r\n// ☑️ Checkbox 复选框组件\r\n// ============================================\r\n\r\nimport React, { forwardRef } from 'react'\r\nimport { cn } from '../utils/cn'\r\nimport { useId, useControllableState } from '../hooks'\r\n\r\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'onChange'> {\r\n /** 复选框标签 */\r\n label?: React.ReactNode\r\n /** 描述文本 */\r\n description?: string\r\n /** 是否选中 */\r\n checked?: boolean\r\n /** 默认是否选中 */\r\n defaultChecked?: boolean\r\n /** 不确定状态 */\r\n indeterminate?: boolean\r\n /** 尺寸 */\r\n size?: 'sm' | 'md' | 'lg'\r\n /** 颜色 */\r\n color?: 'violet' | 'cyan' | 'emerald' | 'rose' | 'amber'\r\n /** 是否禁用 */\r\n disabled?: boolean\r\n /** 是否有错误 */\r\n error?: boolean\r\n /** 选中变化回调 */\r\n onChange?: (checked: boolean) => void\r\n}\r\n\r\nconst Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\r\n (\r\n {\r\n label,\r\n description,\r\n checked,\r\n defaultChecked = false,\r\n indeterminate = false,\r\n size = 'md',\r\n color = 'violet',\r\n disabled = false,\r\n error = false,\r\n onChange,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const id = useId('checkbox')\r\n const inputId = props.id || id\r\n const [isChecked, setIsChecked] = useControllableState(checked, defaultChecked, onChange)\r\n\r\n const sizeStyles = {\r\n sm: {\r\n box: 'w-4 h-4',\r\n icon: 'w-3 h-3',\r\n label: 'text-sm',\r\n description: 'text-xs',\r\n },\r\n md: {\r\n box: 'w-5 h-5',\r\n icon: 'w-3.5 h-3.5',\r\n label: 'text-sm',\r\n description: 'text-xs',\r\n },\r\n lg: {\r\n box: 'w-6 h-6',\r\n icon: 'w-4 h-4',\r\n label: 'text-base',\r\n description: 'text-sm',\r\n },\r\n }\r\n\r\n const colorStyles = {\r\n violet: {\r\n checked: 'bg-violet-600 border-violet-600',\r\n focus: 'focus:ring-violet-500/30',\r\n },\r\n cyan: {\r\n checked: 'bg-cyan-600 border-cyan-600',\r\n focus: 'focus:ring-cyan-500/30',\r\n },\r\n emerald: {\r\n checked: 'bg-emerald-600 border-emerald-600',\r\n focus: 'focus:ring-emerald-500/30',\r\n },\r\n rose: {\r\n checked: 'bg-rose-600 border-rose-600',\r\n focus: 'focus:ring-rose-500/30',\r\n },\r\n amber: {\r\n checked: 'bg-amber-600 border-amber-600',\r\n focus: 'focus:ring-amber-500/30',\r\n },\r\n }\r\n\r\n const CheckIcon = () => (\r\n <svg\r\n className={cn(sizeStyles[size].icon, 'text-white')}\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n strokeWidth={3}\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n )\r\n\r\n const IndeterminateIcon = () => (\r\n <svg\r\n className={cn(sizeStyles[size].icon, 'text-white')}\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n strokeWidth={3}\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 12h14\" />\r\n </svg>\r\n )\r\n\r\n return (\r\n <label\r\n className={cn(\r\n 'inline-flex items-start gap-3 cursor-pointer select-none',\r\n disabled && 'opacity-50 cursor-not-allowed',\r\n className\r\n )}\r\n >\r\n <span className=\"relative flex-shrink-0 mt-0.5\">\r\n <input\r\n ref={ref}\r\n type=\"checkbox\"\r\n id={inputId}\r\n checked={isChecked}\r\n disabled={disabled}\r\n onChange={(e) => setIsChecked(e.target.checked)}\r\n className=\"sr-only peer\"\r\n {...props}\r\n />\r\n <span\r\n className={cn(\r\n 'flex items-center justify-center rounded-md border-2 transition-all duration-200',\r\n sizeStyles[size].box,\r\n colorStyles[color].focus,\r\n 'focus:ring-4',\r\n isChecked || indeterminate\r\n ? colorStyles[color].checked\r\n : error\r\n ? 'border-rose-400 bg-white'\r\n : 'border-gray-300 bg-white hover:border-gray-400',\r\n 'peer-focus:ring-4'\r\n )}\r\n >\r\n {indeterminate ? <IndeterminateIcon /> : isChecked && <CheckIcon />}\r\n </span>\r\n </span>\r\n\r\n {(label || description) && (\r\n <span className=\"flex flex-col\">\r\n {label && (\r\n <span\r\n className={cn(\r\n 'font-medium text-gray-900',\r\n sizeStyles[size].label,\r\n disabled && 'text-gray-500'\r\n )}\r\n >\r\n {label}\r\n </span>\r\n )}\r\n {description && (\r\n <span\r\n className={cn(\r\n 'text-gray-500 mt-0.5',\r\n sizeStyles[size].description\r\n )}\r\n >\r\n {description}\r\n </span>\r\n )}\r\n </span>\r\n )}\r\n </label>\r\n )\r\n }\r\n)\r\n\r\nCheckbox.displayName = 'Checkbox'\r\n\r\nexport default Checkbox\r\n\r\n","// ============================================\r\n// 🔀 Switch 开关组件\r\n// ============================================\r\n\r\nimport React, { forwardRef } from 'react'\r\nimport { cn } from '../utils/cn'\r\nimport { useId, useControllableState } from '../hooks'\r\n\r\nexport interface SwitchProps {\r\n /** 是否开启 */\r\n checked?: boolean\r\n /** 默认是否开启 */\r\n defaultChecked?: boolean\r\n /** 标签文本 */\r\n label?: React.ReactNode\r\n /** 描述文本 */\r\n description?: string\r\n /** 尺寸 */\r\n size?: 'sm' | 'md' | 'lg'\r\n /** 颜色 */\r\n color?: 'violet' | 'cyan' | 'emerald' | 'rose' | 'amber'\r\n /** 是否禁用 */\r\n disabled?: boolean\r\n /** 是否显示状态图标 */\r\n showIcons?: boolean\r\n /** 开启时的文本 */\r\n onLabel?: string\r\n /** 关闭时的文本 */\r\n offLabel?: string\r\n /** 状态变化回调 */\r\n onChange?: (checked: boolean) => void\r\n /** 自定义类名 */\r\n className?: string\r\n}\r\n\r\nconst Switch = forwardRef<HTMLButtonElement, SwitchProps>(\r\n (\r\n {\r\n checked,\r\n defaultChecked = false,\r\n label,\r\n description,\r\n size = 'md',\r\n color = 'violet',\r\n disabled = false,\r\n showIcons = false,\r\n onLabel,\r\n offLabel,\r\n onChange,\r\n className,\r\n },\r\n ref\r\n ) => {\r\n const id = useId('switch')\r\n const [isChecked, setIsChecked] = useControllableState(checked, defaultChecked, onChange)\r\n\r\n const sizeStyles = {\r\n sm: {\r\n track: 'w-8 h-5',\r\n thumb: 'w-3.5 h-3.5',\r\n translate: 'translate-x-3.5',\r\n label: 'text-sm',\r\n description: 'text-xs',\r\n },\r\n md: {\r\n track: 'w-11 h-6',\r\n thumb: 'w-4 h-4',\r\n translate: 'translate-x-5',\r\n label: 'text-sm',\r\n description: 'text-xs',\r\n },\r\n lg: {\r\n track: 'w-14 h-8',\r\n thumb: 'w-6 h-6',\r\n translate: 'translate-x-6',\r\n label: 'text-base',\r\n description: 'text-sm',\r\n },\r\n }\r\n\r\n const colorStyles = {\r\n violet: 'bg-violet-600',\r\n cyan: 'bg-cyan-600',\r\n emerald: 'bg-emerald-600',\r\n rose: 'bg-rose-600',\r\n amber: 'bg-amber-600',\r\n }\r\n\r\n const CheckIcon = () => (\r\n <svg className=\"w-2.5 h-2.5 text-violet-600\" fill=\"currentColor\" viewBox=\"0 0 12 12\">\r\n <path d=\"M3.707 5.293a1 1 0 00-1.414 1.414l1.414-1.414zM5 8l-.707.707a1 1 0 001.414 0L5 8zm4.707-3.293a1 1 0 00-1.414-1.414l1.414 1.414zm-7.414 2l2 2 1.414-1.414-2-2-1.414 1.414zm3.414 2l4-4-1.414-1.414-4 4 1.414 1.414z\" />\r\n </svg>\r\n )\r\n\r\n const CloseIcon = () => (\r\n <svg className=\"w-2.5 h-2.5 text-gray-400\" fill=\"currentColor\" viewBox=\"0 0 12 12\">\r\n <path d=\"M4.293 4.293a1 1 0 011.414 0L7 5.586l1.293-1.293a1 1 0 111.414 1.414L8.414 7l1.293 1.293a1 1 0 01-1.414 1.414L7 8.414l-1.293 1.293a1 1 0 01-1.414-1.414L5.586 7 4.293 5.707a1 1 0 010-1.414z\" />\r\n </svg>\r\n )\r\n\r\n return (\r\n <div className={cn('inline-flex items-start gap-3', className)}>\r\n <button\r\n ref={ref}\r\n type=\"button\"\r\n role=\"switch\"\r\n id={id}\r\n aria-checked={isChecked}\r\n disabled={disabled}\r\n onClick={() => !disabled && setIsChecked(!isChecked)}\r\n className={cn(\r\n 'relative inline-flex flex-shrink-0 items-center rounded-full',\r\n 'transition-colors duration-200 ease-in-out',\r\n 'focus:outline-none focus:ring-4 focus:ring-violet-500/30',\r\n sizeStyles[size].track,\r\n isChecked ? colorStyles[color] : 'bg-gray-300',\r\n disabled && 'opacity-50 cursor-not-allowed'\r\n )}\r\n >\r\n <span\r\n className={cn(\r\n 'inline-flex items-center justify-center rounded-full bg-white shadow-lg',\r\n 'transform transition-transform duration-200 ease-in-out',\r\n sizeStyles[size].thumb,\r\n isChecked ? sizeStyles[size].translate : 'translate-x-1'\r\n )}\r\n >\r\n {showIcons && (isChecked ? <CheckIcon /> : <CloseIcon />)}\r\n </span>\r\n\r\n {/* 内嵌标签 */}\r\n {(onLabel || offLabel) && size === 'lg' && (\r\n <span\r\n className={cn(\r\n 'absolute text-xs font-medium',\r\n isChecked ? 'left-2 text-white' : 'right-2 text-gray-500'\r\n )}\r\n >\r\n {isChecked ? onLabel : offLabel}\r\n </span>\r\n )}\r\n </button>\r\n\r\n {(label || description) && (\r\n <div className=\"flex flex-col\">\r\n {label && (\r\n <span\r\n className={cn(\r\n 'font-medium text-gray-900',\r\n sizeStyles[size].label,\r\n disabled && 'text-gray-500'\r\n )}\r\n >\r\n {label}\r\n </span>\r\n )}\r\n {description && (\r\n <span className={cn('text-gray-500 mt-0.5', sizeStyles[size].description)}>\r\n {description}\r\n </span>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nSwitch.displayName = 'Switch'\r\n\r\nexport default Switch\r\n\r\n","// ============================================\n// 🔘 Radio 单选框组件\n// ============================================\n\nimport React, { forwardRef, createContext, useContext } from 'react'\nimport { cn } from '../utils/cn'\nimport { useId, useControllableState } from '../hooks'\n\n// Radio Group Context\ninterface RadioGroupContextValue {\n name?: string\n value?: string | number\n onChange?: (value: string | number) => void\n size?: 'sm' | 'md' | 'lg'\n color?: 'violet' | 'cyan' | 'emerald' | 'rose' | 'amber'\n disabled?: boolean\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue>({})\n\n// Radio Group 组件\nexport interface RadioGroupProps {\n /** 组名称 */\n name?: string\n /** 当前值 */\n value?: string | number\n /** 默认值 */\n defaultValue?: string | number\n /** 标签文本 */\n label?: string\n /** 子元素 */\n children: React.ReactNode\n /** 尺寸 */\n size?: 'sm' | 'md' | 'lg'\n /** 颜色 */\n color?: 'violet' | 'cyan' | 'emerald' | 'rose' | 'amber'\n /** 是否禁用 */\n disabled?: boolean\n /** 排列方向 */\n direction?: 'horizontal' | 'vertical'\n /** 值变化回调 */\n onChange?: (value: string | number) => void\n /** 自定义类名 */\n className?: string\n}\n\nexport function RadioGroup({\n name,\n value,\n defaultValue,\n label,\n children,\n size = 'md',\n color = 'violet',\n disabled = false,\n direction = 'vertical',\n onChange,\n className,\n}: RadioGroupProps) {\n const id = useId('radio-group')\n const groupName = name || id\n const [selectedValue, setSelectedValue] = useControllableState(value, defaultValue ?? '', onChange)\n\n return (\n <RadioGroupContext.Provider\n value={{\n name: groupName,\n value: selectedValue,\n onChange: setSelectedValue,\n size,\n color,\n disabled,\n }}\n >\n <fieldset className={cn('w-full', className)}>\n {label && (\n <legend className=\"block font-medium text-sm text-gray-700 mb-3\">\n {label}\n </legend>\n )}\n <div\n className={cn(\n 'flex gap-4',\n direction === 'vertical' ? 'flex-col' : 'flex-row flex-wrap'\n )}\n >\n {children}\n </div>\n </fieldset>\n </RadioGroupContext.Provider>\n )\n}\n\n// Radio 单选框组件\nexport interface RadioProps {\n /** 单选框的值 */\n value: string | number\n /** 标签文本 */\n label?: React.ReactNode\n /** 描述文本 */\n description?: string\n /** 是否禁用 */\n disabled?: boolean\n /** 自定义类名 */\n className?: string\n}\n\nconst Radio = forwardRef<HTMLInputElement, RadioProps>(\n ({ value, label, description, disabled: itemDisabled, className }, ref) => {\n const id = useId('radio')\n const context = useContext(RadioGroupContext)\n\n const isDisabled = itemDisabled ?? context.disabled\n const isChecked = context.value === value\n const size = context.size || 'md'\n const color = context.color || 'violet'\n\n const handleChange = () => {\n if (!isDisabled) {\n context.onChange?.(value)\n }\n }\n\n const sizeStyles = {\n sm: {\n outer: 'w-4 h-4',\n inner: 'w-2 h-2',\n label: 'text-sm',\n description: 'text-xs',\n },\n md: {\n outer: 'w-5 h-5',\n inner: 'w-2.5 h-2.5',\n label: 'text-sm',\n description: 'text-xs',\n },\n lg: {\n outer: 'w-6 h-6',\n inner: 'w-3 h-3',\n label: 'text-base',\n description: 'text-sm',\n },\n }\n\n const colorStyles = {\n violet: 'bg-violet-600 border-violet-600',\n cyan: 'bg-cyan-600 border-cyan-600',\n emerald: 'bg-emerald-600 border-emerald-600',\n rose: 'bg-rose-600 border-rose-600',\n amber: 'bg-amber-600 border-amber-600',\n }\n\n return (\n <label\n className={cn(\n 'inline-flex items-start gap-3 cursor-pointer select-none',\n isDisabled && 'opacity-50 cursor-not-allowed',\n className\n )}\n >\n <span className=\"relative flex-shrink-0 mt-0.5\">\n <input\n ref={ref}\n type=\"radio\"\n id={id}\n name={context.name}\n value={value}\n checked={isChecked}\n disabled={isDisabled}\n onChange={handleChange}\n className=\"sr-only peer\"\n />\n <span\n className={cn(\n 'flex items-center justify-center rounded-full border-2 transition-all duration-200',\n sizeStyles[size].outer,\n isChecked\n ? colorStyles[color]\n : 'border-gray-300 bg-white hover:border-gray-400',\n 'peer-focus:ring-4 peer-focus:ring-violet-500/30'\n )}\n >\n <span\n className={cn(\n 'rounded-full bg-white transition-transform duration-200',\n sizeStyles[size].inner,\n isChecked ? 'scale-100' : 'scale-0'\n )}\n />\n </span>\n </span>\n\n {(label || description) && (\n <span className=\"flex flex-col\">\n {label && (\n <span\n className={cn(\n 'font-medium text-gray-900',\n sizeStyles[size].label,\n isDisabled && 'text-gray-500'\n )}\n >\n {label}\n </span>\n )}\n {description && (\n <span className={cn('text-gray-500 mt-0.5', sizeStyles[size].description)}>\n {description}\n </span>\n )}\n </span>\n )}\n </label>\n )\n }\n)\n\nRadio.displayName = 'Radio'\n\nexport default Radio\n\n","// ============================================\n// 📄 Textarea 文本域组件\n// ============================================\n\nimport React, { forwardRef, useState, useEffect, useRef } from 'react'\nimport { cn } from '../utils/cn'\nimport { useId } from '../hooks'\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n /** 标签文本 */\n label?: string\n /** 错误信息 */\n error?: string\n /** 帮助文本 */\n helper?: string\n /** 变体样式 */\n variant?: 'default' | 'filled' | 'flushed'\n /** 是否必填 */\n required?: boolean\n /** 是否显示字数统计 */\n showCount?: boolean\n /** 最大字符数 */\n maxLength?: number\n /** 是否自动调整高度 */\n autoSize?: boolean | { minRows?: number; maxRows?: number }\n /** 调整大小方式 */\n resize?: 'none' | 'vertical' | 'horizontal' | 'both'\n}\n\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n label,\n error,\n helper,\n variant = 'default',\n required,\n showCount = false,\n maxLength,\n autoSize = false,\n resize = 'vertical',\n className,\n disabled,\n value,\n defaultValue,\n rows = 4,\n onChange,\n ...props\n },\n ref\n ) => {\n const id = useId('textarea')\n const inputId = props.id || id\n const [isFocused, setIsFocused] = useState(false)\n const [charCount, setCharCount] = useState(0)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n\n // 合并 ref\n const combinedRef = (node: HTMLTextAreaElement | null) => {\n (textareaRef as React.MutableRefObject<HTMLTextAreaElement | null>).current = node\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLTextAreaElement | null>).current = node\n }\n }\n\n // 自动调整高度\n useEffect(() => {\n if (autoSize && textareaRef.current) {\n const textarea = textareaRef.current\n const computedStyle = window.getComputedStyle(textarea)\n const lineHeight = parseInt(computedStyle.lineHeight) || 20\n\n const minRows = typeof autoSize === 'object' ? autoSize.minRows || 2 : 2\n const maxRows = typeof autoSize === 'object' ? autoSize.maxRows || 10 : 10\n\n textarea.style.height = 'auto'\n const scrollHeight = textarea.scrollHeight\n const minHeight = lineHeight * minRows + 16\n const maxHeight = lineHeight * maxRows + 16\n\n textarea.style.height = `${Math.min(Math.max(scrollHeight, minHeight), maxHeight)}px`\n }\n }, [value, defaultValue, autoSize])\n\n // 字符计数\n useEffect(() => {\n const text = (value ?? defaultValue ?? '') as string\n setCharCount(text.length)\n }, [value, defaultValue])\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setCharCount(e.target.value.length)\n onChange?.(e)\n }\n\n const variantStyles = {\n default: cn(\n 'border rounded-lg bg-white',\n isFocused\n ? 'border-violet-500 ring-2 ring-violet-500/20'\n : error\n ? 'border-rose-400'\n : 'border-gray-300 hover:border-gray-400'\n ),\n filled: cn(\n 'rounded-lg bg-gray-100 border-transparent',\n isFocused\n ? 'bg-white ring-2 ring-violet-500/20'\n : error\n ? 'bg-rose-50'\n : 'hover:bg-gray-200'\n ),\n flushed: cn(\n 'border-b-2 rounded-none bg-transparent',\n isFocused\n ? 'border-violet-500'\n : error\n ? 'border-rose-400'\n : 'border-gray-300'\n ),\n }\n\n const resizeStyles = {\n none: 'resize-none',\n vertical: 'resize-y',\n horizontal: 'resize-x',\n both: 'resize',\n }\n\n return (\n <div className=\"w-full\">\n {label && (\n <label\n htmlFor={inputId}\n className={cn(\n 'block font-medium mb-1.5 text-sm',\n error ? 'text-rose-600' : 'text-gray-700'\n )}\n >\n {label}\n {required && <span className=\"text-rose-500 ml-1\">*</span>}\n </label>\n )}\n\n <div className=\"relative\">\n <textarea\n ref={combinedRef}\n id={inputId}\n rows={rows}\n value={value}\n defaultValue={defaultValue}\n disabled={disabled}\n maxLength={maxLength}\n onChange={handleChange}\n onFocus={(e) => {\n setIsFocused(true)\n props.onFocus?.(e)\n }}\n onBlur={(e) => {\n setIsFocused(false)\n props.onBlur?.(e)\n }}\n className={cn(\n 'w-full px-4 py-3 text-sm outline-none transition-all duration-200',\n 'placeholder:text-gray-400',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n variantStyles[variant],\n autoSize ? 'resize-none overflow-hidden' : resizeStyles[resize],\n className\n )}\n {...props}\n />\n </div>\n\n <div className=\"flex items-center justify-between mt-1.5\">\n {(error || helper) && (\n <p className={cn('text-sm', error ? 'text-rose-600' : 'text-gray-500')}>\n {error || helper}\n </p>\n )}\n {showCount && (\n <p\n className={cn(\n 'text-xs ml-auto',\n maxLength && charCount >= maxLength ? 'text-rose-500' : 'text-gray-400'\n )}\n >\n {charCount}\n {maxLength && ` / ${maxLength}`}\n </p>\n )}\n </div>\n </div>\n )\n }\n)\n\nTextarea.displayName = 'Textarea'\n\nexport default Textarea\n\n","// ============================================\r\n// 🪟 Dialog 弹框组件\r\n// ============================================\r\n\r\nimport React, { useCallback, useState } from 'react'\r\nimport { createPortal } from 'react-dom'\r\nimport { cn } from '../utils/cn'\r\nimport Button from './Button'\r\n\r\nexport interface DialogProps {\r\n /** 标题 */\r\n title?: React.ReactNode\r\n /** 内容 */\r\n children?: React.ReactNode\r\n /** 底部按钮 */\r\n footer?: React.ReactNode\r\n /** 是否可见 */\r\n visible?: boolean\r\n /** 可见性变化回调 */\r\n onVisibleChange?: (visible: boolean) => void\r\n /** 可见性变化回调 (更直接的方式) */\r\n onClose?: () => void\r\n /** 尺寸 */\r\n size?: 'sm' | 'md' | 'lg' | 'xl'\r\n /** 是否可关闭 */\r\n closable?: boolean\r\n /** 点击背景关闭 */\r\n maskClosable?: boolean\r\n /** 居中展示 */\r\n centered?: boolean\r\n /** 确认回调 */\r\n onOk?: () => void | Promise<void>\r\n /** 取消回调 */\r\n onCancel?: () => void\r\n /** 确认按钮文本 */\r\n okText?: string\r\n /** 取消按钮文本 */\r\n cancelText?: string\r\n /** 是否显示底部按钮 */\r\n showFooter?: boolean\r\n /** 自定义 class */\r\n className?: string\r\n /** z-index */\r\n zIndex?: number\r\n /** 加载中 */\r\n loading?: boolean\r\n /** 弹框类名 */\r\n dialogClassName?: string\r\n /** 标题类名 */\r\n headerClassName?: string\r\n /** 内容类名 */\r\n bodyClassName?: string\r\n /** 底部类名 */\r\n footerClassName?: string\r\n}\r\n\r\nexport default function Dialog({\r\n title = '提示',\r\n children = '这是弹框内容',\r\n footer,\r\n visible = false,\r\n onVisibleChange,\r\n onClose,\r\n size = 'md',\r\n closable = true,\r\n maskClosable = true,\r\n centered = true,\r\n onOk,\r\n onCancel,\r\n okText = '确认',\r\n cancelText = '取消',\r\n showFooter = true,\r\n className,\r\n zIndex = 99,\r\n loading = false,\r\n dialogClassName,\r\n headerClassName,\r\n bodyClassName,\r\n footerClassName\r\n}: DialogProps) {\r\n const handleClose = useCallback(() => {\r\n onVisibleChange?.(false)\r\n onClose?.()\r\n }, [onVisibleChange, onClose])\r\n\r\n const handleCancel = useCallback(() => {\r\n onCancel?.()\r\n handleClose()\r\n }, [onCancel, handleClose])\r\n\r\n const handleOk = useCallback(async () => {\r\n try {\r\n await onOk?.()\r\n handleClose()\r\n } catch (error) {\r\n console.error('Dialog OK error:', error)\r\n }\r\n }, [onOk, handleClose])\r\n\r\n const handleMaskClick = useCallback(() => {\r\n if (maskClosable) {\r\n handleCancel()\r\n }\r\n }, [maskClosable, handleCancel])\r\n\r\n // 尺寸映射\r\n const sizeStyles = {\r\n sm: 'w-80',\r\n md: 'w-[500px]',\r\n lg: 'w-[700px]',\r\n xl: 'w-[900px]',\r\n }\r\n\r\n if (!visible || typeof document === 'undefined') {\r\n return null\r\n }\r\n\r\n return createPortal(\r\n <div className={cn('fixed inset-0', className)} style={{ zIndex, display: 'flex', alignItems: centered ? 'center' : 'flex-start', justifyContent: 'center', paddingTop: centered ? undefined : '60px' }}>\r\n {/* 背景遮罩 */}\r\n <div\r\n className=\"fixed inset-0 bg-black/50 transition-opacity\"\r\n onClick={handleMaskClick}\r\n style={{ zIndex: zIndex - 1 }}\r\n />\r\n\r\n {/* 弹框容器 */}\r\n <div\r\n className={cn(\r\n 'relative bg-white rounded-lg shadow-2xl max-h-[90vh] overflow-hidden flex flex-col',\r\n sizeStyles[size],\r\n dialogClassName\r\n )}\r\n style={{ zIndex }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n {/* 标题 */}\r\n {title && (\r\n <div\r\n className={cn(\r\n 'px-6 py-4 border-b border-gray-200 flex items-center justify-between',\r\n headerClassName\r\n )}\r\n >\r\n <h2 className=\"text-lg font-semibold text-gray-900\">{title}</h2>\r\n {closable && (\r\n <button\r\n onClick={handleClose}\r\n className=\"text-gray-400 hover:text-gray-600 focus:outline-none transition-colors\"\r\n aria-label=\"关闭\"\r\n >\r\n <svg\r\n className=\"w-6 h-6\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n strokeWidth={2}\r\n d=\"M6 18L18 6M6 6l12 12\"\r\n />\r\n </svg>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* 内容区域 */}\r\n <div\r\n className={cn(\r\n 'flex-1 px-6 py-4 overflow-y-auto',\r\n title ? '' : (closable ? 'pt-4' : 'pt-2'),\r\n bodyClassName\r\n )}\r\n >\r\n {children}\r\n </div>\r\n\r\n {showFooter && (\r\n <div\r\n className={cn(\r\n 'px-6 py-4 border-t border-gray-200 flex gap-4 justify-end',\r\n footerClassName\r\n )}\r\n >\r\n {footer ? (\r\n footer\r\n ) : (\r\n <>\r\n <Button\r\n variant=\"secondary\"\r\n onClick={handleCancel}\r\n disabled={loading}\r\n >\r\n {cancelText}\r\n </Button>\r\n <Button\r\n variant=\"primary\"\r\n onClick={handleOk}\r\n loading={loading}\r\n >\r\n {okText}\r\n </Button>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n </div>,\r\n document.body\r\n )\r\n}\r\n","// ============================================\r\n// 🍞 Toast 轻提示组件\r\n// ============================================\r\n\r\nimport React, { createContext, useContext, useState, useCallback } from 'react'\r\nimport { createPortal } from 'react-dom'\r\nimport { cn } from '../utils/cn'\r\n\r\ntype ToastType = 'info' | 'success' | 'warning' | 'error'\r\ntype ToastPosition = 'top' | 'top-left' | 'top-right' | 'bottom' | 'bottom-left' | 'bottom-right'\r\n\r\nexport interface ToastItem {\r\n id: string\r\n type: ToastType\r\n message: string\r\n duration?: number\r\n closable?: boolean\r\n}\r\n\r\ninterface ToastContextValue {\r\n toast: (options: Omit<ToastItem, 'id'>) => void\r\n info: (message: string, duration?: number) => void\r\n success: (message: string, duration?: number) => void\r\n warning: (message: string, duration?: number) => void\r\n error: (message: string, duration?: number) => void\r\n}\r\n\r\nconst ToastContext = createContext<ToastContextValue | null>(null)\r\n\r\nexport function useToast() {\r\n const context = useContext(ToastContext)\r\n if (!context) {\r\n throw new Error('useToast must be used within a ToastProvider')\r\n }\r\n return context\r\n}\r\n\r\nexport interface ToastProviderProps {\r\n children: React.ReactNode\r\n position?: ToastPosition\r\n maxToasts?: number\r\n}\r\n\r\nexport function ToastProvider({\r\n children,\r\n position = 'top-right',\r\n maxToasts = 5,\r\n}: ToastProviderProps) {\r\n const [toasts, setToasts] = useState<ToastItem[]>([])\r\n\r\n const removeToast = useCallback((id: string) => {\r\n setToasts((prev) => prev.filter((t) => t.id !== id))\r\n }, [])\r\n\r\n const addToast = useCallback(\r\n (options: Omit<ToastItem, 'id'>) => {\r\n const id = `toast-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\r\n const newToast: ToastItem = { ...options, id }\r\n\r\n setToasts((prev) => {\r\n const updated = [...prev, newToast]\r\n return updated.slice(-maxToasts)\r\n })\r\n\r\n // 自动移除\r\n const duration = options.duration ?? 3000\r\n if (duration > 0) {\r\n setTimeout(() => removeToast(id), duration)\r\n }\r\n },\r\n [maxToasts, removeToast]\r\n )\r\n\r\n const toast = useCallback(\r\n (options: Omit<ToastItem, 'id'>) => addToast(options),\r\n [addToast]\r\n )\r\n\r\n const info = useCallback(\r\n (message: string, duration?: number) =>\r\n addToast({ type: 'info', message, duration }),\r\n [addToast]\r\n )\r\n\r\n const success = useCallback(\r\n (message: string, duration?: number) =>\r\n addToast({ type: 'success', message, duration }),\r\n [addToast]\r\n )\r\n\r\n const warning = useCallback(\r\n (message: string, duration?: number) =>\r\n addToast({ type: 'warning', message, duration }),\r\n [addToast]\r\n )\r\n\r\n const error = useCallback(\r\n (message: string, duration?: number) =>\r\n addToast({ type: 'error', message, duration }),\r\n [addToast]\r\n )\r\n\r\n const positionStyles = {\r\n top: 'top-4 left-1/2 -translate-x-1/2 items-center',\r\n 'top-left': 'top-4 left-4 items-start',\r\n 'top-right': 'top-4 right-4 items-end',\r\n bottom: 'bottom-4 left-1/2 -translate-x-1/2 items-center',\r\n 'bottom-left': 'bottom-4 left-4 items-start',\r\n 'bottom-right': 'bottom-4 right-4 items-end',\r\n }\r\n\r\n return (\r\n <ToastContext.Provider value={{ toast, info, success, warning, error }}>\r\n {children}\r\n {typeof document !== 'undefined' &&\r\n createPortal(\r\n <div\r\n className={cn(\r\n 'fixed z-[100] flex flex-col gap-2 pointer-events-none',\r\n positionStyles[position]\r\n )}\r\n >\r\n {toasts.map((t) => (\r\n <ToastItemComponent\r\n key={t.id}\r\n item={t}\r\n onClose={() => removeToast(t.id)}\r\n />\r\n ))}\r\n </div>,\r\n document.body\r\n )}\r\n </ToastContext.Provider>\r\n )\r\n}\r\n\r\ninterface ToastItemComponentProps {\r\n item: ToastItem\r\n onClose: () => void\r\n}\r\n\r\nfunction ToastItemComponent({ item, onClose }: ToastItemComponentProps) {\r\n const typeStyles = {\r\n info: {\r\n bg: 'bg-blue-50 border-blue-200',\r\n icon: 'text-blue-500',\r\n text: 'text-blue-800',\r\n },\r\n success: {\r\n bg: 'bg-emerald-50 border-emerald-200',\r\n icon: 'text-emerald-500',\r\n text: 'text-emerald-800',\r\n },\r\n warning: {\r\n bg: 'bg-amber-50 border-amber-200',\r\n icon: 'text-amber-500',\r\n text: 'text-amber-800',\r\n },\r\n error: {\r\n bg: 'bg-rose-50 border-rose-200',\r\n icon: 'text-rose-500',\r\n text: 'text-rose-800',\r\n },\r\n }\r\n\r\n const icons = {\r\n info: (\r\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\r\n </svg>\r\n ),\r\n success: (\r\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\r\n </svg>\r\n ),\r\n warning: (\r\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\r\n </svg>\r\n ),\r\n error: (\r\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\" />\r\n </svg>\r\n ),\r\n }\r\n\r\n const styles = typeStyles[item.type]\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'flex items-center gap-3 px-4 py-3 rounded-xl border shadow-lg',\r\n 'pointer-events-auto backdrop-blur-sm',\r\n 'animate-in slide-in-from-right fade-in duration-300',\r\n styles.bg\r\n )}\r\n >\r\n <span className={styles.icon}>{icons[item.type]}</span>\r\n <p className={cn('text-sm font-medium flex-1', styles.text)}>\r\n {item.message}\r\n </p>\r\n {item.closable !== false && (\r\n <button\r\n onClick={onClose}\r\n className={cn('p-1 rounded-lg hover:bg-black/5', styles.icon)}\r\n >\r\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\n","// ============================================\r\n// ⚠️ Alert 警告提示组件\r\n// ============================================\r\n\r\nimport React, { useState } from 'react'\r\nimport { cn } from '../utils/cn'\r\n\r\nexport interface AlertProps {\r\n /** 警告类型 */\r\n type?: 'info' | 'success' | 'warning' | 'error'\r\n /** 标题 */\r\n title?: string\r\n /** 内容 */\r\n children: React.ReactNode\r\n /** 是否显示图标 */\r\n showIcon?: boolean\r\n /** 是否可关闭 */\r\n closable?: boolean\r\n /** 关闭回调 */\r\n onClose?: () => void\r\n /** 操作区域 */\r\n action?: React.ReactNode\r\n /** 变体样式 */\r\n variant?: 'soft' | 'solid' | 'outline'\r\n /** 自定义类名 */\r\n className?: string\r\n}\r\n\r\nexport default function Alert({\r\n type = 'info',\r\n title,\r\n children,\r\n showIcon = true,\r\n closable = false,\r\n onClose,\r\n action,\r\n variant = 'soft',\r\n className,\r\n}: AlertProps) {\r\n const [visible, setVisible] = useState(true)\r\n\r\n if (!visible) return null\r\n\r\n const handleClose = () => {\r\n setVisible(false)\r\n onClose?.()\r\n }\r\n\r\n const typeConfig = {\r\n info: {\r\n soft: 'bg-blue-50 text-blue-800 border-blue-200',\r\n solid: 'bg-blue-600 text-white',\r\n outline: 'bg-transparent border-blue-500 text-blue-700',\r\n iconColor: variant === 'solid' ? 'text-white' : 'text-blue-500',\r\n },\r\n success: {\r\n soft: 'bg-emerald-50 text-emerald-800 border-emerald-200',\r\n solid: 'bg-emerald-600 text-white',\r\n outline: 'bg-transparent border-emerald-500 text-emerald-700',\r\n iconColor: variant === 'solid' ? 'text-white' : 'text-emerald-500',\r\n },\r\n warning: {\r\n soft: 'bg-amber-50 text-amber-800 border-amber-200',\r\n solid: 'bg-amber-500 text-white',\r\n outline: 'bg-transparent border-amber-500 text-amber-700',\r\n iconColor: variant === 'solid' ? 'text-white' : 'text-amber-500',\r\n },\r\n error: {\r\n soft: 'bg-rose-50 text-rose-800 border-rose-200',\r\n solid: 'bg-rose-600 text-white',\r\n outline: 'bg-transparent border-rose-500 text-rose-700',\r\n iconColor: variant === 'solid' ? 'text-white' : 'text-rose-500',\r\n },\r\n }\r\n\r\n const icons = {\r\n info: (\r\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\r\n </svg>\r\n ),\r\n success: (\r\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\r\n </svg>\r\n ),\r\n warning: (\r\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\r\n </svg>\r\n ),\r\n error: (\r\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z\" />\r\n </svg>\r\n ),\r\n }\r\n\r\n const config = typeConfig[type]\r\n\r\n return (\r\n <div\r\n role=\"alert\"\r\n className={cn(\r\n 'flex items-start gap-3 p-4 rounded-xl border',\r\n config[variant],\r\n className\r\n )}\r\n >\r\n {showIcon && (\r\n <span className={cn('flex-shrink-0', config.iconColor)}>\r\n {icons[type]}\r\n </span>\r\n )}\r\n\r\n <div className=\"flex-1 min-w-0\">\r\n {title && (\r\n <h4 className=\"font-semibold mb-1\">{title}</h4>\r\n )}\r\n <div className={cn('text-sm', title && 'opacity-90')}>\r\n {children}\r\n </div>\r\n {action && <div className=\"mt-3\">{action}</div>}\r\n </div>\r\n\r\n {closable && (\r\n <button\r\n onClick={handleClose}\r\n className={cn(\r\n 'flex-shrink-0 p-1 rounded-lg transition-colors',\r\n variant === 'solid'\r\n ? 'hover:bg-white/20'\r\n : 'hover:bg-black/5'\r\n )}\r\n >\r\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\n","// ============================================\r\n// Progress 进度条组件\r\n// ============================================\r\n\r\nimport { cn } from '../utils/cn'\r\n\r\nexport interface ProgressProps {\r\n /** 当前进度 0-100 */\r\n value: number\r\n /** 最大值 */\r\n max?: number\r\n /** 尺寸 */\r\n size?: 'xs' | 'sm' | 'md' | 'lg'\r\n /** 颜色 */\r\n color?: 'violet' | 'cyan' | 'emerald' | 'rose' | 'amber' | 'gradient'\r\n /** 变体 */\r\n variant?: 'default' | 'striped' | 'animated'\r\n /** 是否显示标签 */\r\n showLabel?: boolean\r\n /** 自定义标签 */\r\n label?: string | ((value: number, max: number) => string)\r\n /** 标签位置 */\r\n labelPosition?: 'inside' | 'outside' | 'top'\r\n /** 是否为圆形进度 */\r\n circular?: boolean\r\n /** 圆形进度尺寸 */\r\n circleSize?: number\r\n /** 自定义类名 */\r\n className?: string\r\n}\r\n\r\nexport default function Progress({\r\n value,\r\n max = 100,\r\n size = 'md',\r\n color = 'violet',\r\n variant = 'default',\r\n showLabel = false,\r\n label,\r\n labelPosition = 'outside',\r\n circular = false,\r\n circleSize = 120,\r\n className,\r\n}: ProgressProps) {\r\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100)\r\n\r\n const getLabel = () => {\r\n if (typeof label === 'function') return label(value, max)\r\n if (label) return label\r\n return `${Math.round(percentage)}%`\r\n }\r\n\r\n const sizeStyles = {\r\n xs: 'h-1',\r\n sm: 'h-2',\r\n md: 'h-3',\r\n lg: 'h-4',\r\n }\r\n\r\n const colorStyles = {\r\n violet: 'bg-violet-600',\r\n cyan: 'bg-cyan-500',\r\n emerald: 'bg-emerald-500',\r\n rose: 'bg-rose-500',\r\n amber: 'bg-amber-500',\r\n gradient: 'bg-gradient-to-r from-violet-600 via-fuchsia-500 to-pink-500',\r\n }\r\n\r\n const stripedClass = cn(\r\n 'bg-[length:1rem_1rem]',\r\n 'bg-gradient-to-r',\r\n 'from-white/20 via-transparent via-50% to-transparent to-50%'\r\n )\r\n\r\n // 圆形进度条\r\n if (circular) {\r\n const strokeWidth = size === 'xs' ? 4 : size === 'sm' ? 6 : size === 'md' ? 8 : 10\r\n const radius = (circleSize - strokeWidth) / 2\r\n const circumference = radius * 2 * Math.PI\r\n const offset = circumference - (percentage / 100) * circumference\r\n\r\n const gradientColors = {\r\n violet: ['#8b5cf6', '#7c3aed'],\r\n cyan: ['#06b6d4', '#0891b2'],\r\n emerald: ['#10b981', '#059669'],\r\n rose: ['#f43f5e', '#e11d48'],\r\n amber: ['#f59e0b', '#d97706'],\r\n gradient: ['#8b5cf6', '#ec4899'],\r\n }\r\n\r\n return (\r\n <div\r\n className={cn('relative inline-flex items-center justify-center', className)}\r\n style={{ width: circleSize, height: circleSize }}\r\n >\r\n <svg className=\"transform -rotate-90\" width={circleSize} height={circleSize}>\r\n <defs>\r\n <linearGradient id={`progress-gradient-${color}`} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\r\n <stop offset=\"0%\" stopColor={gradientColors[color][0]} />\r\n <stop offset=\"100%\" stopColor={gradientColors[color][1]} />\r\n </linearGradient>\r\n </defs>\r\n {/* 背景圆 */}\r\n <circle\r\n className=\"text-gray-200\"\r\n strokeWidth={strokeWidth}\r\n stroke=\"currentColor\"\r\n fill=\"transparent\"\r\n r={radius}\r\n cx={circleSize / 2}\r\n cy={circleSize / 2}\r\n />\r\n {/* 进度圆 */}\r\n <circle\r\n className=\"transition-all duration-500 ease-out\"\r\n strokeWidth={strokeWidth}\r\n strokeDasharray={circumference}\r\n strokeDashoffset={offset}\r\n strokeLinecap=\"round\"\r\n stroke={`url(#progress-gradient-${color})`}\r\n fill=\"transparent\"\r\n r={radius}\r\n cx={circleSize / 2}\r\n cy={circleSize / 2}\r\n />\r\n </svg>\r\n {showLabel && (\r\n <span className=\"absolute text-lg font-semibold text-gray-700\">\r\n {getLabel()}\r\n </span>\r\n )}\r\n </div>\r\n )\r\n }\r\n\r\n // 线性进度条\r\n return (\r\n <div className={cn('w-full', className)}>\r\n {showLabel && labelPosition === 'top' && (\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <span className=\"text-sm font-medium text-gray-700\">{getLabel()}</span>\r\n </div>\r\n )}\r\n\r\n <div className=\"flex items-center gap-3\">\r\n <div\r\n className={cn(\r\n 'flex-1 w-full bg-gray-200 rounded-full overflow-hidden',\r\n sizeStyles[size]\r\n )}\r\n >\r\n <div\r\n className={cn(\r\n 'h-full rounded-full transition-all duration-500 ease-out',\r\n colorStyles[color],\r\n variant === 'striped' && stripedClass,\r\n variant === 'animated' && 'animate-pulse',\r\n showLabel && labelPosition === 'inside' && 'flex items-center justify-end'\r\n )}\r\n style={{ width: `${percentage}%` }}\r\n >\r\n {showLabel && labelPosition === 'inside' && size !== 'xs' && size !== 'sm' && (\r\n <span className=\"text-xs font-medium text-white px-2 truncate\">\r\n {getLabel()}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {showLabel && labelPosition === 'outside' && (\r\n <span className=\"text-sm font-medium text-gray-700 min-w-[3rem] text-right\">\r\n {getLabel()}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n","// ============================================\r\n// 💀 Skeleton 骨架屏组件\r\n// ============================================\r\n\r\nimport React from 'react'\r\nimport { cn } from '../utils/cn'\r\n\r\nexport interface SkeletonProps {\r\n /** 变体类型 */\r\n variant?: 'text' | 'circular' | 'rectangular' | 'rounded'\r\n /** 宽度 */\r\n width?: string | number\r\n /** 高度 */\r\n height?: string | number\r\n /** 是否有动画 */\r\n animation?: 'pulse' | 'wave' | 'none'\r\n /** 行数(仅 text 变体) */\r\n lines?: number\r\n /** 自定义类名 */\r\n className?: string\r\n}\r\n\r\nexport default function Skeleton({\r\n variant = 'text',\r\n width,\r\n height,\r\n animation = 'pulse',\r\n lines = 1,\r\n className,\r\n}: SkeletonProps) {\r\n const baseStyles = cn(\r\n 'bg-gray-200',\r\n animation === 'pulse' && 'animate-pulse',\r\n animation === 'wave' && 'relative overflow-hidden after:absolute after:inset-0 after:-translate-x-full after:bg-gradient-to-r after:from-transparent after:via-white/60 after:to-transparent after:animate-shimmer'\r\n )\r\n\r\n const variantStyles = {\r\n text: 'rounded h-4',\r\n circular: 'rounded-full',\r\n rectangular: '',\r\n rounded: 'rounded-lg',\r\n }\r\n\r\n const getStyle = () => {\r\n const style: React.CSSProperties = {}\r\n if (width) style.width = typeof width === 'number' ? `${width}px` : width\r\n if (height) style.height = typeof height === 'number' ? `${height}px` : height\r\n \r\n if (variant === 'circular' && !height) {\r\n style.height = style.width\r\n }\r\n \r\n return style\r\n }\r\n\r\n // 多行文本\r\n if (variant === 'text' && lines > 1) {\r\n return (\r\n <div className={cn('space-y-2', className)}>\r\n {Array.from({ length: lines }).map((_, i) => (\r\n <div\r\n key={i}\r\n className={cn(baseStyles, variantStyles.text)}\r\n style={{\r\n ...getStyle(),\r\n width: i === lines - 1 ? '75%' : width || '100%',\r\n }}\r\n />\r\n ))}\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div\r\n className={cn(baseStyles, variantStyles[variant], className)}\r\n style={getStyle()}\r\n />\r\n )\r\n}\r\n\r\n// 预设骨架屏组合\r\nexport function SkeletonCard({ className }: { className?: string }) {\r\n return (\r\n <div className={cn('p-4 space-y-4', className)}>\r\n <Skeleton variant=\"rectangular\" height={200} className=\"rounded-xl\" />\r\n <Skeleton variant=\"text\" width=\"60%\" />\r\n <Skeleton variant=\"text\" lines={3} />\r\n <div className=\"flex gap-2\">\r\n <Skeleton variant=\"circular\" width={40} height={40} />\r\n <div className=\"flex-1 space-y-2\">\r\n <Skeleton variant=\"text\" width=\"40%\" />\r\n <Skeleton variant=\"text\" width=\"60%\" />\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport function SkeletonAvatar({ size = 48 }: { size?: number }) {\r\n return <Skeleton variant=\"circular\" width={size} height={size} />\r\n}\r\n\r\nexport function SkeletonButton({ width = 100, height = 40 }: { width?: number; height?: number }) {\r\n return <Skeleton variant=\"rounded\" width={width} height={height} />\r\n}\r\n\r\nexport function SkeletonTable({ rows = 5, cols = 4 }: { rows?: number; cols?: number }) {\r\n return (\r\n <div className=\"space-y-3\">\r\n {/* 表头 */}\r\n <div className=\"flex gap-4 pb-2 border-b border-gray-200\">\r\n {Array.from({ length: cols }).map((_, i) => (\r\n <Skeleton key={i} variant=\"text\" className=\"flex-1\" />\r\n ))}\r\n </div>\r\n {/* 表格行 */}\r\n {Array.from({ length: rows }).map((_, i) => (\r\n <div key={i} className=\"flex gap-4\">\r\n {Array.from({ length: cols }).map((_, j) => (\r\n <Skeleton key={j} variant=\"text\" className=\"flex-1\" />\r\n ))}\r\n </div>\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\n","// ============================================\n// 🌀 Spinner 加载组件\n// ============================================\n\nimport { cn } from '../utils/cn'\n\nexport interface SpinnerProps {\n /** 尺寸 */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** 颜色 */\n color?: 'violet' | 'cyan' | 'emerald' | 'rose' | 'white' | 'gray'\n /** 厚度 */\n thickness?: number\n /** 速度 */\n speed?: 'slow' | 'normal' | 'fast'\n /** 变体 */\n variant?: 'spinner' | 'dots' | 'bars' | 'ring'\n /** 标签文本 */\n label?: string\n /** 自定义类名 */\n className?: string\n}\n\nexport default function Spinner({\n size = 'md',\n color = 'violet',\n thickness = 3,\n speed = 'normal',\n variant = 'spinner',\n label,\n className,\n}: SpinnerProps) {\n const sizeMap = {\n xs: 16,\n sm: 20,\n md: 24,\n lg: 32,\n xl: 48,\n }\n\n const colorStyles = {\n violet: 'text-violet-600',\n cyan: 'text-cyan-500',\n emerald: 'text-emerald-500',\n rose: 'text-rose-500',\n white: 'text-white',\n gray: 'text-gray-400',\n }\n\n const speedStyles = {\n slow: 'animate-[spin_1.5s_linear_infinite]',\n normal: 'animate-[spin_1s_linear_infinite]',\n fast: 'animate-[spin_0.6s_linear_infinite]',\n }\n\n const sizePx = sizeMap[size]\n\n // 经典旋转器\n if (variant === 'spinner') {\n return (\n <div className={cn('inline-flex flex-col items-center gap-2', className)}>\n <svg\n className={cn(colorStyles[color], speedStyles[speed])}\n width={sizePx}\n height={sizePx}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth={thickness}\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n {label && <span className=\"text-sm text-gray-600\">{label}</span>}\n </div>\n )\n }\n\n // 圆环\n if (variant === 'ring') {\n const radius = (sizePx - thickness * 2) / 2\n const circumference = radius * 2 * Math.PI\n\n return (\n <div className={cn('inline-flex flex-col items-center gap-2', className)}>\n <svg\n className={cn(speedStyles[speed])}\n width={sizePx}\n height={sizePx}\n viewBox={`0 0 ${sizePx} ${sizePx}`}\n >\n <circle\n className=\"text-gray-200\"\n cx={sizePx / 2}\n cy={sizePx / 2}\n r={radius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={thickness}\n />\n <circle\n className={colorStyles[color]}\n cx={sizePx / 2}\n cy={sizePx / 2}\n r={radius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={thickness}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={circumference * 0.75}\n />\n </svg>\n {label && <span className=\"text-sm text-gray-600\">{label}</span>}\n </div>\n )\n }\n\n // 跳动的点\n if (variant === 'dots') {\n const dotSize = sizePx / 4\n\n return (\n <div className={cn('inline-flex flex-col items-center gap-2', className)}>\n <div className=\"flex items-center gap-1\" style={{ height: sizePx }}>\n {[0, 1, 2].map((i) => (\n <div\n key={i}\n className={cn(\n 'rounded-full',\n colorStyles[color].replace('text-', 'bg-'),\n 'animate-bounce'\n )}\n style={{\n width: dotSize,\n height: dotSize,\n animationDelay: `${i * 0.15}s`,\n animationDuration: speed === 'slow' ? '1s' : speed === 'fast' ? '0.5s' : '0.7s',\n }}\n />\n ))}\n </div>\n {label && <span className=\"text-sm text-gray-600\">{label}</span>}\n </div>\n )\n }\n\n // 跳动的条\n if (variant === 'bars') {\n const barWidth = sizePx / 6\n const barHeight = sizePx\n\n return (\n <div className={cn('inline-flex flex-col items-center gap-2', className)}>\n <div className=\"flex items-end gap-0.5\" style={{ height: sizePx }}>\n {[0, 1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className={cn(\n 'rounded-sm',\n colorStyles[color].replace('text-', 'bg-')\n )}\n style={{\n width: barWidth,\n height: barHeight,\n animation: `bars ${speed === 'slow' ? '1.2s' : speed === 'fast' ? '0.6s' : '0.9s'} ease-in-out infinite`,\n animationDelay: `${i * 0.1}s`,\n }}\n />\n ))}\n </div>\n {label && <span className=\"text-sm text-gray-600\">{label}</span>}\n </div>\n )\n }\n\n return null\n}\n\n","// ============================================\r\n// 📦 Container 容器组件 (Flex 布局)\r\n// ============================================\r\n\r\nimport React, { forwardRef } from 'react'\r\nimport { cn } from '../utils/cn'\r\n\r\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /** 子元素 */\r\n children?: React.ReactNode\r\n /** Flex 方向 */\r\n direction?: 'row' | 'column'\r\n /** 主轴对齐 */\r\n justify?: 'start' | 'end' | 'center' | 'between' | 'around' | 'evenly'\r\n /** 交叉轴对齐 */\r\n align?: 'start' | 'end' | 'center' | 'stretch'\r\n /** 间距 */\r\n gap?: number | 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl'\r\n /** 是否换行 */\r\n wrap?: boolean\r\n /** 内边距 */\r\n padding?: 'none' | 'xs' | 'sm' | 'md' | 'lg' | 'xl'\r\n /** 背景色 */\r\n bg?: string\r\n /** 是否居中内容 */\r\n center?: boolean\r\n /** 最小高度 */\r\n minHeight?: string | number\r\n}\r\n\r\nconst Container = forwardRef<HTMLDivElement, ContainerProps>(\r\n (\r\n {\r\n children,\r\n direction = 'row',\r\n justify = 'start',\r\n align = 'start',\r\n gap = 'md',\r\n wrap = false,\r\n padding = 'md',\r\n bg = '',\r\n center = false,\r\n minHeight,\r\n className,\r\n style,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const gapStyles = {\r\n none: 'gap-0',\r\n xs: 'gap-1',\r\n sm: 'gap-2',\r\n md: 'gap-4',\r\n lg: 'gap-6',\r\n xl: 'gap-8',\r\n }\r\n\r\n const gapValue = typeof gap === 'number' ? gap : undefined\r\n const gapClass = typeof gap === 'string' ? gapStyles[gap] : ''\r\n\r\n const paddingStyles = {\r\n none: '',\r\n xs: 'p-2',\r\n sm: 'p-3',\r\n md: 'p-4',\r\n lg: 'p-6',\r\n xl: 'p-8',\r\n }\r\n\r\n const justifyStyles = {\r\n start: 'justify-start',\r\n end: 'justify-end',\r\n center: 'justify-center',\r\n between: 'justify-between',\r\n around: 'justify-around',\r\n evenly: 'justify-evenly',\r\n }\r\n\r\n const alignStyles = {\r\n start: 'items-start',\r\n end: 'items-end',\r\n center: 'items-center',\r\n stretch: 'items-stretch',\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n 'flex',\r\n direction === 'column' ? 'flex-col' : 'flex-row',\r\n wrap && 'flex-wrap',\r\n gapClass,\r\n paddingStyles[padding],\r\n justifyStyles[justify],\r\n alignStyles[align],\r\n center && 'justify-center items-center',\r\n bg && `bg-${bg}`,\r\n className\r\n )}\r\n style={{\r\n ...(gapValue && { gap: `${gapValue}px` }),\r\n ...(minHeight && { minHeight: typeof minHeight === 'number' ? `${minHeight}px` : minHeight }),\r\n ...style,\r\n }}\r\n {...props}\r\n >\r\n {children || (\r\n <div className=\"w-full h-20 bg-gray-50 rounded border-2 border-dashed border-gray-300 flex items-center justify-center text-gray-400 text-sm\">\r\n 放置组件到这里(注意:设计器中默认内容仅供预览,实际使用时请传入 children)\r\n </div>\r\n )}\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nContainer.displayName = 'Container'\r\n\r\nexport default Container\r\n\r\n","// ============================================\r\n// ➖ Divider 分割线组件\r\n// ============================================\r\n\r\nimport React, { forwardRef } from 'react'\r\nimport { cn } from '../utils/cn'\r\n\r\nexport interface DividerProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /** 方向 */\r\n direction?: 'horizontal' | 'vertical'\r\n /** 样式变体 */\r\n variant?: 'solid' | 'dashed' | 'dotted'\r\n /** 颜色 */\r\n color?: 'default' | 'light' | 'dark' | 'violet'\r\n /** 文本位置 */\r\n textPosition?: 'left' | 'center' | 'right'\r\n /** 分割线粗细 */\r\n thickness?: 'thin' | 'medium' | 'thick'\r\n /** 子元素(文本) */\r\n children?: React.ReactNode\r\n}\r\n\r\nconst Divider = forwardRef<HTMLDivElement, DividerProps>(\r\n (\r\n {\r\n direction = 'horizontal',\r\n variant = 'solid',\r\n color = 'default',\r\n textPosition = 'center',\r\n thickness = 'thin',\r\n children,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const colorStyles = {\r\n default: 'border-gray-200',\r\n light: 'border-gray-100',\r\n dark: 'border-gray-400',\r\n violet: 'border-violet-200',\r\n }\r\n\r\n const variantStyles = {\r\n solid: 'border-solid',\r\n dashed: 'border-dashed',\r\n dotted: 'border-dotted',\r\n }\r\n\r\n const thicknessStyles = {\r\n thin: direction === 'horizontal' ? 'border-t' : 'border-l',\r\n medium: direction === 'horizontal' ? 'border-t-2' : 'border-l-2',\r\n thick: direction === 'horizontal' ? 'border-t-4' : 'border-l-4',\r\n }\r\n\r\n // 垂直分割线\r\n if (direction === 'vertical') {\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n 'inline-block h-full min-h-[1em]',\r\n thicknessStyles[thickness],\r\n variantStyles[variant],\r\n colorStyles[color],\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n }\r\n\r\n // 带文本的水平分割线\r\n if (children) {\r\n const textPositionStyles = {\r\n left: 'before:w-[5%] after:flex-1',\r\n center: 'before:flex-1 after:flex-1',\r\n right: 'before:flex-1 after:w-[5%]',\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n 'flex items-center w-full my-4',\r\n 'before:content-[\"\"] before:flex-grow before:border-t',\r\n 'after:content-[\"\"] after:flex-grow after:border-t',\r\n variantStyles[variant],\r\n colorStyles[color].replace('border-', 'before:border-').replace('border-', 'after:border-'),\r\n textPositionStyles[textPosition],\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span className=\"px-4 text-sm text-gray-500\">{children}</span>\r\n </div>\r\n )\r\n }\r\n\r\n // 普通水平分割线\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n 'w-full my-4',\r\n thicknessStyles[thickness],\r\n variantStyles[variant],\r\n colorStyles[color],\r\n className\r\n )}\r\n {...props}\r\n />\r\n )\r\n }\r\n)\r\n\r\nDivider.displayName = 'Divider'\r\n\r\nexport default Divider\r\n\r\n","// ============================================\r\n// 👤 Avatar 头像组件\r\n// ============================================\r\n\r\nimport React, { forwardRef, useState } from 'react'\r\nimport { cn } from '../utils/cn'\r\n\r\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /** 图片地址 */\r\n src?: string\r\n /** 替代文本 */\r\n alt?: string\r\n /** 显示的名字(用于生成首字母) */\r\n name?: string\r\n /** 尺寸 */\r\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | number\r\n /** 形状 */\r\n shape?: 'circle' | 'square' | 'rounded'\r\n /** 背景颜色(无图片时) */\r\n color?: 'violet' | 'cyan' | 'emerald' | 'rose' | 'amber' | 'gray' | 'auto'\r\n /** 是否显示边框 */\r\n bordered?: boolean\r\n /** 状态指示器 */\r\n status?: 'online' | 'offline' | 'busy' | 'away'\r\n /** 徽标 */\r\n badge?: React.ReactNode\r\n /** 图标(无图片时显示) */\r\n icon?: React.ReactNode\r\n}\r\n\r\n// 根据名字生成颜色\r\nfunction getColorFromName(name: string): string {\r\n const colors = ['violet', 'cyan', 'emerald', 'rose', 'amber']\r\n let hash = 0\r\n for (let i = 0; i < name.length; i++) {\r\n hash = name.charCodeAt(i) + ((hash << 5) - hash)\r\n }\r\n return colors[Math.abs(hash) % colors.length]\r\n}\r\n\r\n// 获取首字母\r\nfunction getInitials(name: string): string {\r\n const words = name.trim().split(/\\s+/)\r\n if (words.length >= 2) {\r\n return (words[0][0] + words[1][0]).toUpperCase()\r\n }\r\n return name.slice(0, 2)\r\n}\r\n\r\nconst Avatar = forwardRef<HTMLDivElement, AvatarProps>(\r\n (\r\n {\r\n src,\r\n alt,\r\n name,\r\n size = 'md',\r\n shape = 'circle',\r\n color = 'auto',\r\n bordered = false,\r\n status,\r\n badge,\r\n icon,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const [imgError, setImgError] = useState(false)\r\n\r\n const sizeMap = {\r\n xs: 24,\r\n sm: 32,\r\n md: 40,\r\n lg: 48,\r\n xl: 64,\r\n '2xl': 80,\r\n }\r\n\r\n const sizePx = typeof size === 'number' ? size : sizeMap[size]\r\n const fontSize = sizePx / 2.5\r\n\r\n const shapeStyles = {\r\n circle: 'rounded-full',\r\n square: 'rounded-none',\r\n rounded: 'rounded-lg',\r\n }\r\n\r\n const actualColor = color === 'auto' && name ? getColorFromName(name) : color === 'auto' ? 'gray' : color\r\n\r\n const colorStyles = {\r\n violet: 'bg-violet-100 text-violet-700',\r\n cyan: 'bg-cyan-100 text-cyan-700',\r\n emerald: 'bg-emerald-100 text-emerald-700',\r\n rose: 'bg-rose-100 text-rose-700',\r\n amber: 'bg-amber-100 text-amber-700',\r\n gray: 'bg-gray-100 text-gray-700',\r\n }\r\n\r\n const statusColors = {\r\n online: 'bg-emerald-500',\r\n offline: 'bg-gray-400',\r\n busy: 'bg-rose-500',\r\n away: 'bg-amber-500',\r\n }\r\n\r\n const showFallback = !src || imgError\r\n\r\n // 默认图标\r\n const DefaultIcon = () => (\r\n <svg\r\n className=\"w-1/2 h-1/2\"\r\n fill=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z\" />\r\n </svg>\r\n )\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn('relative inline-flex flex-shrink-0', className)}\r\n {...props}\r\n >\r\n <div\r\n className={cn(\r\n 'flex items-center justify-center overflow-hidden',\r\n shapeStyles[shape],\r\n showFallback && colorStyles[actualColor as keyof typeof colorStyles],\r\n bordered && 'ring-2 ring-white shadow-md',\r\n 'transition-transform duration-200 hover:scale-105'\r\n )}\r\n style={{ width: sizePx, height: sizePx }}\r\n >\r\n {!showFallback ? (\r\n <img\r\n src={src}\r\n alt={alt || name || 'avatar'}\r\n onError={() => setImgError(true)}\r\n className=\"w-full h-full object-cover\"\r\n />\r\n ) : icon ? (\r\n <span className=\"flex items-center justify-center w-full h-full\">\r\n {icon}\r\n </span>\r\n ) : name ? (\r\n <span\r\n className=\"font-semibold select-none\"\r\n style={{ fontSize }}\r\n >\r\n {getInitials(name)}\r\n </span>\r\n ) : (\r\n <DefaultIcon />\r\n )}\r\n </div>\r\n\r\n {/* 状态指示器 */}\r\n {status && (\r\n <span\r\n className={cn(\r\n 'absolute bottom-0 right-0 rounded-full ring-2 ring-white',\r\n statusColors[status]\r\n )}\r\n style={{\r\n width: sizePx / 4,\r\n height: sizePx / 4,\r\n }}\r\n />\r\n )}\r\n\r\n {/* 徽标 */}\r\n {badge && (\r\n <span className=\"absolute -top-1 -right-1\">\r\n {badge}\r\n </span>\r\n )}\r\n </div>\r\n )\r\n }\r\n)\r\n\r\nAvatar.displayName = 'Avatar'\r\n\r\n// Avatar Group 组件\r\nexport interface AvatarGroupProps {\r\n children: React.ReactNode\r\n max?: number\r\n size?: AvatarProps['size']\r\n spacing?: number\r\n}\r\n\r\nexport function AvatarGroup({ children, max, size = 'md', spacing = -8 }: AvatarGroupProps) {\r\n const childArray = React.Children.toArray(children)\r\n const visibleChildren = max ? childArray.slice(0, max) : childArray\r\n const remaining = max ? childArray.length - max : 0\r\n\r\n return (\r\n <div className=\"flex items-center\">\r\n {visibleChildren.map((child, index) => (\r\n <div\r\n key={index}\r\n className=\"relative\"\r\n style={{ marginLeft: index === 0 ? 0 : spacing }}\r\n >\r\n {React.isValidElement<AvatarProps>(child)\r\n ? React.cloneElement(child, { size, bordered: true })\r\n : child}\r\n </div>\r\n ))}\r\n {remaining > 0 && (\r\n <Avatar\r\n size={size}\r\n name={`+${remaining}`}\r\n color=\"gray\"\r\n bordered\r\n style={{ marginLeft: spacing }}\r\n />\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nexport default Avatar\r\n\r\n","// ============================================\r\n// 🏷️ Tag 标签组件\r\n// ============================================\r\n\r\nimport React, { forwardRef } from 'react'\r\nimport { cn } from '../utils/cn'\r\n\r\nexport interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {\r\n /** 内容 */\r\n children: React.ReactNode\r\n /** 颜色 */\r\n color?: 'violet' | 'cyan' | 'emerald' | 'rose' | 'amber' | 'gray' | 'blue' | 'pink'\r\n /** 变体 */\r\n variant?: 'solid' | 'soft' | 'outline'\r\n /** 尺寸 */\r\n size?: 'sm' | 'md' | 'lg'\r\n /** 是否可关闭 */\r\n closable?: boolean\r\n /** 关闭回调 */\r\n onClose?: () => void\r\n /** 左侧图标 */\r\n icon?: React.ReactNode\r\n /** 是否为圆角药丸形状 */\r\n rounded?: boolean\r\n}\r\n\r\nconst Tag = forwardRef<HTMLSpanElement, TagProps>(\r\n (\r\n {\r\n children,\r\n color = 'gray',\r\n variant = 'soft',\r\n size = 'md',\r\n closable = false,\r\n onClose,\r\n icon,\r\n rounded = false,\r\n className,\r\n ...props\r\n },\r\n ref\r\n ) => {\r\n const colorStyles = {\r\n solid: {\r\n violet: 'bg-violet-600 text-white',\r\n cyan: 'bg-cyan-500 text-white',\r\n emerald: 'bg-emerald-500 text-white',\r\n rose: 'bg-rose-500 text-white',\r\n amber: 'bg-amber-500 text-white',\r\n gray: 'bg-gray-600 text-white',\r\n blue: 'bg-blue-500 text-white',\r\n pink: 'bg-pink-500 text-white',\r\n },\r\n soft: {\r\n violet: 'bg-violet-100 text-violet-700 border border-violet-200',\r\n cyan: 'bg-cyan-100 text-cyan-700 border border-cyan-200',\r\n emerald: 'bg-emerald-100 text-emerald-700 border border-emerald-200',\r\n rose: 'bg-rose-100 text-rose-700 border border-rose-200',\r\n amber: 'bg-amber-100 text-amber-700 border border-amber-200',\r\n gray: 'bg-gray-100 text-gray-700 border border-gray-200',\r\n blue: 'bg-blue-100 text-blue-700 border border-blue-200',\r\n pink: 'bg-pink-100 text-pink-700 border border-pink-200',\r\n },\r\n outline: {\r\n violet: 'border-2 border-violet-500 text-violet-600 bg-transparent',\r\n cyan: 'border-2 border-cyan-500 text-cyan-600 bg-transparent',\r\n emerald: 'border-2 border-emerald-500 text-emerald-600 bg-transparent',\r\n rose: 'border-2 border-rose-500 text-rose-600 bg-transparent',\r\n amber: 'border-2 border-amber-500 text-amber-600 bg-transparent',\r\n gray: 'border-2 border-gray-500 text-gray-600 bg-transparent',\r\n blue: 'border-2 border-blue-500 text-blue-600 bg-transparent',\r\n pink: 'border-2 border-pink-500 text-pink-600 bg-transparent',\r\n },\r\n }\r\n\r\n const sizeStyles = {\r\n sm: 'px-2 py-0.5 text-xs gap-1',\r\n md: 'px-2.5 py-1 text-sm gap-1.5',\r\n lg: 'px-3 py-1.5 text-base gap-2',\r\n }\r\n\r\n const iconSizes = {\r\n sm: 'w-3 h-3',\r\n md: 'w-3.5 h-3.5',\r\n lg: 'w-4 h-4',\r\n }\r\n\r\n const handleClose = (e: React.MouseEvent) => {\r\n e.stopPropagation()\r\n onClose?.()\r\n }\r\n\r\n return (\r\n <span\r\n ref={ref}\r\n className={cn(\r\n 'inline-flex items-center font-medium transition-colors',\r\n rounded ? 'rounded-full' : 'rounded-md',\r\n sizeStyles[size],\r\n colorStyles[variant][color],\r\n className\r\n )}\r\n {...props}\r\n >\r\n {icon && (\r\n <span className={cn('flex-shrink-0', iconSizes[size])}>\r\n {icon}\r\n </span>\r\n )}\r\n <span>{children}</span>\r\n {closable && (\r\n <button\r\n type=\"button\"\r\n onClick={handleClose}\r\n className={cn(\r\n 'flex-shrink-0 ml-0.5 -mr-0.5 p-0.5 rounded-full',\r\n 'hover:bg-black/10 transition-colors',\r\n iconSizes[size]\r\n )}\r\n >\r\n <svg\r\n className=\"w-full h-full\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n d=\"M6 18L18 6M6 6l12 12\"\r\n />\r\n </svg>\r\n </button>\r\n )}\r\n </span>\r\n )\r\n }\r\n)\r\n\r\nTag.displayName = 'Tag'\r\n\r\nexport default Tag\r\n\r\n","// ============================================\r\n// 📑 Tabs 标签页组件\r\n// ============================================\r\n\r\nimport React, { createContext, useContext, useState, useRef, useEffect } from 'react'\r\nimport { cn } from '../utils/cn'\r\nimport { useControllableState } from '../hooks'\r\n\r\n// Context\r\ninterface TabsContextValue {\r\n activeTab: string\r\n setActiveTab: (value: string) => void\r\n variant: 'line' | 'enclosed' | 'pills' | 'soft'\r\n size: 'sm' | 'md' | 'lg'\r\n}\r\n\r\nconst TabsContext = createContext<TabsContextValue | null>(null)\r\n\r\n// Tabs Root\r\nexport interface TabsProps {\r\n /** 通过 items 数组快速声明标签列表 */\r\n items?: { label: string; key: string; children?: React.ReactNode; disabled?: boolean }[]\r\n /** 当前激活的标签 */\r\n value?: string\r\n /** 默认激活的标签 */\r\n defaultValue?: string\r\n /** 变体样式 */\r\n variant?: 'line' | 'enclosed' | 'pills' | 'soft'\r\n /** 尺寸 */\r\n size?: 'sm' | 'md' | 'lg'\r\n /** 值变化回调 */\r\n onChange?: (value: string) => void\r\n /** 自定义类名 */\r\n className?: string\r\n}\r\n\r\nexport function Tabs({\r\n items,\r\n value,\r\n defaultValue,\r\n variant = 'line',\r\n size = 'md',\r\n onChange,\r\n className,\r\n}: TabsProps) {\r\n // 如果传入 items 且没有 defaultValue,则默认选中 items[0].key\r\n const computedDefault = defaultValue ?? (items && items.length ? items[0].key : '')\r\n const [activeTab, setActiveTab] = useControllableState(value, computedDefault, onChange)\r\n console.log(computedDefault, 'computedDefault', activeTab);\r\n \r\n return (\r\n <TabsContext.Provider value={{ activeTab, setActiveTab, variant, size }}>\r\n <div className={cn('w-full', className)}>\r\n {items && items.length && (\r\n <>\r\n <TabList>\r\n {items.map((it) => (\r\n <Tab value={it.key} disabled={it.disabled} key={it.key}>\r\n {it.label}\r\n </Tab>\r\n ))}\r\n </TabList>\r\n {items.map((it) => (\r\n <TabPanel value={it.key} key={it.key + \"-panel\"}>\r\n {it.children}\r\n </TabPanel>\r\n ))}\r\n </>\r\n )}\r\n </div>\r\n </TabsContext.Provider>\r\n )\r\n}\r\n\r\n// TabList\r\nexport interface TabListProps {\r\n children?: React.ReactNode\r\n className?: string\r\n}\r\n\r\nexport function TabList({ children, className }: TabListProps) {\r\n const context = useContext(TabsContext)\r\n \r\n // 如果没有 context,返回一个空的 TabList\r\n if (!context) {\r\n return <div className={cn('flex border-b border-gray-200', className)}>{children}</div>\r\n }\r\n\r\n const { variant, activeTab } = context\r\n const listRef = useRef<HTMLDivElement>(null)\r\n const [indicatorStyle, setIndicatorStyle] = useState({ left: 0, width: 0 })\r\n\r\n useEffect(() => {\r\n if (listRef.current && variant === 'line') {\r\n const activeButton = listRef.current.querySelector('[data-state=\"active\"]') as HTMLElement\r\n if (activeButton) {\r\n setIndicatorStyle({\r\n left: activeButton.offsetLeft,\r\n width: activeButton.offsetWidth,\r\n })\r\n }\r\n }\r\n }, [variant, activeTab])\r\n\r\n const variantStyles = {\r\n line: 'border-b border-gray-200',\r\n enclosed: 'bg-gray-100 p-1 rounded-xl',\r\n pills: 'gap-2',\r\n soft: 'bg-gray-50 p-1 rounded-lg gap-1',\r\n }\r\n\r\n return (\r\n <div\r\n ref={listRef}\r\n role=\"tablist\"\r\n className={cn(\r\n 'relative flex items-center',\r\n variantStyles[variant],\r\n className\r\n )}\r\n >\r\n {children}\r\n {variant === 'line' && (\r\n <div\r\n className=\"absolute bottom-0 h-0.5 bg-violet-600 transition-all duration-300\"\r\n style={indicatorStyle}\r\n />\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\n// Tab\r\nexport interface TabProps {\r\n /** 标签值 */\r\n value: string\r\n /** 标签内容 */\r\n children?: React.ReactNode\r\n /** 是否禁用 */\r\n disabled?: boolean\r\n /** 图标 */\r\n icon?: React.ReactNode\r\n /** 自定义类名 */\r\n className?: string\r\n}\r\n\r\nexport function Tab({ value, children, disabled = false, icon, className }: TabProps) {\r\n const context = useContext(TabsContext)\r\n \r\n // 如果没有 context,返回一个基本的按钮\r\n if (!context) {\r\n return (\r\n <button\r\n className={cn(\r\n 'px-4 py-2 text-sm inline-flex items-center gap-2',\r\n 'text-gray-500 hover:text-gray-700',\r\n 'transition-colors duration-200',\r\n disabled && 'opacity-50 cursor-not-allowed',\r\n className\r\n )}\r\n disabled={disabled}\r\n >\r\n {icon && <span className=\"flex-shrink-0\">{icon}</span>}\r\n {children || `Tab: ${value}`}\r\n </button>\r\n )\r\n }\r\n\r\n const { activeTab, setActiveTab, variant, size } = context\r\n const isActive = activeTab === value\r\n\r\n const sizeStyles = {\r\n sm: 'px-3 py-1.5 text-sm',\r\n md: 'px-4 py-2 text-sm',\r\n lg: 'px-5 py-2.5 text-base',\r\n }\r\n\r\n const variantStyles = {\r\n line: cn(\r\n 'relative pb-3 -mb-px',\r\n isActive\r\n ? 'text-violet-600 font-semibold'\r\n : 'text-gray-500 hover:text-gray-700'\r\n ),\r\n enclosed: cn(\r\n 'rounded-lg',\r\n isActive\r\n ? 'bg-white text-gray-900 shadow-sm font-semibold'\r\n : 'text-gray-500 hover:text-gray-700'\r\n ),\r\n pills: cn(\r\n 'rounded-full',\r\n isActive\r\n ? 'bg-violet-600 text-white font-semibold'\r\n : 'text-gray-500 hover:bg-gray-100'\r\n ),\r\n soft: cn(\r\n 'rounded-md',\r\n isActive\r\n ? 'bg-white text-violet-600 shadow-sm font-semibold'\r\n : 'text-gray-500 hover:text-gray-700'\r\n ),\r\n }\r\n\r\n return (\r\n <button\r\n role=\"tab\"\r\n aria-selected={isActive}\r\n data-state={isActive ? 'active' : 'inactive'}\r\n disabled={disabled}\r\n onClick={() => !disabled && setActiveTab(value)}\r\n className={cn(\r\n 'inline-flex items-center gap-2 transition-all duration-200',\r\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-violet-500/50',\r\n sizeStyles[size],\r\n variantStyles[variant],\r\n disabled && 'opacity-50 cursor-not-allowed',\r\n className\r\n )}\r\n >\r\n {icon && <span className=\"flex-shrink-0\">{icon}</span>}\r\n {children}\r\n </button>\r\n )\r\n}\r\n\r\n// TabPanel\r\nexport interface TabPanelProps {\r\n /** 对应的标签值 */\r\n value: string\r\n /** 面板内容 */\r\n children?: React.ReactNode\r\n /** 自定义类名 */\r\n className?: string\r\n}\r\n\r\nexport function TabPanel({ value, children, className }: TabPanelProps) {\r\n const context = useContext(TabsContext)\r\n \r\n // 如果没有 context 或者不是活跃标签,显示一个占位符\r\n if (!context) {\r\n return (\r\n <div\r\n className={cn(\r\n 'mt-4 p-4 bg-gray-50 border border-gray-200 rounded',\r\n 'text-gray-600 text-center',\r\n className\r\n )}\r\n >\r\n {children || `面板内容 (${value})`}\r\n </div>\r\n )\r\n }\r\n\r\n const { activeTab } = context\r\n\r\n if (activeTab !== value) return null\r\n\r\n return (\r\n <div\r\n role=\"tabpanel\"\r\n className={cn(\r\n 'mt-4 focus:outline-none',\r\n 'animate-in fade-in duration-200',\r\n className\r\n )}\r\n >\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport default Tabs\r\n\r\n","// ============================================\r\n// 💬 Popover 气泡卡片组件\r\n// ============================================\r\n\r\nimport React, { useState, useRef, useEffect } from 'react'\r\nimport { createPortal } from 'react-dom'\r\nimport { cn } from '../utils/cn'\r\n\r\nexport interface PopoverProps {\r\n /** 触发元素 */\r\n children?: React.ReactElement\r\n /** 标题 */\r\n title?: React.ReactNode\r\n /** 内容 */\r\n content?: React.ReactNode\r\n /** 底部操作按钮 */\r\n footer?: React.ReactNode\r\n /** 位置 */\r\n placement?: 'top' | 'bottom' | 'left' | 'right' | 'top-start' | 'top-end' | 'bottom-start' | 'bottom-end'\r\n /** 触发方式 */\r\n trigger?: 'hover' | 'click' | 'focus'\r\n /** 是否可见(受控) */\r\n visible?: boolean\r\n /** 可见性变化回调 */\r\n onVisibleChange?: (visible: boolean) => void\r\n /** 延迟显示(毫秒) */\r\n delay?: number\r\n /** 是否禁用 */\r\n disabled?: boolean\r\n /** 背景色 */\r\n bgColor?: 'white' | 'dark' | 'violet'\r\n /** 是否显示箭头 */\r\n arrow?: boolean\r\n /** 偏移量 */\r\n offset?: number\r\n /** 最大宽度 */\r\n maxWidth?: number\r\n /** 最小宽度 */\r\n minWidth?: number\r\n /** 自定义 class */\r\n className?: string\r\n /** z-index */\r\n zIndex?: number\r\n /** 是否可关闭 */\r\n closable?: boolean\r\n}\r\n\r\nexport default function Popover({\r\n children,\r\n title,\r\n content = '弹出框内容',\r\n footer,\r\n placement = 'bottom',\r\n trigger = 'click',\r\n visible: controlledVisible,\r\n onVisibleChange,\r\n delay = 0,\r\n disabled = false,\r\n bgColor = 'white',\r\n arrow = true,\r\n offset = 12,\r\n maxWidth = 320,\r\n minWidth = 200,\r\n className,\r\n zIndex = 50,\r\n closable = false,\r\n}: PopoverProps) {\r\n // 在设计器预览模式下,强制显示\r\n const shouldShow = controlledVisible ?? false\r\n \r\n // 受控或非受控模式\r\n const [uncontrolledVisible, setUncontrolledVisible] = useState(shouldShow)\r\n const visible = controlledVisible ?? uncontrolledVisible\r\n \r\n const setVisible = (v: boolean) => {\r\n if (controlledVisible === undefined) {\r\n setUncontrolledVisible(v)\r\n }\r\n onVisibleChange?.(v)\r\n }\r\n\r\n const triggerRef = useRef<HTMLElement>(null)\r\n const popoverRef = useRef<HTMLDivElement>(null)\r\n const timeoutRef = useRef<number>()\r\n\r\n const show = () => {\r\n if (disabled) return\r\n if (delay > 0) {\r\n timeoutRef.current = setTimeout(() => setVisible(true), delay)\r\n } else {\r\n setVisible(true)\r\n }\r\n }\r\n\r\n const hide = () => {\r\n if (timeoutRef.current) {\r\n clearTimeout(timeoutRef.current)\r\n }\r\n setVisible(false)\r\n }\r\n\r\n const handleClose = () => hide()\r\n\r\n // 计算位置\r\n const [position, setPosition] = useState({ top: 0, left: 0 })\r\n\r\n useEffect(() => {\r\n if (visible && triggerRef.current && popoverRef.current) {\r\n const triggerRect = triggerRef.current.getBoundingClientRect()\r\n const popoverRect = popoverRef.current.getBoundingClientRect()\r\n\r\n let top = 0\r\n let left = 0\r\n\r\n switch (placement) {\r\n case 'top':\r\n top = triggerRect.top - popoverRect.height - offset\r\n left = triggerRect.left + (triggerRect.width - popoverRect.width) / 2\r\n break\r\n case 'top-start':\r\n top = triggerRect.top - popoverRect.height - offset\r\n left = triggerRect.left\r\n break\r\n case 'top-end':\r\n top = triggerRect.top - popoverRect.height - offset\r\n left = triggerRect.right - popoverRect.width\r\n break\r\n case 'bottom':\r\n top = triggerRect.bottom + offset\r\n left = triggerRect.left + (triggerRect.width - popoverRect.width) / 2\r\n break\r\n case 'bottom-start':\r\n top = triggerRect.bottom + offset\r\n left = triggerRect.left\r\n break\r\n case 'bottom-end':\r\n top = triggerRect.bottom + offset\r\n left = triggerRect.right - popoverRect.width\r\n break\r\n case 'left':\r\n top = triggerRect.top + (triggerRect.height - popoverRect.height) / 2\r\n left = triggerRect.left - popoverRect.width - offset\r\n break\r\n case 'right':\r\n top = triggerRect.top + (triggerRect.height - popoverRect.height) / 2\r\n left = triggerRect.right + offset\r\n break\r\n }\r\n\r\n // 边界检测及调整\r\n const padding = 8\r\n if (left < padding) left = padding\r\n if (left + popoverRect.width > window.innerWidth - padding) {\r\n left = window.innerWidth - popoverRect.width - padding\r\n }\r\n if (top < padding) top = padding\r\n if (top + popoverRect.height > window.innerHeight - padding) {\r\n top = window.innerHeight - popoverRect.height - padding\r\n }\r\n\r\n setPosition({ top, left })\r\n }\r\n }, [visible, placement, offset])\r\n\r\n // 样式\r\n const bgStyles = {\r\n white: 'bg-white border border-gray-200 shadow-lg',\r\n dark: 'bg-gray-900 text-white',\r\n violet: 'bg-violet-600 text-white',\r\n }\r\n\r\n const arrowStyles = {\r\n white: 'border-gray-200',\r\n dark: 'border-gray-900',\r\n violet: 'border-violet-600',\r\n }\r\n\r\n const arrowPosition = {\r\n top: 'bottom-0 left-1/2 -translate-x-1/2 translate-y-full border-t-2 border-x-2 border-b-0 border-x-transparent',\r\n 'top-start': 'bottom-0 left-4 translate-y-full border-t-2 border-x-2 border-b-0 border-x-transparent',\r\n 'top-end': 'bottom-0 right-4 translate-y-full border-t-2 border-x-2 border-b-0 border-x-transparent',\r\n bottom: 'top-0 left-1/2 -translate-x-1/2 -translate-y-full border-b-2 border-x-2 border-t-0 border-x-transparent',\r\n 'bottom-start': 'top-0 left-4 -translate-y-full border-b-2 border-x-2 border-t-0 border-x-transparent',\r\n 'bottom-end': 'top-0 right-4 -translate-y-full border-b-2 border-x-2 border-t-0 border-x-transparent',\r\n left: 'right-0 top-1/2 -translate-y-1/2 translate-x-full border-l-2 border-y-2 border-r-0 border-y-transparent',\r\n right: 'left-0 top-1/2 -translate-y-1/2 -translate-x-full border-r-2 border-y-2 border-l-0 border-y-transparent',\r\n }\r\n\r\n // 事件处理\r\n const triggerProps: Record<string, unknown> = {\r\n ref: triggerRef,\r\n }\r\n\r\n if (trigger === 'hover') {\r\n triggerProps.onMouseEnter = show\r\n triggerProps.onMouseLeave = hide\r\n } else if (trigger === 'click') {\r\n triggerProps.onClick = () => setVisible(!visible)\r\n } else if (trigger === 'focus') {\r\n triggerProps.onFocus = show\r\n triggerProps.onBlur = hide\r\n }\r\n\r\n // 处理 Popover 外部点击关闭\r\n useEffect(() => {\r\n if (!visible) return\r\n\r\n const handleClickOutside = (e: MouseEvent) => {\r\n if (\r\n triggerRef.current &&\r\n popoverRef.current &&\r\n !triggerRef.current.contains(e.target as Node) &&\r\n !popoverRef.current.contains(e.target as Node)\r\n ) {\r\n hide()\r\n }\r\n }\r\n\r\n if (trigger === 'click') {\r\n document.addEventListener('mousedown', handleClickOutside)\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside)\r\n }\r\n }\r\n }, [visible, trigger])\r\n\r\n // 如果没有children,使用默认按钮\r\n const defaultTrigger = (\r\n <button\r\n className={cn(\r\n 'px-4 py-2 text-sm font-medium',\r\n 'bg-violet-600 text-white rounded-lg',\r\n 'hover:bg-violet-700 transition-colors'\r\n )}\r\n >\r\n 点击打开\r\n </button>\r\n )\r\n\r\n const triggerElement = children || defaultTrigger\r\n const child = React.cloneElement(triggerElement as React.ReactElement, triggerProps)\r\n\r\n return (\r\n <>\r\n {child}\r\n {visible &&\r\n typeof document !== 'undefined' &&\r\n createPortal(\r\n <div\r\n ref={popoverRef}\r\n className={cn(\r\n 'fixed rounded-lg',\r\n bgStyles[bgColor],\r\n className\r\n )}\r\n style={{\r\n top: position.top,\r\n left: position.left,\r\n maxWidth: `${maxWidth}px`,\r\n minWidth: `${minWidth}px`,\r\n zIndex,\r\n }}\r\n >\r\n {/* 关闭按钮 */}\r\n {closable && (\r\n <button\r\n onClick={handleClose}\r\n className=\"absolute top-2 right-2 text-gray-400 hover:text-gray-600 focus:outline-none\"\r\n aria-label=\"关闭\"\r\n >\r\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n )}\r\n\r\n {/* 标题 */}\r\n {title && (\r\n <div className=\"px-4 py-3 border-b border-gray-100 font-semibold\">\r\n {title}\r\n </div>\r\n )}\r\n\r\n {/* 内容 */}\r\n <div className={cn('px-4', title ? 'py-3' : 'py-4')}>\r\n {content}\r\n </div>\r\n\r\n {/* 底部操作 */}\r\n {footer && (\r\n <div className=\"px-4 py-3 border-t border-gray-100 flex gap-2 justify-end\">\r\n {footer}\r\n </div>\r\n )}\r\n\r\n {/* 箭头 */}\r\n {arrow && (\r\n <div\r\n className={cn(\r\n 'absolute w-0 h-0',\r\n arrowPosition[placement as keyof typeof arrowPosition],\r\n `border-${arrowStyles[bgColor]}`\r\n )}\r\n style={{\r\n borderTopColor: bgColor === 'white' ? '#e5e7eb' : bgColor === 'dark' ? '#111827' : '#7c3aed',\r\n borderLeftColor: 'transparent',\r\n borderRightColor: 'transparent',\r\n borderBottomColor: 'transparent',\r\n }}\r\n />\r\n )}\r\n </div>,\r\n document.body\r\n )}\r\n </>\r\n )\r\n}\r\n","// ============================================\r\n// 🎨 Micro UI 主题系统\r\n// ============================================\r\n\r\nexport const colors = {\r\n // 主色调 - 极光紫\r\n primary: {\r\n 50: '#f5f3ff',\r\n 100: '#ede9fe',\r\n 200: '#ddd6fe',\r\n 300: '#c4b5fd',\r\n 400: '#a78bfa',\r\n 500: '#8b5cf6',\r\n 600: '#7c3aed',\r\n 700: '#6d28d9',\r\n 800: '#5b21b6',\r\n 900: '#4c1d95',\r\n },\r\n // 辅助色 - 青碧\r\n secondary: {\r\n 50: '#ecfeff',\r\n 100: '#cffafe',\r\n 200: '#a5f3fc',\r\n 300: '#67e8f9',\r\n 400: '#22d3ee',\r\n 500: '#06b6d4',\r\n 600: '#0891b2',\r\n 700: '#0e7490',\r\n 800: '#155e75',\r\n 900: '#164e63',\r\n },\r\n // 成功色 - 翠绿\r\n success: {\r\n 50: '#ecfdf5',\r\n 100: '#d1fae5',\r\n 200: '#a7f3d0',\r\n 300: '#6ee7b7',\r\n 400: '#34d399',\r\n 500: '#10b981',\r\n 600: '#059669',\r\n 700: '#047857',\r\n 800: '#065f46',\r\n 900: '#064e3b',\r\n },\r\n // 警告色 - 琥珀\r\n warning: {\r\n 50: '#fffbeb',\r\n 100: '#fef3c7',\r\n 200: '#fde68a',\r\n 300: '#fcd34d',\r\n 400: '#fbbf24',\r\n 500: '#f59e0b',\r\n 600: '#d97706',\r\n 700: '#b45309',\r\n 800: '#92400e',\r\n 900: '#78350f',\r\n },\r\n // 错误色 - 玫红\r\n error: {\r\n 50: '#fef2f2',\r\n 100: '#fee2e2',\r\n 200: '#fecaca',\r\n 300: '#fca5a5',\r\n 400: '#f87171',\r\n 500: '#ef4444',\r\n 600: '#dc2626',\r\n 700: '#b91c1c',\r\n 800: '#991b1b',\r\n 900: '#7f1d1d',\r\n },\r\n // 中性色\r\n gray: {\r\n 50: '#fafafa',\r\n 100: '#f4f4f5',\r\n 200: '#e4e4e7',\r\n 300: '#d4d4d8',\r\n 400: '#a1a1aa',\r\n 500: '#71717a',\r\n 600: '#52525b',\r\n 700: '#3f3f46',\r\n 800: '#27272a',\r\n 900: '#18181b',\r\n },\r\n}\r\n\r\nexport const spacing = {\r\n 0: '0',\r\n 1: '0.25rem',\r\n 2: '0.5rem',\r\n 3: '0.75rem',\r\n 4: '1rem',\r\n 5: '1.25rem',\r\n 6: '1.5rem',\r\n 8: '2rem',\r\n 10: '2.5rem',\r\n 12: '3rem',\r\n 16: '4rem',\r\n 20: '5rem',\r\n 24: '6rem',\r\n}\r\n\r\nexport const borderRadius = {\r\n none: '0',\r\n sm: '0.25rem',\r\n DEFAULT: '0.375rem',\r\n md: '0.5rem',\r\n lg: '0.75rem',\r\n xl: '1rem',\r\n '2xl': '1.5rem',\r\n '3xl': '2rem',\r\n full: '9999px',\r\n}\r\n\r\nexport const shadows = {\r\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\r\n DEFAULT: '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)',\r\n md: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)',\r\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)',\r\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)',\r\n '2xl': '0 25px 50px -12px rgb(0 0 0 / 0.25)',\r\n glow: '0 0 20px rgb(139 92 246 / 0.3)',\r\n 'glow-lg': '0 0 40px rgb(139 92 246 / 0.4)',\r\n}\r\n\r\nexport const typography = {\r\n fontFamily: {\r\n sans: '\"Inter\", \"Noto Sans SC\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\r\n mono: '\"JetBrains Mono\", \"Fira Code\", Consolas, monospace',\r\n },\r\n fontSize: {\r\n xs: ['0.75rem', { lineHeight: '1rem' }],\r\n sm: ['0.875rem', { lineHeight: '1.25rem' }],\r\n base: ['1rem', { lineHeight: '1.5rem' }],\r\n lg: ['1.125rem', { lineHeight: '1.75rem' }],\r\n xl: ['1.25rem', { lineHeight: '1.75rem' }],\r\n '2xl': ['1.5rem', { lineHeight: '2rem' }],\r\n '3xl': ['1.875rem', { lineHeight: '2.25rem' }],\r\n '4xl': ['2.25rem', { lineHeight: '2.5rem' }],\r\n },\r\n}\r\n\r\nexport const animations = {\r\n durations: {\r\n fast: '150ms',\r\n normal: '300ms',\r\n slow: '500ms',\r\n },\r\n easings: {\r\n default: 'cubic-bezier(0.4, 0, 0.2, 1)',\r\n in: 'cubic-bezier(0.4, 0, 1, 1)',\r\n out: 'cubic-bezier(0, 0, 0.2, 1)',\r\n bounce: 'cubic-bezier(0.68, -0.55, 0.265, 1.55)',\r\n },\r\n}\r\n\r\n// 组件变体类型\r\nexport type ColorVariant = 'primary' | 'secondary' | 'success' | 'warning' | 'error'\r\nexport type SizeVariant = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\r\n\r\n// 主题配置\r\nexport interface ThemeConfig {\r\n colors: typeof colors\r\n spacing: typeof spacing\r\n borderRadius: typeof borderRadius\r\n shadows: typeof shadows\r\n typography: typeof typography\r\n animations: typeof animations\r\n}\r\n\r\nexport const defaultTheme: ThemeConfig = {\r\n colors,\r\n spacing,\r\n borderRadius,\r\n shadows,\r\n typography,\r\n animations,\r\n}\r\n\r\n","// ============================================\r\n// 🎨 可视化设计器类型定义\r\n// ============================================\r\n\r\nexport type ComponentType =\r\n | 'Button'\r\n | 'Input'\r\n | 'Card'\r\n | 'Select'\r\n | 'Checkbox'\r\n | 'Switch'\r\n | 'Radio'\r\n | 'Textarea'\r\n | 'Avatar'\r\n | 'Tag'\r\n | 'Alert'\r\n | 'Progress'\r\n | 'Container'\r\n | 'Divider'\r\n | 'Dialog'\r\n | 'Skeleton'\r\n | 'Spinner'\r\n | 'Popover'\r\n | 'Tabs'\r\n | 'Text'\r\n | 'Image'\r\n\r\nexport interface ComponentProperty {\r\n name: string\r\n type: 'string' | 'number' | 'boolean' | 'select' | 'color' | 'icon'\r\n label: string\r\n defaultValue?: unknown\r\n options?: Array<{ label: string; value: string | number | boolean }>\r\n description?: string\r\n}\r\n\r\nexport interface ComponentDefinition {\r\n type: ComponentType\r\n name: string\r\n icon: string\r\n category: 'basic' | 'form' | 'layout' | 'feedback' | 'data'\r\n description: string\r\n properties: ComponentProperty[]\r\n defaultProps: Record<string, unknown>\r\n}\r\n\r\nexport interface DesignNode {\r\n id: string\r\n type: ComponentType\r\n props: Record<string, unknown>\r\n children?: DesignNode[]\r\n parentId?: string\r\n}\r\n\r\nexport interface DesignState {\r\n nodes: DesignNode[]\r\n selectedId: string | null\r\n hoveredId: string | null\r\n history: DesignNode[][]\r\n historyIndex: number\r\n}\r\n\r\nexport interface DesignerAction {\r\n type: 'ADD_NODE' | 'UPDATE_NODE' | 'DELETE_NODE' | 'SELECT_NODE' | 'MOVE_NODE' | 'UNDO' | 'REDO' | 'CLEAR'\r\n payload?: unknown\r\n}\r\n\r\n// 组件库定义\r\nexport const componentDefinitions: ComponentDefinition[] = [\r\n // 基础组件\r\n {\r\n type: 'Button',\r\n name: '按钮',\r\n icon: '',\r\n category: 'basic',\r\n description: '触发操作的按钮组件',\r\n properties: [\r\n { name: 'children', type: 'string', label: '文本内容', defaultValue: '按钮' },\r\n {\r\n name: 'variant',\r\n type: 'select',\r\n label: '变体',\r\n options: [\r\n { label: '主要', value: 'primary' },\r\n { label: '次要', value: 'secondary' },\r\n { label: '轮廓', value: 'outline' },\r\n { label: '幽灵', value: 'ghost' },\r\n { label: '危险', value: 'danger' },\r\n { label: '成功', value: 'success' },\r\n ],\r\n defaultValue: 'primary',\r\n },\r\n {\r\n name: 'size',\r\n type: 'select',\r\n label: '尺寸',\r\n options: [\r\n { label: '超小', value: 'xs' },\r\n { label: '小', value: 'sm' },\r\n { label: '中', value: 'md' },\r\n { label: '大', value: 'lg' },\r\n { label: '超大', value: 'xl' },\r\n ],\r\n defaultValue: 'md',\r\n },\r\n { name: 'fullWidth', type: 'boolean', label: '占满宽度', defaultValue: false },\r\n { name: 'loading', type: 'boolean', label: '加载中', defaultValue: false },\r\n { name: 'disabled', type: 'boolean', label: '禁用', defaultValue: false },\r\n { name: 'rounded', type: 'boolean', label: '圆形', defaultValue: false },\r\n ],\r\n defaultProps: { children: '按钮', variant: 'primary', size: 'md' },\r\n },\r\n {\r\n type: 'Input',\r\n name: '输入框',\r\n icon: '',\r\n category: 'form',\r\n description: '文本输入框组件',\r\n properties: [\r\n { name: 'label', type: 'string', label: '标签', defaultValue: '' },\r\n { name: 'placeholder', type: 'string', label: '占位符', defaultValue: '请输入...' },\r\n {\r\n name: 'variant',\r\n type: 'select',\r\n label: '变体',\r\n options: [\r\n { label: '默认', value: 'default' },\r\n { label: '填充', value: 'filled' },\r\n { label: '下划线', value: 'flushed' },\r\n ],\r\n defaultValue: 'default',\r\n },\r\n {\r\n name: 'size',\r\n type: 'select',\r\n label: '尺寸',\r\n options: [\r\n { label: '小', value: 'sm' },\r\n { label: '中', value: 'md' },\r\n { label: '大', value: 'lg' },\r\n ],\r\n defaultValue: 'md',\r\n },\r\n { name: 'disabled', type: 'boolean', label: '禁用', defaultValue: false },\r\n { name: 'required', type: 'boolean', label: '必填', defaultValue: false },\r\n { name: 'error', type: 'string', label: '错误信息', defaultValue: '' },\r\n { name: 'helper', type: 'string', label: '帮助文本', defaultValue: '' },\r\n ],\r\n defaultProps: { placeholder: '请输入...', variant: 'default', size: 'md' },\r\n },\r\n {\r\n type: 'Card',\r\n name: '卡片',\r\n icon: '',\r\n category: 'layout',\r\n description: '内容容器卡片',\r\n properties: [\r\n { name: 'title', type: 'string', label: '标题', defaultValue: '' },\r\n { name: 'subtitle', type: 'string', label: '副标题', defaultValue: '' },\r\n {\r\n name: 'variant',\r\n type: 'select',\r\n label: '变体',\r\n options: [\r\n { label: '阴影', value: 'elevated' },\r\n { label: '边框', value: 'outlined' },\r\n { label: '填充', value: 'filled' },\r\n { label: '毛玻璃', value: 'glass' },\r\n ],\r\n defaultValue: 'elevated',\r\n },\r\n { name: 'hoverable', type: 'boolean', label: '可悬浮', defaultValue: false },\r\n {\r\n name: 'padding',\r\n type: 'select',\r\n label: '内边距',\r\n options: [\r\n { label: '无', value: 'none' },\r\n { label: '小', value: 'sm' },\r\n { label: '中', value: 'md' },\r\n { label: '大', value: 'lg' },\r\n ],\r\n defaultValue: 'md',\r\n },\r\n ],\r\n defaultProps: { variant: 'elevated', padding: 'md' },\r\n },\r\n {\r\n type: 'Alert',\r\n name: '警告提示',\r\n icon: '',\r\n category: 'feedback',\r\n description: '警告提示信息',\r\n properties: [\r\n { name: 'children', type: 'string', label: '内容', defaultValue: '这是一条提示信息' },\r\n { name: 'title', type: 'string', label: '标题', defaultValue: '' },\r\n {\r\n name: 'type',\r\n type: 'select',\r\n label: '类型',\r\n options: [\r\n { label: '信息', value: 'info' },\r\n { label: '成功', value: 'success' },\r\n { label: '警告', value: 'warning' },\r\n { label: '错误', value: 'error' },\r\n ],\r\n defaultValue: 'info',\r\n },\r\n {\r\n name: 'variant',\r\n type: 'select',\r\n label: '变体',\r\n options: [\r\n { label: '柔和', value: 'soft' },\r\n { label: '实心', value: 'solid' },\r\n { label: '轮廓', value: 'outline' },\r\n ],\r\n defaultValue: 'soft',\r\n },\r\n { name: 'showIcon', type: 'boolean', label: '显示图标', defaultValue: true },\r\n { name: 'closable', type: 'boolean', label: '可关闭', defaultValue: false },\r\n ],\r\n defaultProps: { children: '这是一条提示信息', type: 'info', variant: 'soft', showIcon: true },\r\n },\r\n {\r\n type: 'Progress',\r\n name: '进度条',\r\n icon: '',\r\n category: 'feedback',\r\n description: '进度展示条',\r\n properties: [\r\n { name: 'value', type: 'number', label: '进度值', defaultValue: 50 },\r\n {\r\n name: 'size',\r\n type: 'select',\r\n label: '尺寸',\r\n options: [\r\n { label: '超小', value: 'xs' },\r\n { label: '小', value: 'sm' },\r\n { label: '中', value: 'md' },\r\n { label: '大', value: 'lg' },\r\n ],\r\n defaultValue: 'md',\r\n },\r\n {\r\n name: 'color',\r\n type: 'select',\r\n label: '颜色',\r\n options: [\r\n { label: '紫色', value: 'violet' },\r\n { label: '青色', value: 'cyan' },\r\n { label: '绿色', value: 'emerald' },\r\n { label: '红色', value: 'rose' },\r\n { label: '渐变', value: 'gradient' },\r\n ],\r\n defaultValue: 'violet',\r\n },\r\n { name: 'showLabel', type: 'boolean', label: '显示标签', defaultValue: true },\r\n { name: 'circular', type: 'boolean', label: '圆形', defaultValue: false },\r\n ],\r\n defaultProps: { value: 50, size: 'md', color: 'violet', showLabel: true },\r\n },\r\n {\r\n type: 'Tag',\r\n name: '标签',\r\n icon: '',\r\n category: 'data',\r\n description: '标签展示组件',\r\n properties: [\r\n { name: 'children', type: 'string', label: '文本', defaultValue: '标签' },\r\n {\r\n name: 'color',\r\n type: 'select',\r\n label: '颜色',\r\n options: [\r\n { label: '紫色', value: 'violet' },\r\n { label: '青色', value: 'cyan' },\r\n { label: '绿色', value: 'emerald' },\r\n { label: '红色', value: 'rose' },\r\n { label: '灰色', value: 'gray' },\r\n ],\r\n defaultValue: 'violet',\r\n },\r\n {\r\n name: 'variant',\r\n type: 'select',\r\n label: '变体',\r\n options: [\r\n { label: '实心', value: 'solid' },\r\n { label: '柔和', value: 'soft' },\r\n { label: '轮廓', value: 'outline' },\r\n ],\r\n defaultValue: 'soft',\r\n },\r\n {\r\n name: 'size',\r\n type: 'select',\r\n label: '尺寸',\r\n options: [\r\n { label: '小', value: 'sm' },\r\n { label: '中', value: 'md' },\r\n { label: '大', value: 'lg' },\r\n ],\r\n defaultValue: 'md',\r\n },\r\n { name: 'closable', type: 'boolean', label: '可关闭', defaultValue: false },\r\n { name: 'rounded', type: 'boolean', label: '药丸形状', defaultValue: false },\r\n ],\r\n defaultProps: { children: '标签', color: 'violet', variant: 'soft', size: 'md' },\r\n },\r\n {\r\n type: 'Avatar',\r\n name: '头像',\r\n icon: '',\r\n category: 'data',\r\n description: '用户头像组件',\r\n properties: [\r\n { name: 'name', type: 'string', label: '名字', defaultValue: 'User' },\r\n { name: 'src', type: 'string', label: '图片地址', defaultValue: '' },\r\n {\r\n name: 'size',\r\n type: 'select',\r\n label: '尺寸',\r\n options: [\r\n { label: '超小', value: 'xs' },\r\n { label: '小', value: 'sm' },\r\n { label: '中', value: 'md' },\r\n { label: '大', value: 'lg' },\r\n { label: '超大', value: 'xl' },\r\n ],\r\n defaultValue: 'md',\r\n },\r\n {\r\n name: 'shape',\r\n type: 'select',\r\n label: '形状',\r\n options: [\r\n { label: '圆形', value: 'circle' },\r\n { label: '方形', value: 'square' },\r\n { label: '圆角', value: 'rounded' },\r\n ],\r\n defaultValue: 'circle',\r\n },\r\n { name: 'bordered', type: 'boolean', label: '显示边框', defaultValue: false },\r\n {\r\n name: 'status',\r\n type: 'select',\r\n label: '状态',\r\n options: [\r\n { label: '无', value: '' },\r\n { label: '在线', value: 'online' },\r\n { label: '离线', value: 'offline' },\r\n { label: '忙碌', value: 'busy' },\r\n { label: '离开', value: 'away' },\r\n ],\r\n defaultValue: '',\r\n },\r\n ],\r\n defaultProps: { name: 'User', size: 'md', shape: 'circle' },\r\n },\r\n {\r\n type: 'Switch',\r\n name: '开关',\r\n icon: '',\r\n category: 'form',\r\n description: '开关切换组件',\r\n properties: [\r\n { name: 'label', type: 'string', label: '标签', defaultValue: '' },\r\n { name: 'checked', type: 'boolean', label: '选中', defaultValue: false },\r\n {\r\n name: 'size',\r\n type: 'select',\r\n label: '尺寸',\r\n options: [\r\n { label: '小', value: 'sm' },\r\n { label: '中', value: 'md' },\r\n { label: '大', value: 'lg' },\r\n ],\r\n defaultValue: 'md',\r\n },\r\n {\r\n name: 'color',\r\n type: 'select',\r\n label: '颜色',\r\n options: [\r\n { label: '紫色', value: 'violet' },\r\n { label: '青色', value: 'cyan' },\r\n { label: '绿色', value: 'emerald' },\r\n { label: '红色', value: 'rose' },\r\n ],\r\n defaultValue: 'violet',\r\n },\r\n { name: 'disabled', type: 'boolean', label: '禁用', defaultValue: false },\r\n { name: 'showIcons', type: 'boolean', label: '显示图标', defaultValue: false },\r\n ],\r\n defaultProps: { size: 'md', color: 'violet' },\r\n },\r\n {\r\n type: 'Checkbox',\r\n name: '复选框',\r\n icon: '',\r\n category: 'form',\r\n description: '复选框组件',\r\n properties: [\r\n { name: 'label', type: 'string', label: '标签', defaultValue: '选项' },\r\n { name: 'checked', type: 'boolean', label: '选中', defaultValue: false },\r\n {\r\n name: 'size',\r\n type: 'select',\r\n label: '尺寸',\r\n options: [\r\n { label: '小', value: 'sm' },\r\n { label: '中', value: 'md' },\r\n { label: '大', value: 'lg' },\r\n ],\r\n defaultValue: 'md',\r\n },\r\n {\r\n name: 'color',\r\n type: 'select',\r\n label: '颜色',\r\n options: [\r\n { label: '紫色', value: 'violet' },\r\n { label: '青色', value: 'cyan' },\r\n { label: '绿色', value: 'emerald' },\r\n { label: '红色', value: 'rose' },\r\n ],\r\n defaultValue: 'violet',\r\n },\r\n { name: 'disabled', type: 'boolean', label: '禁用', defaultValue: false },\r\n { name: 'indeterminate', type: 'boolean', label: '不确定状态', defaultValue: false },\r\n ],\r\n defaultProps: { label: '选项', size: 'md', color: 'violet' },\r\n },\r\n {\r\n type: 'Divider',\r\n name: '分割线',\r\n icon: '',\r\n category: 'layout',\r\n description: '分割内容的线条',\r\n properties: [\r\n { name: 'children', type: 'string', label: '文本', defaultValue: '' },\r\n {\r\n name: 'variant',\r\n type: 'select',\r\n label: '样式',\r\n options: [\r\n { label: '实线', value: 'solid' },\r\n { label: '虚线', value: 'dashed' },\r\n { label: '点线', value: 'dotted' },\r\n ],\r\n defaultValue: 'solid',\r\n },\r\n {\r\n name: 'color',\r\n type: 'select',\r\n label: '颜色',\r\n options: [\r\n { label: '默认', value: 'default' },\r\n { label: '浅色', value: 'light' },\r\n { label: '深色', value: 'dark' },\r\n { label: '紫色', value: 'violet' },\r\n ],\r\n defaultValue: 'default',\r\n },\r\n ],\r\n defaultProps: { variant: 'solid', color: 'default' },\r\n },\r\n {\r\n type: 'Select',\r\n name: '选择框',\r\n icon: '',\r\n category: 'form',\r\n description: '下拉选择框组件',\r\n properties: [\r\n { name: 'label', type: 'string', label: '标签', defaultValue: '' },\r\n { name: 'placeholder', type: 'string', label: '占位符', defaultValue: '请选择...' },\r\n {\r\n name: 'size',\r\n type: 'select',\r\n label: '尺寸',\r\n options: [\r\n { label: '小', value: 'sm' },\r\n { label: '中', value: 'md' },\r\n { label: '大', value: 'lg' },\r\n ],\r\n defaultValue: 'md',\r\n },\r\n { name: 'disabled', type: 'boolean', label: '禁用', defaultValue: false },\r\n { name: 'searchable', type: 'boolean', label: '可搜索', defaultValue: true },\r\n { name: 'clearable', type: 'boolean', label: '可清空', defaultValue: false },\r\n { name: 'multiple', type: 'boolean', label: '多选', defaultValue: false },\r\n ],\r\n defaultProps: { placeholder: '请选择...', size: 'md' },\r\n },\r\n {\r\n type: 'Textarea',\r\n name: '文本域',\r\n icon: '',\r\n category: 'form',\r\n description: '多行文本输入框',\r\n properties: [\r\n { name: 'label', type: 'string', label: '标签', defaultValue: '' },\r\n { name: 'placeholder', type: 'string', label: '占位符', defaultValue: '请输入...' },\r\n {\r\n name: 'size',\r\n type: 'select',\r\n label: '尺寸',\r\n options: [\r\n { label: '小', value: 'sm' },\r\n { label: '中', value: 'md' },\r\n { label: '大', value: 'lg' },\r\n ],\r\n defaultValue: 'md',\r\n },\r\n { name: 'rows', type: 'number', label: '行数', defaultValue: 4 },\r\n { name: 'maxLength', type: 'number', label: '最大长度', defaultValue: 500 },\r\n { name: 'disabled', type: 'boolean', label: '禁用', defaultValue: false },\r\n { name: 'showCounter', type: 'boolean', label: '显示计数', defaultValue: false },\r\n ],\r\n defaultProps: { placeholder: '请输入...', size: 'md', rows: 4 },\r\n },\r\n {\r\n type: 'Radio',\r\n name: '单选框',\r\n icon: '',\r\n category: 'form',\r\n description: '单选框组件',\r\n properties: [\r\n { name: 'label', type: 'string', label: '标签', defaultValue: '选项' },\r\n { name: 'checked', type: 'boolean', label: '选中', defaultValue: false },\r\n {\r\n name: 'size',\r\n type: 'select',\r\n label: '尺寸',\r\n options: [\r\n { label: '小', value: 'sm' },\r\n { label: '中', value: 'md' },\r\n { label: '大', value: 'lg' },\r\n ],\r\n defaultValue: 'md',\r\n },\r\n {\r\n name: 'color',\r\n type: 'select',\r\n label: '颜色',\r\n options: [\r\n { label: '紫色', value: 'violet' },\r\n { label: '青色', value: 'cyan' },\r\n { label: '绿色', value: 'emerald' },\r\n { label: '红色', value: 'rose' },\r\n ],\r\n defaultValue: 'violet',\r\n },\r\n { name: 'disabled', type: 'boolean', label: '禁用', defaultValue: false },\r\n ],\r\n defaultProps: { label: '选项', size: 'md', color: 'violet' },\r\n },\r\n {\r\n type: 'Skeleton',\r\n name: '骨架屏',\r\n icon: '',\r\n category: 'feedback',\r\n description: '加载占位骨架屏',\r\n properties: [\r\n {\r\n name: 'variant',\r\n type: 'select',\r\n label: '类型',\r\n options: [\r\n { label: '文本', value: 'text' },\r\n { label: '圆形', value: 'circle' },\r\n { label: '矩形', value: 'rectangle' },\r\n { label: '卡片', value: 'card' },\r\n { label: '头像', value: 'avatar' },\r\n ],\r\n defaultValue: 'text',\r\n },\r\n { name: 'count', type: 'number', label: '数量', defaultValue: 1 },\r\n { name: 'width', type: 'string', label: '宽度', defaultValue: 'w-full' },\r\n { name: 'height', type: 'string', label: '高度', defaultValue: 'h-4' },\r\n {\r\n name: 'animation',\r\n type: 'select',\r\n label: '动画',\r\n options: [\r\n { label: 'wave', value: 'wave' },\r\n { label: 'pulse', value: 'pulse' },\r\n { label: '无', value: 'none' },\r\n ],\r\n defaultValue: 'wave',\r\n },\r\n ],\r\n defaultProps: { variant: 'text', count: 1 },\r\n },\r\n {\r\n type: 'Spinner',\r\n name: '加载动画',\r\n icon: '',\r\n category: 'feedback',\r\n description: '加载中的动画',\r\n properties: [\r\n {\r\n name: 'size',\r\n type: 'select',\r\n label: '尺寸',\r\n options: [\r\n { label: '超小', value: 'xs' },\r\n { label: '小', value: 'sm' },\r\n { label: '中', value: 'md' },\r\n { label: '大', value: 'lg' },\r\n { label: '超大', value: 'xl' },\r\n ],\r\n defaultValue: 'md',\r\n },\r\n {\r\n name: 'color',\r\n type: 'select',\r\n label: '颜色',\r\n options: [\r\n { label: '紫色', value: 'violet' },\r\n { label: '青色', value: 'cyan' },\r\n { label: '绿色', value: 'emerald' },\r\n { label: '红色', value: 'rose' },\r\n { label: '白色', value: 'white' },\r\n ],\r\n defaultValue: 'violet',\r\n },\r\n { name: 'label', type: 'string', label: '标签', defaultValue: '加载中...' },\r\n ],\r\n defaultProps: { size: 'md', color: 'violet', label: '加载中...' },\r\n },\r\n {\r\n type: 'Container',\r\n name: '容器',\r\n icon: '',\r\n category: 'layout',\r\n description: 'Flex 弹性容器,用于布局其他组件',\r\n properties: [\r\n {\r\n name: 'direction',\r\n type: 'select',\r\n label: '排列方向',\r\n options: [\r\n { label: '水平', value: 'row' },\r\n { label: '竖直', value: 'column' },\r\n ],\r\n defaultValue: 'row',\r\n },\r\n {\r\n name: 'justify',\r\n type: 'select',\r\n label: '主轴对齐',\r\n options: [\r\n { label: '开始', value: 'start' },\r\n { label: '结束', value: 'end' },\r\n { label: '居中', value: 'center' },\r\n { label: '分散', value: 'between' },\r\n { label: '环绕', value: 'around' },\r\n { label: '均匀', value: 'evenly' },\r\n ],\r\n defaultValue: 'start',\r\n },\r\n {\r\n name: 'align',\r\n type: 'select',\r\n label: '交叉轴对齐',\r\n options: [\r\n { label: '开始', value: 'start' },\r\n { label: '结束', value: 'end' },\r\n { label: '居中', value: 'center' },\r\n { label: '拉伸', value: 'stretch' },\r\n ],\r\n defaultValue: 'start',\r\n },\r\n {\r\n name: 'gap',\r\n type: 'select',\r\n label: '间距',\r\n options: [\r\n { label: '无', value: 'none' },\r\n { label: '极小', value: 'xs' },\r\n { label: '小', value: 'sm' },\r\n { label: '中', value: 'md' },\r\n { label: '大', value: 'lg' },\r\n { label: '极大', value: 'xl' },\r\n ],\r\n defaultValue: 'md',\r\n },\r\n {\r\n name: 'padding',\r\n type: 'select',\r\n label: '内边距',\r\n options: [\r\n { label: '无', value: 'none' },\r\n { label: '极小', value: 'xs' },\r\n { label: '小', value: 'sm' },\r\n { label: '中', value: 'md' },\r\n { label: '大', value: 'lg' },\r\n { label: '极大', value: 'xl' },\r\n ],\r\n defaultValue: 'md',\r\n },\r\n { name: 'wrap', type: 'boolean', label: '是否换行', defaultValue: false },\r\n { name: 'center', type: 'boolean', label: '居中内容', defaultValue: false },\r\n ],\r\n defaultProps: { direction: 'row', justify: 'start', align: 'start', gap: 'md', padding: 'md', wrap: false, center: false },\r\n },\r\n {\r\n type: 'Tabs',\r\n name: '标签页',\r\n icon: '',\r\n category: 'data',\r\n description: '标签页切换组件',\r\n properties: [\r\n { name: 'defaultValue', type: 'string', label: '默认激活标签', defaultValue: '' },\r\n {\r\n name: 'variant',\r\n type: 'select',\r\n label: '变体',\r\n options: [\r\n { label: '线条', value: 'line' },\r\n { label: '框框', value: 'enclosed' },\r\n { label: '药丸', value: 'pills' },\r\n { label: '柔和', value: 'soft' },\r\n ],\r\n defaultValue: 'line',\r\n },\r\n {\r\n name: 'size',\r\n type: 'select',\r\n label: '尺寸',\r\n options: [\r\n { label: '小', value: 'sm' },\r\n { label: '中', value: 'md' },\r\n { label: '大', value: 'lg' },\r\n ],\r\n defaultValue: 'md',\r\n },\r\n ],\r\n defaultProps: { defaultValue: '', variant: 'line', size: 'md' },\r\n },\r\n {\r\n type: 'Popover',\r\n name: '气泡框',\r\n icon: '',\r\n category: 'data',\r\n description: '气泡卡片弹出框',\r\n properties: [\r\n { name: 'title', type: 'string', label: '标题', defaultValue: '' },\r\n { name: 'content', type: 'string', label: '内容', defaultValue: '内容' },\r\n {\r\n name: 'placement',\r\n type: 'select',\r\n label: '位置',\r\n options: [\r\n { label: '上', value: 'top' },\r\n { label: '下', value: 'bottom' },\r\n { label: '左', value: 'left' },\r\n { label: '右', value: 'right' },\r\n { label: '上左', value: 'top-start' },\r\n { label: '上右', value: 'top-end' },\r\n { label: '下左', value: 'bottom-start' },\r\n { label: '下右', value: 'bottom-end' },\r\n ],\r\n defaultValue: 'bottom',\r\n },\r\n {\r\n name: 'trigger',\r\n type: 'select',\r\n label: '触发方式',\r\n options: [\r\n { label: '悬停', value: 'hover' },\r\n { label: '点击', value: 'click' },\r\n { label: '聚焦', value: 'focus' },\r\n ],\r\n defaultValue: 'click',\r\n },\r\n {\r\n name: 'bgColor',\r\n type: 'select',\r\n label: '背景色',\r\n options: [\r\n { label: '白色', value: 'white' },\r\n { label: '深色', value: 'dark' },\r\n { label: '紫色', value: 'violet' },\r\n ],\r\n defaultValue: 'white',\r\n },\r\n { name: 'arrow', type: 'boolean', label: '显示箭头', defaultValue: true },\r\n { name: 'closable', type: 'boolean', label: '可关闭', defaultValue: false },\r\n { name: 'delay', type: 'number', label: '延迟(ms)', defaultValue: 0 },\r\n ],\r\n defaultProps: { content: '内容', placement: 'bottom', trigger: 'click', bgColor: 'white' },\r\n },\r\n {\r\n type: 'Dialog',\r\n name: '弹框',\r\n icon: '',\r\n category: 'feedback',\r\n description: '弹框对话框组件',\r\n properties: [\r\n { name: 'title', type: 'string', label: '标题', defaultValue: '提示' },\r\n { name: 'children', type: 'string', label: '内容', defaultValue: '这是弹框内容' },\r\n { name: 'visible', type: 'boolean', label: '可见', defaultValue: false },\r\n {\r\n name: 'size',\r\n type: 'select',\r\n label: '尺寸',\r\n options: [\r\n { label: '小', value: 'sm' },\r\n { label: '中', value: 'md' },\r\n { label: '大', value: 'lg' },\r\n { label: '超大', value: 'xl' },\r\n ],\r\n defaultValue: 'md',\r\n },\r\n { name: 'closable', type: 'boolean', label: '可关闭', defaultValue: true },\r\n { name: 'maskClosable', type: 'boolean', label: '点击背景关闭', defaultValue: true },\r\n { name: 'centered', type: 'boolean', label: '居中', defaultValue: true },\r\n { name: 'showFooter', type: 'boolean', label: '显示底部', defaultValue: true },\r\n { name: 'okText', type: 'string', label: '确认文本', defaultValue: '确认' },\r\n { name: 'cancelText', type: 'string', label: '取消文本', defaultValue: '取消' },\r\n { name: 'loading', type: 'boolean', label: '加载中', defaultValue: false },\r\n ],\r\n defaultProps: { title: '提示', visible: false, closable: true, centered: true, showFooter: true },\r\n },\r\n]\r\n\r\n// 获取组件定义\r\nexport function getComponentDefinition(type: ComponentType): ComponentDefinition | undefined {\r\n return componentDefinitions.find((def) => def.type === type)\r\n}\r\n\r\n// 生成唯一 ID\r\nexport function generateId(): string {\r\n return `node-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\r\n}\r\n\r\n","// ============================================\r\n// 设计器历史记录 Hook\r\n// ============================================\r\n\r\nimport { useState, useCallback, useRef } from 'react'\r\nimport { DesignNode } from './types'\r\n\r\nconst MAX_HISTORY_LENGTH = 50\r\n\r\nexport interface UseDesignerHistoryReturn {\r\n nodes: DesignNode[]\r\n setNodes: (nodes: DesignNode[] | ((prev: DesignNode[]) => DesignNode[])) => void\r\n undo: () => void\r\n redo: () => void\r\n canUndo: boolean\r\n canRedo: boolean\r\n reset: (initialNodes?: DesignNode[]) => void\r\n historyLength: number\r\n currentIndex: number\r\n}\r\n\r\nexport function useDesignerHistory(initialNodes: DesignNode[] = []): UseDesignerHistoryReturn {\r\n const [history, setHistory] = useState<DesignNode[][]>([initialNodes])\r\n const [currentIndex, setCurrentIndex] = useState(0)\r\n const isUpdatingRef = useRef(false)\r\n\r\n const nodes = history[currentIndex] || []\r\n\r\n const setNodes = useCallback((updater: DesignNode[] | ((prev: DesignNode[]) => DesignNode[])) => {\r\n if (isUpdatingRef.current) return\r\n isUpdatingRef.current = true\r\n\r\n setHistory((prevHistory) => {\r\n const currentNodes = prevHistory[currentIndex] || []\r\n const newNodes = typeof updater === 'function' ? updater(currentNodes) : updater\r\n\r\n // 如果节点没有变化,不记录历史\r\n if (JSON.stringify(currentNodes) === JSON.stringify(newNodes)) {\r\n isUpdatingRef.current = false\r\n return prevHistory\r\n }\r\n\r\n // 截断当前索引之后的历史\r\n const truncatedHistory = prevHistory.slice(0, currentIndex + 1)\r\n \r\n // 添加新状态\r\n const newHistory = [...truncatedHistory, newNodes]\r\n \r\n // 限制历史长度\r\n if (newHistory.length > MAX_HISTORY_LENGTH) {\r\n newHistory.shift()\r\n setCurrentIndex((prev) => Math.max(0, prev))\r\n } else {\r\n setCurrentIndex(newHistory.length - 1)\r\n }\r\n\r\n isUpdatingRef.current = false\r\n return newHistory\r\n })\r\n }, [currentIndex])\r\n\r\n const undo = useCallback(() => {\r\n setCurrentIndex((prev) => Math.max(0, prev - 1))\r\n }, [])\r\n\r\n const redo = useCallback(() => {\r\n setCurrentIndex((prev) => Math.min(history.length - 1, prev + 1))\r\n }, [history.length])\r\n\r\n const reset = useCallback((initialNodes: DesignNode[] = []) => {\r\n setHistory([initialNodes])\r\n setCurrentIndex(0)\r\n }, [])\r\n\r\n return {\r\n nodes,\r\n setNodes,\r\n undo,\r\n redo,\r\n canUndo: currentIndex > 0,\r\n canRedo: currentIndex < history.length - 1,\r\n reset,\r\n historyLength: history.length,\r\n currentIndex,\r\n }\r\n}\r\n\r\n","// ============================================\r\n// 📦 预设模板系统\r\n// ============================================\r\n\r\nimport { DesignNode, generateId } from './types'\r\n\r\nexport interface DesignTemplate {\r\n id: string\r\n name: string\r\n description: string\r\n icon: string\r\n category: 'form' | 'card' | 'layout' | 'feedback' | 'page'\r\n preview?: string\r\n nodes: Omit<DesignNode, 'id'>[]\r\n}\r\n\r\n// 为模板节点生成唯一ID\r\nexport function instantiateTemplate(template: DesignTemplate): DesignNode[] {\r\n return template.nodes.map((node) => ({\r\n ...node,\r\n id: generateId(),\r\n props: { ...node.props },\r\n children: node.children?.map((child) => ({\r\n ...child,\r\n id: generateId(),\r\n props: { ...child.props },\r\n })),\r\n }))\r\n}\r\n\r\n// 预设模板库\r\nexport const designTemplates: DesignTemplate[] = [\r\n // ========== 表单模板 ==========\r\n {\r\n id: 'login-form',\r\n name: '登录表单',\r\n description: '包含用户名、密码输入框和登录按钮',\r\n icon: '',\r\n category: 'form',\r\n nodes: [\r\n {\r\n type: 'Input',\r\n props: {\r\n label: '用户名',\r\n placeholder: '请输入用户名',\r\n variant: 'default',\r\n size: 'md',\r\n },\r\n },\r\n {\r\n type: 'Input',\r\n props: {\r\n label: '密码',\r\n placeholder: '请输入密码',\r\n variant: 'default',\r\n size: 'md',\r\n },\r\n },\r\n {\r\n type: 'Button',\r\n props: {\r\n children: '登录',\r\n variant: 'primary',\r\n size: 'lg',\r\n fullWidth: true,\r\n },\r\n },\r\n ],\r\n },\r\n {\r\n id: 'register-form',\r\n name: '注册表单',\r\n description: '完整的用户注册表单',\r\n icon: '',\r\n category: 'form',\r\n nodes: [\r\n {\r\n type: 'Input',\r\n props: {\r\n label: '用户名',\r\n placeholder: '请输入用户名',\r\n required: true,\r\n },\r\n },\r\n {\r\n type: 'Input',\r\n props: {\r\n label: '邮箱',\r\n placeholder: '请输入邮箱地址',\r\n required: true,\r\n },\r\n },\r\n {\r\n type: 'Input',\r\n props: {\r\n label: '密码',\r\n placeholder: '请输入密码',\r\n required: true,\r\n },\r\n },\r\n {\r\n type: 'Input',\r\n props: {\r\n label: '确认密码',\r\n placeholder: '请再次输入密码',\r\n required: true,\r\n },\r\n },\r\n {\r\n type: 'Checkbox',\r\n props: {\r\n label: '我已阅读并同意服务条款',\r\n size: 'md',\r\n },\r\n },\r\n {\r\n type: 'Button',\r\n props: {\r\n children: '注册',\r\n variant: 'primary',\r\n size: 'lg',\r\n fullWidth: true,\r\n },\r\n },\r\n ],\r\n }\r\n]\r\n\r\n// 按分类获取模板\r\nexport function getTemplatesByCategory(category: DesignTemplate['category']): DesignTemplate[] {\r\n return designTemplates.filter((t) => t.category === category)\r\n}\r\n\r\n// 获取所有分类\r\nexport function getAllCategories(): Array<{ id: DesignTemplate['category']; name: string; icon: string }> {\r\n return [\r\n { id: 'form', name: '表单', icon: '' }\r\n ]\r\n}\r\n\r\n","// ============================================\r\n// 🎨 可视化组件设计器\r\n// ============================================\r\n\r\nimport React, { useState, useCallback, useMemo } from 'react'\r\nimport { cn } from '../utils/cn'\r\nimport {\r\n ComponentType,\r\n DesignNode,\r\n componentDefinitions,\r\n getComponentDefinition,\r\n generateId,\r\n ComponentProperty,\r\n} from './types'\r\nimport { useDesignerHistory } from './useDesignerHistory'\r\nimport { designTemplates, instantiateTemplate, getAllCategories, DesignTemplate } from './templates'\r\nimport Button from '../components/Button'\r\nimport Input from '../components/Input'\r\nimport Card from '../components/Card'\r\nimport Select from '../components/Select'\r\nimport Checkbox from '../components/Checkbox'\r\nimport Switch from '../components/Switch'\r\nimport Radio from '../components/Radio'\r\nimport Textarea from '../components/Textarea'\r\nimport Alert from '../components/Alert'\r\nimport Progress from '../components/Progress'\r\nimport Tag from '../components/Tag'\r\nimport Avatar from '../components/Avatar'\r\nimport Divider from '../components/Divider'\r\nimport Dialog from '../components/Dialog'\r\nimport Skeleton from '../components/Skeleton'\r\nimport Spinner from '../components/Spinner'\r\nimport Container from '../components/Container'\r\nimport Tabs, { TabList, Tab, TabPanel } from '../components/Tabs'\r\nimport Popover from '../components/Popover'\r\n\r\n\r\n\r\n// Dialog 预览包装器 - 追踪Dialog的打开/关闭状态\r\nfunction DialogPreviewWrapper({ props }: { props: Record<string, unknown> }) {\r\n const [isDialogVisible, setIsDialogVisible] = useState(false)\r\n console.log(props);\r\n \r\n return (\r\n <div className=\"flex items-center justify-center py-4\">\r\n <button\r\n onClick={() => setIsDialogVisible(true)}\r\n className=\"px-4 py-2 bg-violet-500 hover:bg-violet-600 text-white rounded-lg text-sm font-medium transition-colors\"\r\n >\r\n 点击打开弹窗\r\n </button>\r\n <Dialog\r\n {...props}\r\n visible={isDialogVisible}\r\n onVisibleChange={(visible) => {\r\n if (!visible) setIsDialogVisible(false)\r\n }}\r\n />\r\n </div>\r\n )\r\n}\r\n\r\n// 组件映射\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nconst componentMap: Record<string, React.ComponentType<any>> = {\r\n Button,\r\n Input,\r\n Card,\r\n Select,\r\n Checkbox,\r\n Switch,\r\n Radio,\r\n Textarea,\r\n Alert,\r\n Progress,\r\n Tag,\r\n Avatar,\r\n Divider,\r\n Dialog,\r\n Skeleton,\r\n Spinner,\r\n Container,\r\n Tabs,\r\n Popover,\r\n}\r\n\r\n// 组件化 Props 过滤和安全处理\r\nfunction getSafeProps(type: ComponentType, props: Record<string, unknown>) {\r\n // 过滤 props\r\n const filtered = { ...props }\r\n \r\n // 删除设计器特定的属性和事件处理器\r\n delete filtered.id\r\n delete filtered.parentId\r\n delete filtered.children_design\r\n delete filtered.onVisibleChange\r\n delete filtered.onOk\r\n delete filtered.onCancel\r\n delete filtered.onChange\r\n delete filtered.onClick\r\n delete filtered.onCheck\r\n delete filtered.onSelect\r\n delete filtered.onClose\r\n delete filtered.onOpen\r\n delete filtered.onHide\r\n delete filtered.onShow\r\n \r\n // 对特定组件的处理\r\n switch (type) {\r\n case 'Tabs':\r\n filtered.items=[\r\n { label: '概览', key: 'overview', children: <div>概览内容</div> },\r\n { label: '通信', key: 'comm', children: <div>通信内容</div> , disabled: false},\r\n { label: '用户', key: 'user', children: <div>用户信息</div> },\r\n ]\r\n filtered.defaultValue = filtered.defaultValue || 'comm'\r\n break\r\n case 'Container':\r\n filtered.direction = filtered.direction || 'row'\r\n filtered.justify = filtered.justify || 'start'\r\n filtered.align = filtered.align || 'start'\r\n filtered.gap = filtered.gap || 'md'\r\n filtered.padding = filtered.padding || 'md'\r\n filtered.wrap = filtered.wrap ?? false\r\n filtered.center = filtered.center ?? false\r\n break\r\n case 'Input':\r\n filtered.placeholder = filtered.placeholder || '请输入...'\r\n break\r\n \r\n case 'Select':\r\n filtered.placeholder = filtered.placeholder || '请选择...'\r\n break\r\n \r\n case 'Textarea':\r\n filtered.placeholder = filtered.placeholder || '请输入...'\r\n filtered.rows = typeof filtered.rows === 'number' ? filtered.rows : 4\r\n break\r\n \r\n case 'Button':\r\n filtered.children = filtered.children || '按钮'\r\n break\r\n \r\n case 'Avatar':\r\n filtered.name = filtered.name || 'User'\r\n break\r\n case 'Tag':\r\n filtered.children = filtered.children || '标签'\r\n break\r\n \r\n case 'Alert':\r\n filtered.children = filtered.children || '这是一条提示信息'\r\n filtered.type = filtered.type || 'info'\r\n break\r\n \r\n case 'Spinner':\r\n filtered.label = filtered.label || '加载中...'\r\n break\r\n \r\n case 'Progress':\r\n filtered.value = typeof filtered.value === 'number' ? filtered.value : 50\r\n break\r\n \r\n case 'Radio':\r\n filtered.label = filtered.label || '选项'\r\n break\r\n \r\n case 'Checkbox':\r\n filtered.label = filtered.label || '选项'\r\n break\r\n \r\n case 'Switch':\r\n filtered.label = filtered.label || '开关'\r\n break\r\n \r\n case 'Card':\r\n filtered.title = filtered.title || '卡片标题'\r\n filtered.children = filtered.children || '卡片内容'\r\n break\r\n \r\n case 'Divider':\r\n filtered.children = filtered.children || ''\r\n break\r\n \r\n case 'Skeleton':\r\n filtered.variant = filtered.variant || 'text'\r\n break\r\n \r\n case 'Popover':\r\n filtered.content = filtered.content || '气泡内容'\r\n filtered.children = filtered.children || (\r\n <span className=\"px-2 py-1 bg-white rounded inline-block\">\r\n 点击查看气泡\r\n </span>\r\n )\r\n break\r\n case 'Dialog':\r\n filtered.title = filtered.title || '提示框'\r\n filtered.children = filtered.children || '这是对话框内容'\r\n break\r\n }\r\n \r\n return filtered as Record<string, unknown>\r\n}\r\n\r\n// 安全渲染组件的包装函数\r\nfunction SafeComponentRenderer({ node }: { node: DesignNode }) {\r\n const Component = componentMap[node.type]\r\n \r\n if (!Component) {\r\n return (\r\n <div className=\"p-4 bg-red-50 border border-red-200 rounded-lg text-red-600 text-sm\">\r\n ❌ 未知组件类型: {node.type}\r\n </div>\r\n )\r\n }\r\n \r\n try {\r\n const safeProps = getSafeProps(node.type, node.props)\r\n\r\n // Dialog 的特殊处理 - 使用预览包装器\r\n if (node.type === 'Dialog') {\r\n return <DialogPreviewWrapper props={safeProps} />\r\n }\r\n \r\n return <Component {...safeProps} />\r\n } catch (error) {\r\n console.error(`组件 ${node.type} 渲染失败:`, error)\r\n return (\r\n <div className=\"p-4 bg-yellow-50 border border-yellow-200 rounded-lg text-yellow-600 text-sm\">\r\n ⚠️ 组件渲染失败: {node.type}\r\n <div className=\"text-xs mt-1\">{String(error)}</div>\r\n </div>\r\n )\r\n }\r\n}\r\n\r\n// 视图模式\r\ntype ViewMode = 'design' | 'preview' | 'split'\r\n\r\n// 面板类型\r\ntype PanelType = 'components' | 'templates' | 'custom'\r\n\r\nexport interface ComponentDesignerProps {\r\n /** 初始节点 */\r\n initialNodes?: DesignNode[]\r\n /** 节点变化回调 */\r\n onChange?: (nodes: DesignNode[]) => void\r\n /** 导出代码回调 */\r\n onExport?: (code: string) => void\r\n /** 自定义类名 */\r\n className?: string\r\n /** 设计器高度 */\r\n height?: string | number\r\n}\r\n\r\nexport default function ComponentDesigner({\r\n initialNodes = [],\r\n onChange,\r\n onExport,\r\n className,\r\n height = '700px',\r\n}: ComponentDesignerProps) {\r\n // 使用历史记录 Hook\r\n const {\r\n nodes,\r\n setNodes,\r\n undo,\r\n redo,\r\n canUndo,\r\n canRedo,\r\n } = useDesignerHistory(initialNodes)\r\n\r\n const [selectedId, setSelectedId] = useState<string | null>(null)\r\n const [draggedType, setDraggedType] = useState<ComponentType | null>(null)\r\n const [viewMode, setViewMode] = useState<ViewMode>('split')\r\n const [leftPanel, setLeftPanel] = useState<PanelType>('components')\r\n\r\n // 选中的节点\r\n const selectedNode = useMemo(\r\n () => nodes.find((n) => n.id === selectedId),\r\n [nodes, selectedId]\r\n )\r\n\r\n // 生成代码(保留用于导出功能)\r\n const generatedCode = useMemo(() => generateCode(nodes), [nodes])\r\n\r\n // 添加节点\r\n const addNode = useCallback(\r\n (type: ComponentType) => {\r\n const definition = getComponentDefinition(type)\r\n if (!definition) return\r\n const newNode: DesignNode = {\r\n id: generateId(),\r\n type,\r\n props: { ...definition.defaultProps },\r\n }\r\n\r\n setNodes((prev) => {\r\n const updated = [...prev, newNode]\r\n onChange?.(updated)\r\n return updated\r\n })\r\n setSelectedId(newNode.id)\r\n },\r\n [setNodes, onChange]\r\n )\r\n\r\n // 更新节点属性\r\n const updateNodeProps = useCallback(\r\n (id: string, props: Record<string, unknown>) => {\r\n setNodes((prev) => {\r\n const updated = prev.map((node) =>\r\n node.id === id ? { ...node, props: { ...node.props, ...props } } : node\r\n )\r\n onChange?.(updated)\r\n return updated\r\n })\r\n },\r\n [setNodes, onChange]\r\n )\r\n\r\n // 删除节点\r\n const deleteNode = useCallback(\r\n (id: string) => {\r\n setNodes((prev) => {\r\n const updated = prev.filter((node) => node.id !== id)\r\n onChange?.(updated)\r\n return updated\r\n })\r\n if (selectedId === id) setSelectedId(null)\r\n },\r\n [setNodes, selectedId, onChange]\r\n )\r\n\r\n // 清空所有节点\r\n const clearAll = useCallback(() => {\r\n setNodes([])\r\n setSelectedId(null)\r\n onChange?.([])\r\n }, [setNodes, onChange])\r\n\r\n // 复制节点\r\n const duplicateNode = useCallback(\r\n (id: string) => {\r\n const node = nodes.find((n) => n.id === id)\r\n if (!node) return\r\n\r\n const newNode: DesignNode = {\r\n ...node,\r\n id: generateId(),\r\n props: { ...node.props },\r\n }\r\n\r\n setNodes((prev) => {\r\n const updated = [...prev, newNode]\r\n onChange?.(updated)\r\n return updated\r\n })\r\n setSelectedId(newNode.id)\r\n },\r\n [nodes, setNodes, onChange]\r\n )\r\n\r\n // 移动节点\r\n const moveNode = useCallback(\r\n (id: string, direction: 'up' | 'down') => {\r\n setNodes((prev) => {\r\n const index = prev.findIndex((n) => n.id === id)\r\n if (index === -1) return prev\r\n if (direction === 'up' && index === 0) return prev\r\n if (direction === 'down' && index === prev.length - 1) return prev\r\n\r\n const newNodes = [...prev]\r\n const targetIndex = direction === 'up' ? index - 1 : index + 1\r\n ;[newNodes[index], newNodes[targetIndex]] = [newNodes[targetIndex], newNodes[index]]\r\n onChange?.(newNodes)\r\n return newNodes\r\n })\r\n },\r\n [setNodes, onChange]\r\n )\r\n\r\n // 应用模板\r\n const applyTemplate = useCallback(\r\n (template: DesignTemplate) => {\r\n const newNodes = instantiateTemplate(template)\r\n setNodes((prev) => {\r\n const updated = [...prev, ...newNodes]\r\n onChange?.(updated)\r\n return updated\r\n })\r\n },\r\n [setNodes, onChange]\r\n )\r\n\r\n // 导出设计\r\n const handleExportCode = useCallback(() => {\r\n onExport?.(generatedCode)\r\n }, [onExport, generatedCode])\r\n\r\n const handleExportJson = useCallback(() => {\r\n const json = JSON.stringify(nodes, null, 2)\r\n navigator.clipboard.writeText(json)\r\n alert('设计 JSON 已复制到剪贴板!')\r\n }, [nodes])\r\n\r\n // 导入 JSON\r\n const handleImportJSON = useCallback(\r\n (jsonStr: string) => {\r\n try {\r\n const imported = JSON.parse(jsonStr) as DesignNode[]\r\n if (Array.isArray(imported)) {\r\n setNodes(imported)\r\n onChange?.(imported)\r\n }\r\n } catch {\r\n alert('JSON 格式错误')\r\n }\r\n },\r\n [setNodes, onChange]\r\n )\r\n\r\n // 拖放处理\r\n const handleDragStart = (type: ComponentType) => {\r\n setDraggedType(type)\r\n }\r\n\r\n const handleDrop = () => {\r\n if (draggedType) {\r\n addNode(draggedType)\r\n setDraggedType(null)\r\n }\r\n }\r\n\r\n // 分组组件\r\n const groupedComponents = useMemo(() => {\r\n const groups: Record<string, typeof componentDefinitions> = {\r\n basic: [],\r\n form: [],\r\n layout: [],\r\n feedback: [],\r\n data: [],\r\n }\r\n componentDefinitions.forEach((def) => {\r\n groups[def.category].push(def)\r\n })\r\n return groups\r\n }, [])\r\n\r\n // 分组模板\r\n const groupedTemplates = useMemo(() => {\r\n const categories = getAllCategories()\r\n return categories.map((cat) => ({\r\n ...cat,\r\n templates: designTemplates.filter((t) => t.category === cat.id),\r\n }))\r\n }, [])\r\n\r\n return (\r\n <div\r\n className={cn('flex flex-col bg-gray-100 rounded-2xl overflow-hidden shadow-2xl', className)}\r\n style={{ height }}\r\n >\r\n {/* 顶部工具栏 */}\r\n <div className=\"h-14 bg-white border-b border-gray-200 flex items-center justify-between px-4\">\r\n <div className=\"flex items-center gap-4\">\r\n <h2 className=\"text-lg font-bold text-gray-800 flex items-center gap-2\">\r\n <span></span>\r\n <span>组件设计器</span>\r\n </h2>\r\n <div className=\"h-6 w-px bg-gray-200\" />\r\n {/* <div className=\"flex items-center gap-1\">\r\n <button\r\n onClick={undo}\r\n disabled={!canUndo}\r\n className={cn(\r\n 'p-2 rounded-lg transition-colors',\r\n canUndo ? 'hover:bg-gray-100 text-gray-700' : 'text-gray-300 cursor-not-allowed'\r\n )}\r\n title=\"撤销 (Ctrl+Z)\"\r\n >\r\n prev\r\n </button>\r\n <button\r\n onClick={redo}\r\n disabled={!canRedo}\r\n className={cn(\r\n 'p-2 rounded-lg transition-colors',\r\n canRedo ? 'hover:bg-gray-100 text-gray-700' : 'text-gray-300 cursor-not-allowed'\r\n )}\r\n title=\"重做 (Ctrl+Y)\"\r\n >\r\n next\r\n </button>\r\n </div> */}\r\n </div>\r\n\r\n {/* 视图模式切换 */}\r\n <div className=\"flex items-center gap-1 bg-gray-100 rounded-lg p-1\">\r\n {[\r\n { id: 'design', label: '设计', icon: '' },\r\n { id: 'preview', label: '预览', icon: '' },\r\n { id: 'split', label: '分屏', icon: '' },\r\n ].map((mode) => (\r\n <button\r\n key={mode.id}\r\n onClick={() => setViewMode(mode.id as ViewMode)}\r\n className={cn(\r\n 'px-3 py-1.5 rounded-md text-sm font-medium transition-all',\r\n viewMode === mode.id\r\n ? 'bg-white text-violet-700 shadow-sm'\r\n : 'text-gray-600 hover:text-gray-900'\r\n )}\r\n >\r\n {mode.icon} {mode.label}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-sm text-gray-500\">\r\n {nodes.length} 个组件\r\n </span>\r\n <Button size=\"sm\" variant=\"ghost\" onClick={clearAll} disabled={nodes.length === 0}>\r\n 清空\r\n </Button>\r\n <Button size=\"sm\" variant=\"primary\" onClick={handleExportCode} disabled={nodes.length === 0}>\r\n 导出代码\r\n </Button>\r\n <Button size=\"sm\" variant=\"primary\" onClick={handleExportJson} disabled={nodes.length === 0}>\r\n 导出设计\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n {/* 主体区域 */}\r\n <div className=\"flex-1 flex overflow-hidden\">\r\n {/* 左侧面板 */}\r\n <div className=\"w-72 bg-white border-r border-gray-200 flex flex-col\">\r\n {/* 面板切换 */}\r\n <div className=\"flex border-b border-gray-200\">\r\n {[\r\n { id: 'components', label: '组件', icon: '' },\r\n { id: 'templates', label: '模板', icon: '' },\r\n // { id: 'custom', label: '自定义', icon: '' },\r\n ].map((panel) => (\r\n <button\r\n key={panel.id}\r\n onClick={() => setLeftPanel(panel.id as PanelType)}\r\n className={cn(\r\n 'flex-1 px-3 py-3 text-sm font-medium transition-colors border-b-2',\r\n leftPanel === panel.id\r\n ? 'border-violet-500 text-violet-700 bg-violet-50/50'\r\n : 'border-transparent text-gray-500 hover:text-gray-700'\r\n )}\r\n >\r\n {panel.icon} {panel.label}\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* 面板内容 */}\r\n <div className=\"flex-1 overflow-auto p-3\">\r\n {/* 组件面板 */}\r\n {leftPanel === 'components' && (\r\n <div className=\"space-y-4\">\r\n {Object.entries(groupedComponents).map(([category, components]) => (\r\n <div key={category}>\r\n <h4 className=\"text-xs font-semibold text-gray-400 uppercase mb-2 px-1\">\r\n {category === 'basic' && '基础组件'}\r\n {category === 'form' && '表单组件'}\r\n {category === 'layout' && '布局组件'}\r\n {category === 'feedback' && '反馈组件'}\r\n {category === 'data' && '数据展示'}\r\n </h4>\r\n <div className=\"grid grid-cols-2 gap-2\">\r\n {components.map((def) => (\r\n <button\r\n key={def.type}\r\n draggable\r\n onDragStart={() => handleDragStart(def.type)}\r\n onClick={() => addNode(def.type)}\r\n className={cn(\r\n 'flex flex-col items-center gap-1.5 p-3 rounded-xl',\r\n 'border border-gray-200 bg-white',\r\n 'hover:border-violet-400 hover:bg-violet-50 hover:shadow-sm',\r\n 'transition-all duration-200 cursor-grab active:cursor-grabbing'\r\n )}\r\n >\r\n <span className=\"text-xl\">{def.icon}</span>\r\n <span className=\"text-xs font-medium text-gray-700\">{def.name}</span>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* 模板面板 */}\r\n {leftPanel === 'templates' && (\r\n <div className=\"space-y-4\">\r\n {groupedTemplates.map((group) => (\r\n <div key={group.id}>\r\n <h4 className=\"text-xs font-semibold text-gray-400 uppercase mb-2 px-1\">\r\n {group.icon} {group.name}\r\n </h4>\r\n <div className=\"space-y-2\">\r\n {group.templates.map((template) => (\r\n <button\r\n key={template.id}\r\n onClick={() => applyTemplate(template)}\r\n className={cn(\r\n 'w-full text-left p-3 rounded-xl',\r\n 'border border-gray-200 bg-white',\r\n 'hover:border-violet-400 hover:bg-violet-50 hover:shadow-sm',\r\n 'transition-all duration-200'\r\n )}\r\n >\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n <span className=\"text-lg\">{template.icon}</span>\r\n <span className=\"font-medium text-gray-800\">{template.name}</span>\r\n </div>\r\n <p className=\"text-xs text-gray-500\">{template.description}</p>\r\n <div className=\"mt-2 flex items-center gap-1\">\r\n <span className=\"text-xs text-gray-400\">\r\n 包含 {template.nodes.length} 个组件\r\n </span>\r\n </div>\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* 自定义代码面板 */}\r\n {leftPanel === 'custom' && (\r\n <div className=\"space-y-4\">\r\n <div className=\"p-3 bg-gradient-to-br from-violet-50 to-fuchsia-50 rounded-xl border border-violet-100\">\r\n <h4 className=\"font-medium text-violet-800 mb-1\">设计导入/导出</h4>\r\n <p className=\"text-xs text-violet-600\">\r\n 导出你的设计配置为 JSON,或导入已有的设计配置\r\n </p>\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <h5 className=\"text-xs font-semibold text-gray-500 px-1\">导入/导出</h5>\r\n <button\r\n onClick={() => {\r\n const json = JSON.stringify(nodes, null, 2)\r\n navigator.clipboard.writeText(json)\r\n alert('已复制到剪贴板')\r\n }}\r\n className=\"w-full p-2 text-sm text-left rounded-lg border border-gray-200 hover:bg-gray-50\"\r\n >\r\n 复制设计 JSON\r\n </button>\r\n <button\r\n onClick={() => {\r\n const json = prompt('请粘贴设计 JSON:')\r\n if (json) handleImportJSON(json)\r\n }}\r\n className=\"w-full p-2 text-sm text-left rounded-lg border border-gray-200 hover:bg-gray-50\"\r\n >\r\n 导入设计 JSON\r\n </button>\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <h5 className=\"text-xs font-semibold text-gray-500 px-1\">快捷操作</h5>\r\n <div className=\"grid grid-cols-2 gap-2 text-xs\">\r\n <div className=\"p-2 bg-gray-50 rounded-lg\">\r\n <span className=\"text-gray-400\">撤销</span>\r\n <kbd className=\"ml-1 px-1.5 py-0.5 bg-white rounded border text-gray-600\">Ctrl+Z</kbd>\r\n </div>\r\n <div className=\"p-2 bg-gray-50 rounded-lg\">\r\n <span className=\"text-gray-400\">重做</span>\r\n <kbd className=\"ml-1 px-1.5 py-0.5 bg-white rounded border text-gray-600\">Ctrl+Y</kbd>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* 中间区域 */}\r\n <div className=\"flex-1 flex\">\r\n {/* 设计画布 */}\r\n {(viewMode === 'design' || viewMode === 'split') && (\r\n <div className={cn('flex flex-col', viewMode === 'split' ? 'w-1/2' : 'flex-1')}>\r\n <div\r\n className={cn(\r\n 'flex-1 p-6 overflow-auto',\r\n 'bg-[linear-gradient(to_right,#e5e7eb_1px,transparent_1px),linear-gradient(to_bottom,#e5e7eb_1px,transparent_1px)]',\r\n 'bg-[size:20px_20px]',\r\n draggedType && 'ring-2 ring-violet-500 ring-inset'\r\n )}\r\n onDragOver={(e) => e.preventDefault()}\r\n onDrop={handleDrop}\r\n >\r\n {nodes.length === 0 ? (\r\n <div className=\"h-full flex items-center justify-center\">\r\n <div className=\"text-center text-gray-400 max-w-xs\">\r\n <div className=\"text-6xl mb-4\"></div>\r\n <p className=\"text-lg font-medium mb-2\">开始设计您的界面</p>\r\n <p className=\"text-sm\">从左侧拖拽组件到这里,或选择一个模板快速开始</p>\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-3 max-w-2xl mx-auto\">\r\n {nodes.map((node, index) => {\r\n return (\r\n <div\r\n key={node.id}\r\n onClick={() => setSelectedId(node.id)}\r\n className={cn(\r\n 'relative p-3 rounded-xl transition-all cursor-pointer group',\r\n selectedId === node.id\r\n ? 'ring-2 ring-violet-500 bg-violet-50/50 shadow-lg shadow-violet-500/10'\r\n : 'hover:ring-2 hover:ring-gray-300 hover:bg-white/50'\r\n )}\r\n >\r\n {/* 组件类型标签 */}\r\n <div\r\n className={cn(\r\n 'absolute -top-2 left-2 px-2 py-0.5 rounded text-xs font-medium',\r\n 'transition-opacity',\r\n selectedId === node.id\r\n ? 'bg-violet-500 text-white opacity-100'\r\n : 'bg-gray-200 text-gray-600 opacity-0 group-hover:opacity-100'\r\n )}\r\n >\r\n {getComponentDefinition(node.type)?.name}\r\n </div>\r\n\r\n {/* 组件渲染 - 使用安全渲染器 */}\r\n <div className=\"min-h-[40px]\">\r\n <SafeComponentRenderer node={node} />\r\n </div>\r\n\r\n {/* 操作按钮 */}\r\n {selectedId === node.id && (\r\n <div className=\"absolute -top-2 -right-2 flex gap-1\">\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation()\r\n moveNode(node.id, 'up')\r\n }}\r\n disabled={index === 0}\r\n className=\"w-6 h-6 rounded-full bg-gray-500 text-white text-xs flex items-center justify-center hover:bg-gray-600 disabled:opacity-50\"\r\n title=\"上移\"\r\n >\r\n ↑\r\n </button>\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation()\r\n moveNode(node.id, 'down')\r\n }}\r\n disabled={index === nodes.length - 1}\r\n className=\"w-6 h-6 rounded-full bg-gray-500 text-white text-xs flex items-center justify-center hover:bg-gray-600 disabled:opacity-50\"\r\n title=\"下移\"\r\n >\r\n ↓\r\n </button>\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation()\r\n duplicateNode(node.id)\r\n }}\r\n className=\"w-6 h-6 rounded-full bg-blue-500 text-white text-xs flex items-center justify-center hover:bg-blue-600\"\r\n title=\"复制\"\r\n >c</button>\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation()\r\n deleteNode(node.id)\r\n }}\r\n className=\"w-6 h-6 rounded-full bg-rose-500 text-white text-xs flex items-center justify-center hover:bg-rose-600\"\r\n title=\"删除\"\r\n >\r\n ✕\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n )\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* 分隔线 */}\r\n {viewMode === 'split' && <div className=\"w-px bg-gray-200\" />}\r\n\r\n {/* 预览面板 */}\r\n {(viewMode === 'preview' || viewMode === 'split') && (\r\n <div className={cn('flex flex-col bg-white overflow-auto', viewMode === 'split' ? 'w-1/2' : 'flex-1')}>\r\n <div className=\"p-4 border-b bg-gray-50 text-sm font-medium text-gray-700\">\r\n 实时预览\r\n </div>\r\n <div className=\"flex-1 p-6 overflow-auto\">\r\n {nodes.length === 0 ? (\r\n <div className=\"h-full flex items-center justify-center text-gray-400\">\r\n <div className=\"text-center\">\r\n <div className=\"text-4xl mb-2\"></div>\r\n <p className=\"text-sm\">在设计模式下添加组件</p>\r\n <p className=\"text-xs text-gray-400 mt-1\">预览效果会显示在此</p>\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-4 max-w-lg\">\r\n {nodes.map((node) => (\r\n <div key={node.id} className=\"rounded-lg border border-gray-200 overflow-hidden bg-white shadow-sm\">\r\n <SafeComponentRenderer node={node} />\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* 右侧属性面板 */}\r\n {viewMode !== 'preview' && (\r\n <div className=\"w-80 bg-white border-l border-gray-200 flex flex-col\">\r\n <div className=\"p-4 border-b border-gray-200\">\r\n <h3 className=\"font-semibold text-gray-900\">属性配置</h3>\r\n <p className=\"text-xs text-gray-500 mt-1\">\r\n {selectedNode\r\n ? `编辑 ${getComponentDefinition(selectedNode.type)?.name}`\r\n : '选择组件以编辑属性'}\r\n </p>\r\n </div>\r\n <div className=\"flex-1 overflow-auto p-4\">\r\n {selectedNode ? (\r\n <PropertyPanel\r\n node={selectedNode}\r\n onUpdate={(props) => updateNodeProps(selectedNode.id, props)}\r\n />\r\n ) : (\r\n <div className=\"text-center text-gray-400 mt-8\">\r\n <div className=\"text-4xl mb-3\"></div>\r\n <p className=\"text-sm font-medium\">点击画布中的组件</p>\r\n <p className=\"text-sm\">开始编辑属性</p>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n// ============================================\r\n// 属性面板组件\r\n// ============================================\r\n\r\ninterface PropertyPanelProps {\r\n node: DesignNode\r\n onUpdate: (props: Record<string, unknown>) => void\r\n}\r\n\r\nfunction PropertyPanel({ node, onUpdate }: PropertyPanelProps) {\r\n const definition = getComponentDefinition(node.type)\r\n if (!definition) return null\r\n\r\n const renderProperty = (prop: ComponentProperty) => {\r\n const value = node.props[prop.name] ?? prop.defaultValue\r\n\r\n switch (prop.type) {\r\n case 'string':\r\n return (\r\n <div key={prop.name} className=\"mb-4\">\r\n <Input\r\n label={prop.label}\r\n value={value as string}\r\n size=\"sm\"\r\n onChange={(e) => onUpdate({ [prop.name]: e.target.value })}\r\n />\r\n </div>\r\n )\r\n case 'number':\r\n return (\r\n <div key={prop.name} className=\"mb-4\">\r\n <label className=\"block text-sm font-medium text-gray-700 mb-1.5\">\r\n {prop.label}\r\n </label>\r\n <input\r\n type=\"number\"\r\n value={value as number}\r\n onChange={(e) => onUpdate({ [prop.name]: Number(e.target.value) })}\r\n className=\"w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-violet-500/20 focus:border-violet-500\"\r\n />\r\n </div>\r\n )\r\n case 'boolean':\r\n return (\r\n <div key={prop.name} className=\"mb-4 flex items-center justify-between py-1\">\r\n <span className=\"text-sm font-medium text-gray-700\">{prop.label}</span>\r\n <Switch\r\n checked={value as boolean}\r\n onChange={(checked) => onUpdate({ [prop.name]: checked })}\r\n size=\"sm\"\r\n />\r\n </div>\r\n )\r\n case 'select':\r\n return (\r\n <div key={prop.name} className=\"mb-4\">\r\n <label className=\"block text-sm font-medium text-gray-700 mb-1.5\">\r\n {prop.label}\r\n </label>\r\n <select\r\n value={value as string}\r\n onChange={(e) => onUpdate({ [prop.name]: e.target.value })}\r\n className=\"w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-violet-500/20 focus:border-violet-500 bg-white\"\r\n >\r\n {prop.options?.map((opt) => (\r\n <option key={String(opt.value)} value={String(opt.value)}>\r\n {opt.label}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n )\r\n case 'color':\r\n return (\r\n <div key={prop.name} className=\"mb-4\">\r\n <label className=\"block text-sm font-medium text-gray-700 mb-1.5\">\r\n {prop.label}\r\n </label>\r\n <div className=\"flex gap-2\">\r\n {['violet', 'cyan', 'emerald', 'rose', 'amber', 'gray'].map((color) => (\r\n <button\r\n key={color}\r\n onClick={() => onUpdate({ [prop.name]: color })}\r\n className={cn(\r\n 'w-8 h-8 rounded-lg transition-all',\r\n `bg-${color}-500`,\r\n value === color ? 'ring-2 ring-offset-2 ring-violet-500 scale-110' : 'hover:scale-105'\r\n )}\r\n style={{\r\n backgroundColor:\r\n color === 'violet' ? '#8b5cf6' :\r\n color === 'cyan' ? '#06b6d4' :\r\n color === 'emerald' ? '#10b981' :\r\n color === 'rose' ? '#f43f5e' :\r\n color === 'amber' ? '#f59e0b' :\r\n '#6b7280',\r\n }}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n )\r\n default:\r\n return null\r\n }\r\n }\r\n\r\n return (\r\n <div className=\"space-y-1\">\r\n {/* 组件信息 */}\r\n <div className=\"mb-6 p-3 bg-gradient-to-r from-violet-50 to-fuchsia-50 rounded-xl\">\r\n <div className=\"flex items-center gap-2 mb-1\">\r\n <span className=\"text-xl\">{definition.icon}</span>\r\n <span className=\"font-semibold text-gray-800\">{definition.name}</span>\r\n </div>\r\n <p className=\"text-xs text-gray-500\">{definition.description}</p>\r\n </div>\r\n\r\n {/* 属性列表 */}\r\n {definition.properties.map(renderProperty)}\r\n </div>\r\n )\r\n}\r\n\r\n// ============================================\r\n// 辅助函数\r\n// ============================================\r\n\r\nfunction generateCode(nodes: DesignNode[]): string {\r\n if (nodes.length === 0) {\r\n return `// 暂无组件,请从左侧添加组件开始设计\r\nimport React from 'react'\r\n\r\nexport default function MyComponent() {\r\n return (\r\n <div className=\"p-4\">\r\n {/* 在这里添加组件 */}\r\n </div>\r\n )\r\n}`\r\n }\r\n\r\n const imports = new Set<string>()\r\n nodes.forEach((node) => imports.add(node.type))\r\n\r\n const importStatement = `import { ${Array.from(imports).join(', ')} } from '@lvetech/ui-lib'`\r\n\r\n const renderNode = (node: DesignNode): string => {\r\n const props = Object.entries(node.props)\r\n .filter(([, value]) => value !== undefined && value !== '')\r\n .map(([key, value]) => {\r\n if (typeof value === 'boolean') return value ? key : ''\r\n if (typeof value === 'string') return `${key}=\"${value}\"`\r\n if (typeof value === 'number') return `${key}={${value}}`\r\n return `${key}={${JSON.stringify(value)}}`\r\n })\r\n .filter(Boolean)\r\n .join(' ')\r\n\r\n const children = node.props.children as string | undefined\r\n\r\n if (children && node.type !== 'Input' && node.type !== 'Avatar') {\r\n const filteredProps = props.replace(/children=\"[^\"]*\"/, '').trim()\r\n return `<${node.type}${filteredProps ? ' ' + filteredProps : ''}>${children}</${node.type}>`\r\n }\r\n\r\n return `<${node.type}${props ? ' ' + props : ''} />`\r\n }\r\n\r\n return `${importStatement}\r\n\r\nexport default function MyComponent() {\r\n return (\r\n <div className=\"space-y-4 p-4\">\r\n ${nodes.map(renderNode).join('\\n ')}\r\n </div>\r\n )\r\n}`\r\n}\r\n\r\nfunction generateDefaultCustomCode(): string {\r\n return `// ✨ 自定义组件开发\r\n// 在这里编写您的自定义组件代码\r\n\r\nimport React from 'react'\r\nimport { Button, Card, Input, Alert } from '@lvetech/ui-lib'\r\n\r\nexport default function CustomComponent() {\r\n const [value, setValue] = React.useState('')\r\n \r\n return (\r\n <Card title=\"自定义组件\" variant=\"elevated\">\r\n <div className=\"space-y-4\">\r\n <Alert type=\"info\" showIcon>\r\n 这是一个自定义组件示例\r\n </Alert>\r\n \r\n <Input\r\n label=\"输入内容\"\r\n value={value}\r\n onChange={(e) => setValue(e.target.value)}\r\n placeholder=\"请输入...\"\r\n />\r\n \r\n <Button variant=\"primary\" onClick={() => alert(\\`输入内容: \\${value}\\`)}>\r\n 提交\r\n </Button>\r\n </div>\r\n </Card>\r\n )\r\n}\r\n`\r\n}\r\n","// ============================================\r\n// 💻 代码编辑器组件\r\n// ============================================\r\n\r\nimport React, { useState, useRef, useEffect, useCallback } from 'react'\r\nimport { cn } from '../utils/cn'\r\n\r\nexport interface CodeEditorProps {\r\n /** 代码内容 */\r\n value: string\r\n /** 代码变化回调 */\r\n onChange?: (value: string) => void\r\n /** 语言 */\r\n language?: 'tsx' | 'jsx' | 'css' | 'json'\r\n /** 是否只读 */\r\n readOnly?: boolean\r\n /** 高度 */\r\n height?: string | number\r\n /** 自定义类名 */\r\n className?: string\r\n /** 显示行号 */\r\n showLineNumbers?: boolean\r\n /** 主题 */\r\n theme?: 'dark' | 'light'\r\n /** 标签页 */\r\n tabs?: Array<{ id: string; label: string; value: string }>\r\n /** 当前标签 */\r\n activeTab?: string\r\n /** 标签切换 */\r\n onTabChange?: (tabId: string) => void\r\n}\r\n\r\n// 简单的语法高亮(不依赖外部库)\r\nfunction highlightCode(code: string, language: string): string {\r\n if (language === 'tsx' || language === 'jsx') {\r\n return code\r\n // 关键字\r\n .replace(\r\n /\\b(import|export|default|from|const|let|var|function|return|if|else|for|while|class|extends|interface|type|enum|async|await|try|catch|throw|new|this|super|static|public|private|protected|readonly|as|is|in|of|typeof|instanceof|void|null|undefined|true|false)\\b/g,\r\n '<span class=\"text-violet-400\">$1</span>'\r\n )\r\n // 字符串\r\n .replace(\r\n /([\"'`])(?:(?=(\\\\?))\\2.)*?\\1/g,\r\n '<span class=\"text-emerald-400\">$&</span>'\r\n )\r\n // JSX 标签\r\n .replace(\r\n /(<\\/?)([A-Z][A-Za-z0-9]*)/g,\r\n '$1<span class=\"text-cyan-400\">$2</span>'\r\n )\r\n // 注释\r\n .replace(\r\n /(\\/\\/.*$|\\/\\*[\\s\\S]*?\\*\\/)/gm,\r\n '<span class=\"text-gray-500\">$1</span>'\r\n )\r\n // 数字\r\n .replace(\r\n /\\b(\\d+\\.?\\d*)\\b/g,\r\n '<span class=\"text-amber-400\">$1</span>'\r\n )\r\n }\r\n return code\r\n}\r\n\r\n// 转义 HTML\r\nfunction escapeHtml(text: string): string {\r\n return text\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n}\r\n\r\nexport default function CodeEditor({\r\n value,\r\n onChange,\r\n language = 'tsx',\r\n readOnly = false,\r\n height = 300,\r\n className,\r\n showLineNumbers = true,\r\n theme = 'dark',\r\n tabs,\r\n activeTab,\r\n onTabChange,\r\n}: CodeEditorProps) {\r\n const textareaRef = useRef<HTMLTextAreaElement>(null)\r\n const preRef = useRef<HTMLPreElement>(null)\r\n const [localValue, setLocalValue] = useState(value)\r\n\r\n // 同步外部值\r\n useEffect(() => {\r\n setLocalValue(value)\r\n }, [value])\r\n\r\n // 同步滚动\r\n const handleScroll = useCallback(() => {\r\n if (textareaRef.current && preRef.current) {\r\n preRef.current.scrollTop = textareaRef.current.scrollTop\r\n preRef.current.scrollLeft = textareaRef.current.scrollLeft\r\n }\r\n }, [])\r\n\r\n // 处理输入\r\n const handleChange = useCallback(\r\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\r\n const newValue = e.target.value\r\n setLocalValue(newValue)\r\n onChange?.(newValue)\r\n },\r\n [onChange]\r\n )\r\n\r\n // 处理 Tab 键\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\r\n if (e.key === 'Tab') {\r\n e.preventDefault()\r\n const start = e.currentTarget.selectionStart\r\n const end = e.currentTarget.selectionEnd\r\n const newValue = localValue.substring(0, start) + ' ' + localValue.substring(end)\r\n setLocalValue(newValue)\r\n onChange?.(newValue)\r\n\r\n // 恢复光标位置\r\n requestAnimationFrame(() => {\r\n if (textareaRef.current) {\r\n textareaRef.current.selectionStart = textareaRef.current.selectionEnd = start + 2\r\n }\r\n })\r\n }\r\n },\r\n [localValue, onChange]\r\n )\r\n\r\n const lines = localValue.split('\\n')\r\n const lineCount = lines.length\r\n\r\n const themeClasses = {\r\n dark: {\r\n container: 'bg-gray-900',\r\n lineNumbers: 'bg-gray-800/50 text-gray-500',\r\n code: 'text-gray-100',\r\n textarea: 'text-transparent caret-white',\r\n tabs: 'bg-gray-800 border-gray-700',\r\n activeTab: 'bg-gray-900 text-white',\r\n inactiveTab: 'text-gray-400 hover:text-gray-200',\r\n },\r\n light: {\r\n container: 'bg-white border border-gray-200',\r\n lineNumbers: 'bg-gray-50 text-gray-400',\r\n code: 'text-gray-900',\r\n textarea: 'text-transparent caret-gray-900',\r\n tabs: 'bg-gray-100 border-gray-200',\r\n activeTab: 'bg-white text-gray-900',\r\n inactiveTab: 'text-gray-500 hover:text-gray-700',\r\n },\r\n }\r\n\r\n const t = themeClasses[theme]\r\n\r\n return (\r\n <div\r\n className={cn('rounded-xl overflow-hidden flex flex-col', t.container, className)}\r\n style={{ height }}\r\n >\r\n {/* 标签栏 */}\r\n {tabs && tabs.length > 0 && (\r\n <div className={cn('flex items-center gap-1 px-2 py-1 border-b', t.tabs)}>\r\n {tabs.map((tab) => (\r\n <button\r\n key={tab.id}\r\n onClick={() => onTabChange?.(tab.id)}\r\n className={cn(\r\n 'px-3 py-1 text-xs font-medium rounded-md transition-colors',\r\n activeTab === tab.id ? t.activeTab : t.inactiveTab\r\n )}\r\n >\r\n {tab.label}\r\n </button>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* 编辑器主体 */}\r\n <div className=\"flex-1 flex overflow-hidden\">\r\n {/* 行号 */}\r\n {showLineNumbers && (\r\n <div\r\n className={cn(\r\n 'flex-shrink-0 select-none text-right text-xs font-mono py-4 px-3',\r\n t.lineNumbers\r\n )}\r\n >\r\n {Array.from({ length: lineCount }, (_, i) => (\r\n <div key={i} className=\"leading-6\">\r\n {i + 1}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* 代码区域 */}\r\n <div className=\"flex-1 relative overflow-hidden\">\r\n {/* 高亮显示层 */}\r\n <pre\r\n ref={preRef}\r\n className={cn(\r\n 'absolute inset-0 overflow-auto p-4 m-0',\r\n 'font-mono text-sm leading-6 whitespace-pre-wrap break-words',\r\n t.code\r\n )}\r\n dangerouslySetInnerHTML={{\r\n __html: highlightCode(escapeHtml(localValue), language) + '\\n',\r\n }}\r\n />\r\n\r\n {/* 输入层 */}\r\n <textarea\r\n ref={textareaRef}\r\n value={localValue}\r\n onChange={handleChange}\r\n onScroll={handleScroll}\r\n onKeyDown={handleKeyDown}\r\n readOnly={readOnly}\r\n spellCheck={false}\r\n className={cn(\r\n 'absolute inset-0 w-full h-full resize-none p-4',\r\n 'font-mono text-sm leading-6 whitespace-pre-wrap break-words',\r\n 'bg-transparent outline-none',\r\n t.textarea,\r\n readOnly && 'cursor-default'\r\n )}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* 状态栏 */}\r\n <div\r\n className={cn(\r\n 'flex items-center justify-between px-4 py-1.5 text-xs border-t',\r\n theme === 'dark' ? 'bg-gray-800/50 border-gray-700 text-gray-400' : 'bg-gray-50 border-gray-200 text-gray-500'\r\n )}\r\n >\r\n <span>{language.toUpperCase()}</span>\r\n <span>\r\n 行 {lines.length} · 字符 {localValue.length}\r\n </span>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n","// ============================================\r\n// 🎨 样式配置导出\r\n// ============================================\r\n\r\n// 注意:使用此组件库的项目需要安装和配置 Tailwind CSS\r\n// 在项目的 tailwind.config.js 中添加以下配置:\r\n\r\nexport const tailwindConfig = {\r\n content: [\r\n './node_modules/@lvetech/ui-lib/**/*.{js,ts,jsx,tsx}',\r\n ],\r\n theme: {\r\n extend: {\r\n colors: {\r\n // 主色调 - 极光紫\r\n primary: {\r\n 50: '#f5f3ff',\r\n 100: '#ede9fe',\r\n 200: '#ddd6fe',\r\n 300: '#c4b5fd',\r\n 400: '#a78bfa',\r\n 500: '#8b5cf6',\r\n 600: '#7c3aed',\r\n 700: '#6d28d9',\r\n 800: '#5b21b6',\r\n 900: '#4c1d95',\r\n },\r\n },\r\n animation: {\r\n 'spin-slow': 'spin 2s linear infinite',\r\n 'bounce-slow': 'bounce 1.5s infinite',\r\n shimmer: 'shimmer 2s infinite',\r\n },\r\n keyframes: {\r\n shimmer: {\r\n '0%': { transform: 'translateX(-100%)' },\r\n '100%': { transform: 'translateX(100%)' },\r\n },\r\n bars: {\r\n '0%, 40%, 100%': { transform: 'scaleY(0.4)' },\r\n '20%': { transform: 'scaleY(1)' },\r\n },\r\n },\r\n },\r\n },\r\n plugins: [],\r\n}\r\n\r\n// CSS 变量配置\r\nexport const cssVariables = `\r\n:root {\r\n --color-primary-50: #f5f3ff;\r\n --color-primary-100: #ede9fe;\r\n --color-primary-200: #ddd6fe;\r\n --color-primary-300: #c4b5fd;\r\n --color-primary-400: #a78bfa;\r\n --color-primary-500: #8b5cf6;\r\n --color-primary-600: #7c3aed;\r\n --color-primary-700: #6d28d9;\r\n --color-primary-800: #5b21b6;\r\n --color-primary-900: #4c1d95;\r\n \r\n --color-secondary-500: #06b6d4;\r\n --color-success-500: #10b981;\r\n --color-warning-500: #f59e0b;\r\n --color-error-500: #ef4444;\r\n \r\n --shadow-glow: 0 0 20px rgb(139 92 246 / 0.3);\r\n --shadow-glow-lg: 0 0 40px rgb(139 92 246 / 0.4);\r\n}\r\n`\r\n\r\n// 基础样式\r\nexport const baseStyles = `\r\n/* 动画类 */\r\n@keyframes shimmer {\r\n 0% { transform: translateX(-100%); }\r\n 100% { transform: translateX(100%); }\r\n}\r\n\r\n@keyframes bars {\r\n 0%, 40%, 100% { transform: scaleY(0.4); }\r\n 20% { transform: scaleY(1); }\r\n}\r\n\r\n.animate-shimmer {\r\n animation: shimmer 2s infinite;\r\n}\r\n\r\n/* Tailwind 动画扩展 */\r\n@keyframes fade-in {\r\n from { opacity: 0; }\r\n to { opacity: 1; }\r\n}\r\n\r\n@keyframes slide-in-from-top-2 {\r\n from { transform: translateY(-8px); }\r\n to { transform: translateY(0); }\r\n}\r\n\r\n@keyframes slide-in-from-right {\r\n from { transform: translateX(100%); }\r\n to { transform: translateX(0); }\r\n}\r\n\r\n@keyframes zoom-in-95 {\r\n from { transform: scale(0.95); }\r\n to { transform: scale(1); }\r\n}\r\n\r\n.animate-in {\r\n animation-duration: 150ms;\r\n animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\r\n animation-fill-mode: forwards;\r\n}\r\n\r\n.fade-in { animation-name: fade-in; }\r\n.slide-in-from-top-2 { animation-name: slide-in-from-top-2; }\r\n.slide-in-from-right { animation-name: slide-in-from-right; }\r\n.zoom-in-95 { animation-name: zoom-in-95; }\r\n`\r\n"],"names":["cn","inputs","classes","input","nested","key","value","Button","forwardRef","children","variant","size","fullWidth","loading","leftIcon","rightIcon","rounded","iconOnly","disabled","className","props","ref","baseStyles","variantStyles","sizeStyles","radiusStyles","LoadingSpinner","jsxs","jsx","Fragment","idCounter","useId","prefix","id","useState","useControllableState","controlledValue","defaultValue","onChange","uncontrolledValue","setUncontrolledValue","isControlled","setValue","useCallback","nextValue","newValue","useClickOutside","callback","useRef","useEffect","handleClick","event","useKeyboardNavigation","itemCount","onSelect","activeIndex","setActiveIndex","handleKeyDown","prev","useAnimation","isOpen","duration","shouldRender","setShouldRender","isAnimating","setIsAnimating","timer","useMediaQuery","query","matches","setMatches","media","listener","useCopyToClipboard","copied","setCopied","copy","text","useLocalStorage","initialValue","storedValue","setStoredValue","item","valueToStore","error","Input","label","helper","suffix","required","clearable","onClear","isFocused","setIsFocused","inputId","wrapperStyles","iconSizeStyles","ClearIcon","e","Card","title","subtitle","extra","footer","cover","hoverable","clickable","bordered","padding","paddingStyles","Select","options","placeholder","searchable","setIsOpen","search","setSearch","selectedValue","setSelectedValue","dropdownRef","inputRef","filteredOptions","option","selectedOption","opt","index","handleSelect","val","handleClear","ChevronIcon","CheckIcon","Checkbox","description","checked","defaultChecked","indeterminate","color","isChecked","setIsChecked","colorStyles","IndeterminateIcon","Switch","showIcons","onLabel","offLabel","CloseIcon","RadioGroupContext","createContext","RadioGroup","name","direction","groupName","Radio","itemDisabled","context","useContext","isDisabled","handleChange","Textarea","showCount","maxLength","autoSize","resize","rows","charCount","setCharCount","textareaRef","combinedRef","node","textarea","computedStyle","lineHeight","minRows","maxRows","scrollHeight","minHeight","maxHeight","resizeStyles","Dialog","visible","onVisibleChange","onClose","closable","maskClosable","centered","onOk","onCancel","okText","cancelText","showFooter","zIndex","dialogClassName","headerClassName","bodyClassName","footerClassName","handleClose","handleCancel","handleOk","handleMaskClick","createPortal","ToastContext","useToast","ToastProvider","position","maxToasts","toasts","setToasts","removeToast","t","addToast","newToast","toast","info","message","success","warning","positionStyles","ToastItemComponent","typeStyles","icons","styles","Alert","type","showIcon","action","setVisible","typeConfig","config","Progress","max","showLabel","labelPosition","circular","circleSize","percentage","getLabel","stripedClass","strokeWidth","radius","circumference","offset","gradientColors","Skeleton","width","height","animation","lines","getStyle","style","_","i","SkeletonCard","SkeletonAvatar","SkeletonButton","SkeletonTable","cols","j","Spinner","thickness","speed","sizeMap","speedStyles","sizePx","dotSize","barWidth","barHeight","Container","justify","align","gap","wrap","bg","center","gapStyles","gapValue","gapClass","justifyStyles","alignStyles","Divider","textPosition","thicknessStyles","textPositionStyles","getColorFromName","colors","hash","getInitials","words","Avatar","src","alt","shape","status","badge","icon","imgError","setImgError","fontSize","shapeStyles","actualColor","statusColors","showFallback","DefaultIcon","AvatarGroup","spacing","childArray","React","visibleChildren","remaining","child","Tag","iconSizes","TabsContext","Tabs","items","computedDefault","activeTab","setActiveTab","TabList","it","Tab","TabPanel","listRef","indicatorStyle","setIndicatorStyle","activeButton","isActive","Popover","content","placement","trigger","controlledVisible","delay","bgColor","arrow","maxWidth","minWidth","shouldShow","uncontrolledVisible","setUncontrolledVisible","v","triggerRef","popoverRef","timeoutRef","show","hide","setPosition","triggerRect","popoverRect","top","left","bgStyles","arrowStyles","arrowPosition","triggerProps","handleClickOutside","defaultTrigger","triggerElement","borderRadius","shadows","typography","animations","defaultTheme","componentDefinitions","getComponentDefinition","def","generateId","MAX_HISTORY_LENGTH","useDesignerHistory","initialNodes","history","setHistory","currentIndex","setCurrentIndex","isUpdatingRef","nodes","setNodes","updater","prevHistory","currentNodes","newNodes","newHistory","undo","redo","reset","instantiateTemplate","template","designTemplates","getTemplatesByCategory","category","getAllCategories","DialogPreviewWrapper","isDialogVisible","setIsDialogVisible","componentMap","getSafeProps","filtered","SafeComponentRenderer","Component","safeProps","ComponentDesigner","onExport","canUndo","canRedo","selectedId","setSelectedId","draggedType","setDraggedType","viewMode","setViewMode","leftPanel","setLeftPanel","selectedNode","useMemo","n","generatedCode","generateCode","addNode","definition","newNode","updated","updateNodeProps","deleteNode","clearAll","duplicateNode","moveNode","targetIndex","applyTemplate","handleExportCode","handleExportJson","json","handleImportJSON","jsonStr","imported","handleDragStart","handleDrop","groupedComponents","groups","groupedTemplates","cat","mode","panel","components","group","PropertyPanel","onUpdate","renderProperty","prop","imports","importStatement","renderNode","filteredProps","highlightCode","code","language","escapeHtml","CodeEditor","readOnly","showLineNumbers","theme","tabs","onTabChange","preRef","localValue","setLocalValue","handleScroll","start","end","lineCount","tab","tailwindConfig","cssVariables"],"mappings":"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"}
|