sa2kit 1.6.13 → 1.6.14

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.
Files changed (57) hide show
  1. package/dist/PMXParser-L6IWHL4I.mjs +4 -0
  2. package/dist/PMXParser-L6IWHL4I.mjs.map +1 -0
  3. package/dist/PMXParser-YBS3B6HM.js +13 -0
  4. package/dist/PMXParser-YBS3B6HM.js.map +1 -0
  5. package/dist/audioDetection/index.js.map +1 -1
  6. package/dist/audioDetection/index.mjs.map +1 -1
  7. package/dist/auth/index.js +3 -3
  8. package/dist/auth/index.mjs +1 -1
  9. package/dist/{chunk-FAHLZIYQ.js → chunk-5D7ZFZIM.js} +2 -2
  10. package/dist/{chunk-FAHLZIYQ.js.map → chunk-5D7ZFZIM.js.map} +1 -1
  11. package/dist/{chunk-G4AMEDO5.js → chunk-66EHKQVS.js} +2 -2
  12. package/dist/{chunk-G4AMEDO5.js.map → chunk-66EHKQVS.js.map} +1 -1
  13. package/dist/{chunk-CDK3DHKM.mjs → chunk-GGGTJETD.mjs} +3 -3
  14. package/dist/{chunk-CDK3DHKM.mjs.map → chunk-GGGTJETD.mjs.map} +1 -1
  15. package/dist/chunk-JZXJQMVE.js +363 -0
  16. package/dist/chunk-JZXJQMVE.js.map +1 -0
  17. package/dist/{chunk-2ODO4HEI.js → chunk-LFM5QSFW.js} +2 -2
  18. package/dist/{chunk-2ODO4HEI.js.map → chunk-LFM5QSFW.js.map} +1 -1
  19. package/dist/{chunk-ZYXF3L6T.mjs → chunk-MRGFYQTC.mjs} +2 -2
  20. package/dist/{chunk-ZYXF3L6T.mjs.map → chunk-MRGFYQTC.mjs.map} +1 -1
  21. package/dist/{chunk-ZCLAF3XN.mjs → chunk-TGL6BATG.mjs} +2 -2
  22. package/dist/{chunk-ZCLAF3XN.mjs.map → chunk-TGL6BATG.mjs.map} +1 -1
  23. package/dist/{chunk-L5PW2YTI.js → chunk-UUM5BIOU.js} +7 -7
  24. package/dist/{chunk-L5PW2YTI.js.map → chunk-UUM5BIOU.js.map} +1 -1
  25. package/dist/chunk-VRTRSEEH.mjs +361 -0
  26. package/dist/chunk-VRTRSEEH.mjs.map +1 -0
  27. package/dist/{chunk-6BZ3QFA5.mjs → chunk-VZFHU553.mjs} +2 -2
  28. package/dist/{chunk-6BZ3QFA5.mjs.map → chunk-VZFHU553.mjs.map} +1 -1
  29. package/dist/imageCrop/index.js.map +1 -1
  30. package/dist/imageCrop/index.mjs.map +1 -1
  31. package/dist/index.js +1 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/index.mjs +1 -1
  34. package/dist/index.mjs.map +1 -1
  35. package/dist/mmd/admin/index.d.mts +1 -1
  36. package/dist/mmd/admin/index.d.ts +1 -1
  37. package/dist/mmd/index.d.mts +753 -3
  38. package/dist/mmd/index.d.ts +753 -3
  39. package/dist/mmd/index.js +7542 -5841
  40. package/dist/mmd/index.js.map +1 -1
  41. package/dist/mmd/index.mjs +7453 -5776
  42. package/dist/mmd/index.mjs.map +1 -1
  43. package/dist/mmd/server/index.d.mts +1 -1
  44. package/dist/mmd/server/index.d.ts +1 -1
  45. package/dist/music/index.js +16 -16
  46. package/dist/music/index.mjs +2 -2
  47. package/dist/music/server/index.js +8 -8
  48. package/dist/music/server/index.mjs +1 -1
  49. package/dist/testYourself/admin/index.js +3 -3
  50. package/dist/testYourself/admin/index.mjs +1 -1
  51. package/dist/testYourself/index.js +7 -7
  52. package/dist/testYourself/index.js.map +1 -1
  53. package/dist/testYourself/index.mjs +2 -2
  54. package/dist/testYourself/index.mjs.map +1 -1
  55. package/dist/{types-BB-7_WtE.d.ts → types-HorDyIRv.d.mts} +50 -0
  56. package/dist/{types-BB-7_WtE.d.mts → types-HorDyIRv.d.ts} +50 -0
  57. package/package.json +19 -17
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ai/ocr/hooks/useOCR.ts","../src/ai/ocr/components/OCRScanner.tsx","../src/ai/background-removal/hooks/useBackgroundRemoval.ts","../src/ai/background-removal/components/BackgroundRemover.tsx","../src/ai/sentiment-analysis/hooks/useSentimentAnalysis.ts","../src/ai/sentiment-analysis/components/SentimentAnalyzer.tsx","../src/ai/text-generation/hooks/useTextGeneration.ts","../src/ai/text-generation/components/SmartAssistant.tsx","../src/profile/ProfileModal.tsx","../src/profile/internal/BadgeList.tsx","../src/profile/internal/Stat.tsx","../src/profile/internal/StatList.tsx","../src/profile/ProfileButton.tsx","../src/profile/AutoOpenModal.tsx","../src/profile/EnhancedAvatar.tsx","../src/portfolio/About.tsx","../src/portfolio/Contact.tsx","../src/portfolio/Home.tsx","../src/portfolio/ExperimentCard.tsx","../src/portfolio/ProjectCarousel.tsx","../src/navigation/NavigationItem.tsx","../src/navigation/Navigation.tsx","../src/navigation/NavigationToggle.tsx","../src/navigation/FloatingMenu.tsx","../src/navigation/FloatingMenuExample.tsx","../src/testField/utils/index.ts","../src/testField/components/CategoryFilter.tsx","../src/testField/components/CompletionFilter.tsx","../src/testField/components/PageHeader.tsx","../src/testField/components/ExperimentGrid.tsx","../src/testField/components/EmptyState.tsx","../src/testField/components/SortControl.tsx","../src/testField/components/SortModeToggle.tsx","../src/testField/components/SortableExperimentItem.tsx","../src/testField/components/DraggableExperimentGrid.tsx","../src/testField/components/PermissionGuard.tsx","../src/testField/components/UserInfoBar.tsx"],"names":["useState","useRef","useCallback","createWorker","useEffect","React","Upload","X","Loader2","FileText","Eraser","Download","Smile","Frown","Meh","MessageSquare","Send","Bot","User","cn","Dialog","DialogContent","Avatar","AvatarImage","AvatarFallback","Badge","Button","Timeline","CollisionBalls","Link","createPortal","FilterButtonGroup","BackButton","Grid","useSortable","CSS","useSensors","useSensor","PointerSensor","TouchSensor","KeyboardSensor","sortableKeyboardCoordinates","arrayMove","DndContext","closestCenter","SortableContext","rectSortingStrategy","useAuth","Shield","AlertTriangle","FlaskConical","LogOut"],"mappings":"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","file":"index.js","sourcesContent":["import { useState, useCallback, useRef, useEffect } from 'react';\nimport { createWorker, Worker } from 'tesseract.js';\nimport { OCRResult, OCROptions, OCRState } from '../types';\n\nexport const useOCR = (options: OCROptions = {}) => {\n const [state, setState] = useState<OCRState>({\n isProcessing: false,\n progress: 0,\n status: 'idle',\n error: null,\n result: null,\n });\n\n const workerRef = useRef<Worker | null>(null);\n\n const cleanup = useCallback(async () => {\n if (workerRef.current) {\n await workerRef.current.terminate();\n workerRef.current = null;\n }\n }, []);\n\n const recognize = useCallback(\n async (image: string | File | Blob | HTMLImageElement | HTMLCanvasElement) => {\n setState((prev) => ({\n ...prev,\n isProcessing: true,\n error: null,\n progress: 0,\n status: 'initializing',\n }));\n\n try {\n const worker = await createWorker(options.language || 'eng', 1, {\n logger: (m) => {\n if (m.status === 'recognizing text') {\n setState((prev) => ({\n ...prev,\n status: 'recognizing',\n progress: m.progress,\n }));\n }\n options.logger?.(m);\n },\n });\n\n workerRef.current = worker;\n\n const { data } = await worker.recognize(image);\n\n // In some versions of tesseract.js, words and lines are not directly on data\n // We extract them from blocks if needed\n const words = (data as any).words || data.blocks?.flatMap(b => b.paragraphs.flatMap(p => p.lines.flatMap(l => l.words))) || [];\n const lines = (data as any).lines || data.blocks?.flatMap(b => b.paragraphs.flatMap(p => p.lines)) || [];\n\n const result: OCRResult = {\n text: data.text,\n confidence: data.confidence,\n words: words.map((w: any) => ({\n text: w.text,\n confidence: w.confidence,\n bbox: w.bbox,\n })),\n lines: lines.map((l: any) => l.text),\n };\n\n setState((prev) => ({\n ...prev,\n isProcessing: false,\n progress: 1,\n status: 'completed',\n result,\n }));\n\n await worker.terminate();\n workerRef.current = null;\n\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setState((prev) => ({\n ...prev,\n isProcessing: false,\n status: 'error',\n error,\n }));\n throw error;\n }\n },\n [options]\n );\n\n useEffect(() => {\n return () => {\n cleanup();\n };\n }, [cleanup]);\n\n return {\n ...state,\n recognize,\n cleanup,\n };\n};\n\n\n\n\n","import React, { useState, useRef } from 'react';\nimport { useOCR } from '../hooks/useOCR';\nimport { Loader2, Upload, FileText, Image as ImageIcon, X } from 'lucide-react';\n\ninterface OCRScannerProps {\n onResult?: (text: string) => void;\n className?: string;\n language?: string;\n}\n\nexport const OCRScanner: React.FC<OCRScannerProps> = ({\n onResult,\n className = '',\n language = 'eng',\n}) => {\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n \n const { recognize, isProcessing, progress, status, result, error } = useOCR({\n language,\n });\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n // Create preview\n const reader = new FileReader();\n reader.onload = (event) => {\n setImagePreview(event.target?.result as string);\n };\n reader.readAsDataURL(file);\n\n try {\n const ocrResult = await recognize(file);\n onResult?.(ocrResult.text);\n } catch (err) {\n console.error('OCR Error:', err);\n }\n };\n\n const reset = () => {\n setImagePreview(null);\n if (fileInputRef.current) fileInputRef.current.value = '';\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n const handleDrop = async (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n \n const file = e.dataTransfer.files?.[0];\n if (file && file.type.startsWith('image/')) {\n const mockEvent = { target: { files: [file] } } as unknown as React.ChangeEvent<HTMLInputElement>;\n handleFileChange(mockEvent);\n }\n };\n\n return (\n <div \n className={`p-6 border-2 border-dashed rounded-xl transition-all ${\n isProcessing ? 'border-blue-400 bg-blue-50/10' : 'border-gray-200 hover:border-blue-400'\n } ${className}`}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {!imagePreview ? (\n <div \n className=\"flex flex-col items-center justify-center cursor-pointer space-y-4\"\n onClick={() => fileInputRef.current?.click()}\n >\n <div className=\"p-4 bg-blue-50 rounded-full text-blue-500\">\n <Upload size={32} />\n </div>\n <div className=\"text-center\">\n <p className=\"text-lg font-medium text-gray-700\">点击或拖拽图片进行 OCR 识别</p>\n <p className=\"text-sm text-gray-500\">支持 JPG, PNG, WebP</p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div className=\"relative group rounded-lg overflow-hidden border border-gray-200\">\n <img \n src={imagePreview} \n alt=\"Preview\" \n className={`max-h-64 mx-auto object-contain transition-opacity ${isProcessing ? 'opacity-50' : 'opacity-100'}`}\n />\n {!isProcessing && (\n <button \n onClick={reset}\n className=\"absolute top-2 right-2 p-1 bg-white/80 rounded-full hover:bg-white text-gray-600 shadow-sm\"\n >\n <X size={18} />\n </button>\n )}\n \n {isProcessing && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/5\">\n <Loader2 className=\"animate-spin text-blue-500 mb-2\" size={32} />\n <div className=\"w-48 bg-gray-200 rounded-full h-1.5 overflow-hidden\">\n <div \n className=\"bg-blue-500 h-full transition-all duration-300\"\n style={{ width: `${progress * 100}%` }}\n />\n </div>\n <p className=\"text-xs font-medium text-blue-600 mt-2\">\n {status === 'initializing' ? '正在加载引擎...' : `识别中 ${Math.round(progress * 100)}%`}\n </p>\n </div>\n )}\n </div>\n\n {result && !isProcessing && (\n <div className=\"bg-gray-50 p-4 rounded-lg border border-gray-100 animate-in fade-in slide-in-from-bottom-2\">\n <div className=\"flex items-center gap-2 mb-2 text-gray-600 font-medium\">\n <FileText size={18} />\n <span>识别结果 (置信度: {Math.round(result.confidence)}%)</span>\n </div>\n <pre className=\"text-sm text-gray-800 whitespace-pre-wrap font-sans\">\n {result.text}\n </pre>\n </div>\n )}\n\n {error && (\n <div className=\"p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100\">\n 识别失败: {error.message}\n </div>\n )}\n </div>\n )}\n\n <input\n type=\"file\"\n ref={fileInputRef}\n className=\"hidden\"\n accept=\"image/*\"\n onChange={handleFileChange}\n disabled={isProcessing}\n />\n </div>\n );\n};\n\n\n\n\n","import { useState, useCallback, useEffect } from 'react';\nimport { BackgroundRemovalOptions, BackgroundRemovalState } from '../types';\n\nexport const useBackgroundRemoval = (options: BackgroundRemovalOptions = {}) => {\n const [state, setState] = useState<BackgroundRemovalState>({\n isProcessing: false,\n progress: 0,\n status: 'idle',\n error: null,\n resultBlob: null,\n resultUrl: null,\n });\n\n const remove = useCallback(async (image: string | File | Blob | HTMLImageElement | URL) => {\n setState(prev => ({\n ...prev,\n isProcessing: true,\n error: null,\n progress: 0,\n status: 'initializing',\n }));\n\n try {\n const originalKeys = Object.keys;\n const win = (typeof window !== 'undefined' ? window : globalThis) as any;\n const originalProcess = win.process;\n let backgroundRemoval;\n\n try {\n // 环境盾牌:防止库初始化时 Object.keys(null) 崩溃\n (Object as any).keys = function(obj: any) {\n if (obj === null || obj === undefined) return [];\n return originalKeys.call(Object, obj);\n };\n\n if (typeof window !== 'undefined') {\n try {\n Object.defineProperty(win, 'process', {\n value: { env: {}, versions: {}, release: { name: 'node' } },\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n \n backgroundRemoval = await import('@imgly/background-removal');\n } finally {\n Object.keys = originalKeys;\n if (typeof window !== 'undefined' && originalProcess) {\n try {\n Object.defineProperty(win, 'process', {\n value: originalProcess,\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n }\n\n const { removeBackground } = backgroundRemoval;\n\n const config: any = {\n progress: (status: string, progress: number) => {\n setState(prev => ({\n ...prev,\n status,\n progress,\n }));\n options.progress?.(status, progress);\n },\n model: options.model || 'small',\n publicPath: options.publicPath,\n fetchArgs: options.fetchArgs,\n };\n\n const blob = await removeBackground(image, config);\n const url = URL.createObjectURL(blob);\n\n setState(prev => ({\n ...prev,\n isProcessing: false,\n progress: 1,\n status: 'completed',\n resultBlob: blob,\n resultUrl: url,\n }));\n\n return { blob, url };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error('AI Background Removal Error:', msg);\n setState(prev => ({\n ...prev,\n isProcessing: false,\n status: 'error',\n error: new Error(msg),\n }));\n throw err;\n }\n }, [options]);\n\n const cleanup = useCallback(() => {\n if (state.resultUrl) {\n URL.revokeObjectURL(state.resultUrl);\n }\n }, [state.resultUrl]);\n\n useEffect(() => {\n return () => cleanup();\n }, [cleanup]);\n\n return {\n ...state,\n remove,\n cleanup,\n };\n};\n","import React, { useState, useRef } from 'react';\nimport { useBackgroundRemoval } from '../hooks/useBackgroundRemoval';\nimport { Loader2, Upload, Download, Image as ImageIcon, X, Eraser } from 'lucide-react';\n\ninterface BackgroundRemoverProps {\n onResult?: (blob: Blob, url: string) => void;\n className?: string;\n}\n\nexport const BackgroundRemover: React.FC<BackgroundRemoverProps> = ({\n onResult,\n className = '',\n}) => {\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n \n const { remove, isProcessing, progress, status, resultUrl, error } = useBackgroundRemoval();\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n const reader = new FileReader();\n reader.onload = (event) => {\n setImagePreview(event.target?.result as string);\n };\n reader.readAsDataURL(file);\n\n try {\n const { blob, url } = await remove(file);\n onResult?.(blob, url);\n } catch (err) {\n console.error('Background Removal Error:', err);\n }\n };\n\n const reset = () => {\n setImagePreview(null);\n if (fileInputRef.current) fileInputRef.current.value = '';\n };\n\n const downloadResult = () => {\n if (!resultUrl) return;\n const a = document.createElement('a');\n a.href = resultUrl;\n a.download = 'removed_background.png';\n a.click();\n };\n\n return (\n <div className={`p-6 border-2 border-dashed rounded-xl transition-all ${\n isProcessing ? 'border-purple-400 bg-purple-50/10' : 'border-gray-200 hover:border-purple-400'\n } ${className}`}>\n {!imagePreview ? (\n <div \n className=\"flex flex-col items-center justify-center cursor-pointer space-y-4\"\n onClick={() => fileInputRef.current?.click()}\n >\n <div className=\"p-4 bg-purple-50 rounded-full text-purple-500\">\n <Eraser size={32} />\n </div>\n <div className=\"text-center\">\n <p className=\"text-lg font-medium text-gray-700\">上传图片移除背景</p>\n <p className=\"text-sm text-gray-500\">建议使用主体明确的图片</p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium text-gray-500 uppercase tracking-wider\">原图</p>\n <div className=\"relative rounded-lg overflow-hidden border border-gray-200 bg-gray-50\">\n <img src={imagePreview} alt=\"Original\" className=\"max-h-64 mx-auto object-contain\" />\n </div>\n </div>\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium text-gray-500 uppercase tracking-wider\">处理结果</p>\n <div className=\"relative rounded-lg overflow-hidden border border-gray-200 bg-grid-slate-100 bg-[size:20px_20px]\">\n {resultUrl ? (\n <img src={resultUrl} alt=\"Result\" className=\"max-h-64 mx-auto object-contain animate-in fade-in zoom-in-95 duration-500\" />\n ) : (\n <div className=\"h-64 flex flex-col items-center justify-center text-gray-400\">\n {isProcessing ? (\n <>\n <Loader2 className=\"animate-spin text-purple-500 mb-2\" size={32} />\n <div className=\"w-32 bg-gray-200 rounded-full h-1.5 overflow-hidden\">\n <div \n className=\"bg-purple-500 h-full transition-all duration-300\"\n style={{ width: `${progress * 100}%` }}\n />\n </div>\n <p className=\"text-[10px] mt-2 font-mono uppercase\">{status.replace(/-/g, ' ')}</p>\n </>\n ) : (\n <span className=\"text-sm italic\">等待处理...</span>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n\n <div className=\"flex justify-between items-center pt-2\">\n {!isProcessing && (\n <button \n onClick={reset}\n className=\"flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-600 hover:text-gray-900 transition-colors\"\n >\n <X size={16} />\n 重新开始\n </button>\n )}\n \n {resultUrl && !isProcessing && (\n <button \n onClick={downloadResult}\n className=\"flex items-center gap-2 px-6 py-2 bg-purple-600 hover:bg-purple-700 text-white rounded-lg shadow-sm transition-all\"\n >\n <Download size={16} />\n 下载 PNG\n </button>\n )}\n </div>\n\n {error && (\n <div className=\"p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100\">\n 处理失败: {error.message}\n </div>\n )}\n </div>\n )}\n\n <input\n type=\"file\"\n ref={fileInputRef}\n className=\"hidden\"\n accept=\"image/*\"\n onChange={handleFileChange}\n disabled={isProcessing}\n />\n </div>\n );\n};\n\n\n\n\n","import { useState, useCallback, useRef } from 'react';\nimport { SentimentResult, SentimentOptions, SentimentState } from '../types';\n\nexport const useSentimentAnalysis = (options: SentimentOptions = {}) => {\n const [state, setState] = useState<SentimentState>({\n isProcessing: false,\n status: 'idle',\n error: null,\n result: null,\n });\n\n const pipelineRef = useRef<any | null>(null);\n\n const analyze = useCallback(async (text: string) => {\n setState(prev => ({\n ...prev,\n isProcessing: true,\n error: null,\n status: 'loading model',\n }));\n\n try {\n if (!pipelineRef.current) {\n const originalKeys = Object.keys;\n const win = (typeof window !== 'undefined' ? window : globalThis) as any;\n const originalProcess = win.process;\n\n let transformers;\n try {\n (Object as any).keys = function(obj: any) {\n if (obj === null || obj === undefined) return [];\n return originalKeys.call(Object, obj);\n };\n if (typeof window !== 'undefined') {\n try {\n Object.defineProperty(win, 'process', {\n value: { env: {}, versions: {}, release: { name: 'node' }, nextTick: (cb: any) => setTimeout(cb, 0) },\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n transformers = await import('@xenova/transformers');\n } finally {\n Object.keys = originalKeys;\n if (typeof window !== 'undefined' && originalProcess) {\n try {\n Object.defineProperty(win, 'process', { value: originalProcess, configurable: true, writable: true });\n } catch (e) {}\n }\n }\n\n const { pipeline, env } = transformers;\n env.allowLocalModels = false;\n if (env.backends?.onnx) {\n env.backends.onnx.wasm.proxy = true;\n }\n\n const defaultModel = 'Xenova/distilbert-base-multilingual-cased-sentiments-student';\n \n pipelineRef.current = await pipeline('sentiment-analysis', options.model || defaultModel);\n }\n\n setState(prev => ({ ...prev, status: 'analyzing' }));\n \n const output = await pipelineRef.current(text);\n const resultData = output[0];\n\n const label = resultData.label.toLowerCase();\n let sentiment: 'positive' | 'negative' | 'neutral' = 'neutral';\n \n // 增强逻辑:针对中文常见消极词汇进行本地加权\n const negativeKeywords = ['累', '惨', '绝望', '难受', '伤心', '差', '坏', '糟', '不行'];\n const hasNegativeKeyword = negativeKeywords.some(k => text.includes(k));\n\n if (label.includes('positive') && !hasNegativeKeyword) {\n sentiment = 'positive';\n } else if (label.includes('negative') || label.includes('0') || hasNegativeKeyword) {\n sentiment = 'negative';\n }\n\n const result: SentimentResult = {\n label: resultData.label,\n score: resultData.score,\n sentiment,\n };\n\n setState(prev => ({\n ...prev,\n isProcessing: false,\n status: 'completed',\n result,\n }));\n\n return result;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error('AI Sentiment Error:', msg);\n setState(prev => ({ ...prev, isProcessing: false, status: 'error', error: new Error(msg) }));\n throw err;\n }\n }, [options.model]);\n\n return { ...state, analyze };\n};\n\n\n\n\n","import React, { useState } from 'react';\nimport { useSentimentAnalysis } from '../hooks/useSentimentAnalysis';\nimport { MessageSquare, Send, Loader2, Smile, Frown, Meh } from 'lucide-react';\n\ninterface SentimentAnalyzerProps {\n onResult?: (result: any) => void;\n className?: string;\n placeholder?: string;\n}\n\nexport const SentimentAnalyzer: React.FC<SentimentAnalyzerProps> = ({\n onResult,\n className = '',\n placeholder = '输入一段中文或英文,分析其情感倾向...',\n}) => {\n const [text, setText] = useState('');\n const { analyze, isProcessing, status, result, error } = useSentimentAnalysis();\n\n const handleAnalyze = async () => {\n if (!text.trim() || isProcessing) return;\n try {\n const res = await analyze(text);\n onResult?.(res);\n } catch (err) {\n console.error('Sentiment Analysis Error:', err);\n }\n };\n\n const getSentimentIcon = () => {\n if (!result) return null;\n switch (result.sentiment) {\n case 'positive': return <Smile className=\"text-green-500\" size={24} />;\n case 'negative': return <Frown className=\"text-red-500\" size={24} />;\n default: return <Meh className=\"text-yellow-500\" size={24} />;\n }\n };\n\n const getSentimentColor = () => {\n if (!result) return '';\n switch (result.sentiment) {\n case 'positive': return 'bg-green-50 border-green-200 text-green-700';\n case 'negative': return 'bg-red-50 border-red-200 text-red-700';\n default: return 'bg-yellow-50 border-yellow-200 text-yellow-700';\n }\n };\n\n return (\n <div className={`p-6 border rounded-xl bg-white dark:bg-gray-800 shadow-sm ${className}`}>\n <div className=\"flex items-center gap-2 mb-4 text-gray-700 dark:text-gray-300 font-medium\">\n <MessageSquare size={20} />\n <span>文本情感分析</span>\n </div>\n\n <div className=\"relative\">\n <textarea\n value={text}\n onChange={(e) => setText(e.target.value)}\n placeholder={placeholder}\n className=\"w-full h-32 p-4 bg-gray-50 dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all outline-none resize-none text-gray-800 dark:text-gray-200\"\n disabled={isProcessing}\n />\n <button\n onClick={handleAnalyze}\n disabled={!text.trim() || isProcessing}\n className=\"absolute bottom-3 right-3 p-2 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 text-white rounded-md transition-colors shadow-sm\"\n >\n {isProcessing ? <Loader2 className=\"animate-spin\" size={18} /> : <Send size={18} />}\n </button>\n </div>\n\n {isProcessing && (\n <div className=\"mt-4 flex items-center gap-2 text-sm text-blue-600 animate-pulse\">\n <Loader2 size={14} className=\"animate-spin\" />\n <span>正在分析 (首次运行将加载模型资源)...</span>\n </div>\n )}\n\n {result && !isProcessing && (\n <div className={`mt-4 p-4 border rounded-lg flex items-center gap-4 animate-in fade-in slide-in-from-top-2 ${getSentimentColor()}`}>\n <div className=\"p-2 bg-white rounded-full shadow-sm\">\n {getSentimentIcon()}\n </div>\n <div>\n <p className=\"font-bold text-lg capitalize\">{result.sentiment}</p>\n <p className=\"text-sm opacity-80\">\n 置信度: {(result.score * 100).toFixed(1)}% ({result.label})\n </p>\n </div>\n </div>\n )}\n\n {error && (\n <div className=\"mt-4 p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100\">\n 分析失败: {error.message}\n </div>\n )}\n </div>\n );\n};\n\n\n\n\n","import { useState, useCallback, useRef } from 'react';\nimport { TextGenerationOptions, TextGenerationState } from '../types';\n\nexport const useTextGeneration = (options: TextGenerationOptions = {}) => {\n const [state, setState] = useState<TextGenerationState>({\n isProcessing: false,\n status: 'idle',\n error: null,\n result: null,\n });\n\n const pipelineRef = useRef<any | null>(null);\n\n const generate = useCallback(async (prompt: string) => {\n console.log('[AI] Generating for prompt:', prompt);\n \n setState((prev: TextGenerationState) => ({\n ...prev,\n isProcessing: true,\n error: null,\n status: 'initializing',\n }));\n\n try {\n if (!pipelineRef.current) {\n const originalKeys = Object.keys;\n const win = (typeof window !== 'undefined' ? window : globalThis) as any;\n const originalProcess = win.process;\n\n let transformers;\n try {\n (Object as any).keys = function(obj: any) {\n if (obj === null || obj === undefined) return [];\n return originalKeys.call(Object, obj);\n };\n if (typeof window !== 'undefined') {\n try {\n Object.defineProperty(win, 'process', {\n value: { env: {}, versions: {}, release: { name: 'node' }, nextTick: (cb: any) => setTimeout(cb, 0), cwd: () => '/', browser: true },\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n transformers = await import('@xenova/transformers');\n } finally {\n Object.keys = originalKeys;\n if (typeof window !== 'undefined' && originalProcess) {\n try {\n Object.defineProperty(win, 'process', { value: originalProcess, configurable: true, writable: true });\n } catch (e) {}\n }\n }\n\n const { pipeline, env } = transformers;\n env.allowLocalModels = false;\n if (env.backends?.onnx) {\n env.backends.onnx.wasm.proxy = true;\n }\n\n const modelName = options.model || 'Xenova/LaMini-Flan-T5-77M';\n pipelineRef.current = await pipeline('text2text-generation', modelName, {\n progress_callback: (info: any) => {\n if (info.status === 'progress') {\n setState((prev: TextGenerationState) => ({ ...prev, status: `loading model: ${Math.round(info.progress)}%` }));\n }\n }\n });\n }\n\n setState((prev: TextGenerationState) => ({ ...prev, status: 'thinking' }));\n \n // 优化生成参数,使其对小模型更友好\n const output = await pipelineRef.current(prompt, {\n max_new_tokens: options.max_new_tokens || 64,\n temperature: options.temperature || 0.5, // 稍微提高温度\n do_sample: true, // 开启采样,避免空输出\n top_k: 50,\n repetition_penalty: 1.1,\n });\n\n const result = output[0].generated_text || '';\n console.log('[AI] Raw result:', result);\n\n setState((prev: TextGenerationState) => ({\n ...prev,\n isProcessing: false,\n status: 'completed',\n result,\n }));\n\n return result;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error('[AI] Error:', err);\n setState((prev: TextGenerationState) => ({ ...prev, isProcessing: false, status: 'error', error: new Error(msg) }));\n throw err;\n }\n }, [options.model, options.max_new_tokens, options.temperature]);\n\n return { ...state, generate };\n};\n\n\n","import React, { useState, useRef, useEffect } from 'react';\nimport { useTextGeneration } from '../hooks/useTextGeneration';\nimport { Bot, User, Send, Loader2 } from 'lucide-react';\n\ninterface SmartAssistantProps {\n className?: string;\n}\n\nexport const SmartAssistant: React.FC<SmartAssistantProps> = ({ className = '' }) => {\n const [input, setInput] = useState('');\n const [chatHistory, setChatHistory] = useState<Array<{ role: 'user' | 'assistant', content: string }>>([]);\n const scrollRef = useRef<HTMLDivElement>(null);\n \n const { generate, isProcessing: isGenerating, status: genStatus } = useTextGeneration();\n\n useEffect(() => {\n if (scrollRef.current) {\n scrollRef.current.scrollTop = scrollRef.current.scrollHeight;\n }\n }, [chatHistory, isGenerating]);\n\n const handleSend = async () => {\n if (!input.trim() || isGenerating) return;\n\n const userMessage = input.trim();\n setInput('');\n setChatHistory(prev => [...prev, { role: 'user', content: userMessage }]);\n\n // --- 1. 本地硬规则匹配 (意图识别) ---\n // 对于 77M 模型,某些固定回复由逻辑生成效果更好\n let finalContent = '';\n const lowerMessage = userMessage.toLowerCase();\n \n if (lowerMessage.includes('你好') || lowerMessage.includes('hello') || lowerMessage.includes('hi')) {\n finalContent = '你好呀!我是 sa2kit 的本地 AI 助手,很高兴能和你聊天。😊';\n } else if (lowerMessage.includes('谁') || lowerMessage.includes('who are you')) {\n finalContent = '我是一个完全运行在你浏览器本地的小型 AI 模型,我不需要服务器,非常保护你的隐私。';\n } else if (lowerMessage.includes('天气')) {\n finalContent = '虽然我看不见外面的阳光,但听你的语气,今天一定是个适合出门的好天气!☀️';\n } else if (lowerMessage.includes('累') || lowerMessage.includes('难过') || lowerMessage.includes('绝望')) {\n finalContent = '听起来你现在心情不太好... 抱抱你,我会一直在这里陪你聊天的。❤️';\n }\n\n // 如果命中了硬规则,直接显示并返回,不再调用模型\n if (finalContent) {\n // 模拟一点点思考时间,体验更自然\n setTimeout(() => {\n setChatHistory(prev => [...prev, { role: 'assistant', content: finalContent }]);\n }, 500);\n return;\n }\n\n // --- 2. 调用模型生成 (针对非固定意图) ---\n const prompt = `对话。\n人说:“${userMessage}”\nAI回应:“`;\n\n try {\n const response = await generate(prompt);\n \n // 深度清理模型输出\n let modelOutput = response\n .replace(/^AI回应:|^AI:|^Assistant:|^回答:|^答:|^Answer:/i, '')\n .replace(/[. ]*Positive[. ]*|[. ]*Negative[. ]*|[. ]*Neutral[. ]*/gi, '') // 拦截情绪单词\n .replace(/^[\"'“]|[\"'”]$/g, '') // 去掉引号\n .trim();\n\n // --- 3. 结果质量检查 (Recovery) ---\n // 如果模型返回包含大量英文、或者是废话、或者太短\n const isEnglishTrash = /[a-zA-Z]{5,}/.test(modelOutput) && !/[一-龥]/.test(modelOutput);\n const isTooShort = modelOutput.length < 1;\n\n if (isEnglishTrash || isTooShort) {\n console.warn('[AI] Model failure, triggering smart recovery. Raw was:', response);\n modelOutput = '嗯嗯,我正在听。关于“' + userMessage.slice(0, 6) + '...”,你还有什么想分享的吗?';\n }\n\n setChatHistory(prev => [...prev, { role: 'assistant', content: modelOutput }]);\n } catch (err) {\n setChatHistory(prev => [...prev, { role: 'assistant', content: '(本地模型思考过度,暂时休息中...)' }]);\n }\n };\n\n return (\n <div className={`flex flex-col h-[500px] bg-white dark:bg-gray-800 rounded-xl shadow-inner border border-gray-100 dark:border-gray-700 overflow-hidden ${className}`}>\n <div ref={scrollRef} className=\"flex-1 overflow-y-auto p-4 space-y-4 bg-gray-50/50 dark:bg-gray-900/50\">\n {chatHistory.length === 0 && (\n <div className=\"h-full flex flex-col items-center justify-center text-gray-400 space-y-2\">\n <Bot size={48} className=\"opacity-20\" />\n <p className=\"text-sm italic text-center px-8 text-gray-400 font-sans\">\n 你好!我是 100% 本地运行的 AI。<br/>\n 你可以和我聊聊天,我会尝试理解你的意思。\n </p>\n </div>\n )}\n {chatHistory.map((msg, i) => (\n <div key={i} className={`flex ${msg.role === 'user' ? 'justify-end' : 'justify-start'} animate-in fade-in slide-in-from-bottom-2`}>\n <div className={`flex gap-3 max-w-[85%] ${msg.role === 'user' ? 'flex-row-reverse' : ''}`}>\n <div className={`p-2 rounded-lg h-fit ${msg.role === 'user' ? 'bg-blue-100 text-blue-600' : 'bg-white dark:bg-gray-700 shadow-sm border border-gray-100 dark:border-gray-600 text-gray-400'}`}>\n {msg.role === 'user' ? <User size={18} /> : <Bot size={18} />}\n </div>\n <div className={`p-3 rounded-2xl shadow-sm text-sm ${\n msg.role === 'user' \n ? 'bg-blue-600 text-white rounded-tr-none' \n : 'bg-white dark:bg-gray-700 text-gray-800 dark:text-gray-200 rounded-tl-none border border-gray-100 dark:border-gray-600 leading-relaxed'\n }`}>\n {msg.content}\n </div>\n </div>\n </div>\n ))}\n {isGenerating && (\n <div className=\"flex justify-start\">\n <div className=\"flex gap-3 items-center bg-white dark:bg-gray-700 p-3 rounded-2xl rounded-tl-none border border-gray-100 dark:border-gray-600\">\n <Loader2 className=\"animate-spin text-blue-500\" size={16} />\n <div className=\"flex flex-col\">\n <span className=\"text-xs text-gray-500 font-medium\">思考中...</span>\n <span className=\"text-[10px] text-blue-400 font-mono tracking-tighter\">{genStatus}</span>\n </div>\n </div>\n </div>\n )}\n </div>\n\n <div className=\"p-4 bg-white dark:bg-gray-800 border-t border-gray-100 dark:border-gray-700\">\n <div className=\"relative flex items-center gap-2\">\n <input\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && handleSend()}\n placeholder=\"输入文字...\"\n className=\"flex-1 bg-gray-50 dark:bg-gray-900 border-none rounded-full px-5 py-3 pr-12 text-sm focus:ring-2 focus:ring-blue-500 outline-none dark:text-white text-gray-800\"\n disabled={isGenerating}\n />\n <button\n onClick={handleSend}\n disabled={!input.trim() || isGenerating}\n className=\"absolute right-1 p-2.5 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 text-white rounded-full transition-all shadow-md active:scale-95 flex items-center justify-center\"\n >\n <Send size={18} />\n </button>\n </div>\n </div>\n </div>\n );\n};\n\n\n\n\n","'use client';\n\nimport React from 'react';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from '@/components/Dialog';\nimport { Avatar, AvatarImage, AvatarFallback } from '@/components/Avatar';\nimport { ProfileData, SocialLink } from './types';\nimport { cn } from '@/utils';\n\nconst themeStyles = {\n light: \"\",\n dark: \"bg-[#222] text-[#eee] border-[#444]\",\n blue: \"bg-[#f0f8ff] border-[#1890ff]/20\",\n};\n\nexport interface ProfileModalProps {\n isOpen: boolean;\n onClose: () => void;\n data: ProfileData;\n showAvatar?: boolean;\n showContacts?: boolean;\n showSocial?: boolean;\n showBio?: boolean;\n avatarSize?: number;\n onAvatarClick?: () => void;\n onSocialLinkClick?: (url: string, type: string) => void;\n onContactClick?: (type: string, value: string) => void;\n themeName?: 'light' | 'dark' | 'blue';\n className?: string;\n children?: React.ReactNode;\n}\n\nexport const ProfileModal: React.FC<ProfileModalProps> = ({\n isOpen,\n onClose,\n data,\n showAvatar = true,\n showContacts = true,\n showSocial = true,\n showBio = true,\n avatarSize = 80,\n onAvatarClick,\n onSocialLinkClick,\n onContactClick,\n themeName = 'light',\n className,\n}) => {\n // 渲染社交媒体链接\n const renderSocialLinks = () => {\n if (!data.socialLinks || data.socialLinks.length === 0) return null;\n return (\n <div className=\"flex gap-3 mt-2\">\n {data.socialLinks.map((link: SocialLink, index: number) => (\n <a\n key={index}\n href={link.url}\n className={cn(\n \"w-8 h-8 flex items-center justify-center rounded-full no-underline transition-all hover:-translate-y-0.5\",\n themeName === 'dark' ? \"bg-gray-800 text-gray-200 hover:bg-gray-700\" : \"bg-gray-100 text-gray-800 hover:bg-gray-200\"\n )}\n title={link.type}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(e) => {\n if (onSocialLinkClick) {\n e.preventDefault();\n onSocialLinkClick(link.url, link.type);\n }\n }}\n >\n {link.icon ? (\n <span className=\"text-base\">{link.icon}</span>\n ) : (\n <span className=\"text-[10px] font-semibold\">{link.type}</span>\n )}\n </a>\n ))}\n </div>\n );\n };\n\n // 渲染联系方式\n const renderContacts = () => {\n if (!data.contacts || Object.keys(data.contacts).length === 0) return null;\n return (\n <div className={cn(\n \"mt-4 border-t pt-4\",\n themeName === 'dark' ? \"border-gray-800\" : \"border-gray-100\"\n )}>\n {Object.entries(data.contacts).map(([type, value], index) => (\n <div \n key={index} \n className={cn(\n \"flex mb-2 cursor-pointer py-1.5 px-2 rounded transition-colors\",\n themeName === 'dark' ? \"hover:bg-gray-800\" : \"hover:bg-gray-50\"\n )}\n onClick={() => onContactClick && onContactClick(type, value)}\n >\n <span className={cn(\n \"font-medium w-[70px] shrink-0\",\n themeName === 'dark' ? \"text-gray-400\" : \"text-gray-500\"\n )}>{type}:</span>\n <span className={themeName === 'dark' ? \"text-gray-200\" : \"text-gray-800\"}>{value}</span>\n </div>\n ))}\n </div>\n );\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open: boolean) => !open && onClose()}>\n <DialogContent className={cn(\n \"sm:max-w-[500px] p-0 overflow-hidden border-none shadow-2xl\",\n themeStyles[themeName as keyof typeof themeStyles] || \"\",\n className\n )}>\n <div className=\"p-6\">\n <div className=\"flex gap-5 mb-5\">\n {showAvatar && (\n <div \n className=\"shrink-0\"\n onClick={onAvatarClick}\n style={{ cursor: onAvatarClick ? 'pointer' : 'default' }}\n >\n <Avatar className=\"border-2 border-primary/10 shadow-sm\" style={{ width: avatarSize, height: avatarSize }}>\n {data.avatar && <AvatarImage src={data.avatar} alt={data.name} className=\"object-cover\" />}\n <AvatarFallback className=\"text-xl\">\n {data.name.substring(0, 2).toUpperCase()}\n </AvatarFallback>\n </Avatar>\n </div>\n )}\n <div className=\"flex-1 min-w-0 flex flex-col justify-center\">\n <h2 className={cn(\n \"text-2xl font-bold m-0 mb-1\",\n themeName === 'dark' ? \"text-white\" : \"text-gray-900\"\n )}>{data.name}</h2>\n {data.title && <div className={cn(\n \"text-sm mb-2\",\n themeName === 'dark' ? \"text-gray-400\" : \"text-gray-500\"\n )}>{data.title}</div>}\n {showSocial && renderSocialLinks()}\n </div>\n </div>\n \n {showBio && data.bio && (\n <div className={cn(\n \"mb-5 leading-relaxed text-sm\",\n themeName === 'dark' ? \"text-gray-300\" : \"text-gray-600\"\n )}>\n <p>{data.bio}</p>\n </div>\n )}\n \n {showContacts && renderContacts()}\n \n {data.customContent && (\n <div className=\"mt-5\">\n {data.customContent}\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport default ProfileModal;\n","import React from 'react';\nimport { Badge } from '@/components/Badge';\nimport { cn } from '@/utils';\nimport { BadgeType } from '../types';\n \ninterface BadgeListProps {\n badges: BadgeType[];\n className?: string;\n}\n\nexport const BadgeList: React.FC<BadgeListProps> = ({\n badges,\n className = '',\n}) => {\n if (!badges || badges.length === 0) return null;\n\n return (\n <div className={cn(\"flex flex-wrap gap-2 mt-4\", className)}>\n {badges.map((badge, index) => (\n <Badge \n key={index} \n variant={badge.type === 'default' ? 'default' : (badge.type as any)}\n >\n {badge.icon && <span className=\"mr-1\">{badge.icon}</span>}\n {badge.label}\n </Badge>\n ))}\n </div>\n );\n};\n","import { StatType } from '..';\nimport { cn } from '@/utils';\n\ninterface StatProps extends StatType {\n className?: string;\n}\n\nexport const Stat: React.FC<StatProps> = ({\n label,\n value,\n icon,\n className = '',\n}) => {\n return (\n <div className={cn(\"flex flex-col items-center flex-1 text-center\", className)}>\n {icon && <span className=\"mb-2 text-2xl text-gray-400\">{icon}</span>}\n <div>\n <div className=\"text-lg font-semibold text-gray-800\">{value}</div>\n <div className=\"text-xs text-gray-400 mt-1\">{label}</div>\n </div>\n </div>\n );\n};\n","import { StatType } from \"..\";\nimport { Stat } from \"./Stat\";\nimport { cn } from '@/utils';\n\ninterface StatListProps {\n stats: StatType[];\n className?: string;\n}\n\nexport const StatList: React.FC<StatListProps> = ({\n stats,\n className = '',\n}) => {\n if (!stats || stats.length === 0) return null;\n\n return (\n <div className={cn(\"flex justify-between mt-4 pt-4 border-t border-gray-100\", className)}>\n {stats.map((stat, index) => (\n <Stat key={index} {...stat} />\n ))}\n </div>\n );\n}; ","'use client';\n\nimport React, { useState } from 'react';\nimport ProfileModal from './ProfileModal';\nimport { ProfileData } from './types';\nimport { BadgeList } from './internal/BadgeList';\nimport { StatList } from './internal/StatList';\nimport { Button } from '@/components/Button';\n\n// 示例数据\nconst exampleProfileData: ProfileData = {\n name: '张三',\n avatar: 'https://randomuser.me/api/portraits/men/32.jpg',\n title: '高级前端工程师',\n bio: '专注于React和Next.js开发的前端工程师,有5年工作经验。热爱开源,喜欢分享技术经验。',\n contacts: {\n '邮箱': 'zhangsan@example.com',\n '电话': '138-8888-8888',\n '地址': '上海市浦东新区',\n },\n socialLinks: [\n { type: 'GitHub', url: 'https://github.com/zhangsan', icon: '★' },\n { type: 'Twitter', url: 'https://twitter.com/zhangsan', icon: '✦' },\n { type: 'LinkedIn', url: 'https://linkedin.com/in/zhangsan', icon: '✪' },\n ],\n badges: [\n { label: 'React', type: 'primary' },\n { label: 'Next.js', type: 'success' },\n { label: 'TypeScript', type: 'info' },\n { label: 'CSS', type: 'default' },\n ],\n stats: [\n { label: '项目', value: 42 },\n { label: '粉丝', value: 1024 },\n { label: '评分', value: '4.9' },\n ],\n customContent: (\n <div className=\"mt-5 border-t border-gray-100 pt-4\">\n <h3 className=\"text-sm font-semibold mb-2\">专业技能</h3>\n <p className=\"text-sm text-gray-600 leading-relaxed\">\n 精通React、Vue、Angular等前端框架,熟悉TypeScript、JavaScript、CSS3、HTML5等前端技术。\n 有丰富的大型项目开发经验,能独立负责前端架构设计。\n </p>\n </div>\n ),\n};\n\nexport interface ProfileButtonProps {\n data?: ProfileData;\n buttonText?: string;\n variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';\n size?: 'default' | 'sm' | 'lg' | 'icon';\n className?: string;\n modalTheme?: 'light' | 'dark' | 'blue';\n}\n\n/**\n * 个人信息按钮组件,点击后显示个人信息弹窗\n */\nexport const ProfileButton: React.FC<ProfileButtonProps> = ({\n data = exampleProfileData,\n buttonText = '查看个人信息',\n variant = 'default',\n size = 'default',\n className = '',\n modalTheme = 'light',\n}) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const openModal = () => setIsModalOpen(true);\n const closeModal = () => setIsModalOpen(false);\n\n const handleContactClick = (type: string, value: string) => {\n if (type === '邮箱') {\n window.open(`mailto:${value}`);\n } else if (type === '电话') {\n window.open(`tel:${value}`);\n }\n };\n\n return (\n <>\n <Button \n variant={variant}\n size={size}\n onClick={openModal} \n className={className}\n >\n {buttonText}\n </Button>\n\n <ProfileModal\n isOpen={isModalOpen}\n onClose={closeModal}\n data={data}\n themeName={modalTheme}\n onContactClick={handleContactClick}\n onSocialLinkClick={(url) => window.open(url, '_blank')}\n >\n {data.customContent}\n {data.badges && <BadgeList badges={data.badges} />}\n {data.stats && <StatList stats={data.stats} />}\n </ProfileModal>\n </>\n );\n};\n\nexport default ProfileButton;\n","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport ProfileModal from './ProfileModal';\nimport { ProfileData } from './types';\nimport { BadgeList } from './internal/BadgeList';\nimport { StatList } from './internal/StatList';\n\nexport interface AutoOpenModalProps {\n data: ProfileData;\n delay?: number; // 延迟显示时间(毫秒)\n themeName?: 'light' | 'dark' | 'blue';\n onClose?: () => void;\n}\n\n/**\n * 自动打开个人信息弹窗组件\n * 页面加载后自动显示弹窗\n */\nexport const AutoOpenModal: React.FC<AutoOpenModalProps> = ({\n data,\n delay = 500, // 默认延迟500毫秒\n themeName = 'light',\n onClose,\n}) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n // 页面加载后自动显示弹窗\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsModalOpen(true);\n }, delay);\n\n return () => clearTimeout(timer);\n }, [delay]);\n\n const handleClose = () => {\n setIsModalOpen(false);\n if (onClose) {\n onClose();\n }\n };\n\n const handleContactClick = (type: string, value: string) => {\n if (type === '邮箱') {\n window.open(`mailto:${value}`);\n } else if (type === '电话') {\n window.open(`tel:${value}`);\n }\n };\n\n return (\n <ProfileModal\n isOpen={isModalOpen}\n onClose={handleClose}\n data={data}\n themeName={themeName}\n onContactClick={handleContactClick}\n onSocialLinkClick={(url) => window.open(url, '_blank')}\n >\n {data.badges && <BadgeList badges={data.badges} />}\n {data.stats && <StatList stats={data.stats} />}\n </ProfileModal>\n );\n};\n\nexport default AutoOpenModal;\n","'use client';\n\nimport React from 'react';\nimport { Avatar, AvatarImage, AvatarFallback } from '@/components/Avatar';\nimport { cn } from '@/utils';\n\nexport interface EnhancedAvatarProps {\n src?: string;\n name?: string;\n size?: 'small' | 'medium' | 'large' | number;\n mood?: 'online' | 'offline' | 'away';\n statusText?: string;\n onClick?: () => void;\n className?: string;\n}\n\nconst sizeMap = {\n small: 'h-8 w-8',\n medium: 'h-12 w-12',\n large: 'h-16 w-16',\n};\n\nconst moodColors = {\n online: 'bg-green-500',\n offline: 'bg-gray-500',\n away: 'bg-yellow-500',\n};\n\nexport const EnhancedAvatar: React.FC<EnhancedAvatarProps> = ({\n src,\n name,\n size = 'medium',\n mood = 'online',\n statusText,\n onClick,\n className,\n}) => {\n const sizeClass = typeof size === 'string' ? sizeMap[size] : '';\n const customSizeStyle = typeof size === 'number' ? { width: size, height: size } : {};\n\n return (\n <div className={cn(\"relative inline-block\", className)} onClick={onClick}>\n <Avatar className={cn(sizeClass, onClick && \"cursor-pointer hover:ring-2 hover:ring-blue-500 transition-all\")} style={customSizeStyle}>\n {src && <AvatarImage src={src} alt={name || \"Avatar\"} className=\"object-cover\" />}\n <AvatarFallback className=\"bg-primary/10 text-primary-foreground\">\n {name ? name.substring(0, 2).toUpperCase() : '??'}\n </AvatarFallback>\n </Avatar>\n \n {mood && (\n <div\n className={cn(\n \"absolute bottom-0 right-0 rounded-full border-2 border-white\",\n moodColors[mood],\n typeof size === 'number' ? (size > 60 ? 'h-4 w-4' : 'h-3 w-3') : (size === 'large' ? 'h-4 w-4' : 'h-3 w-3')\n )}\n />\n )}\n \n {statusText && (\n <div className=\"absolute -bottom-6 left-1/2 transform -translate-x-1/2 whitespace-nowrap\">\n <span className=\"text-xs text-muted-foreground\">{statusText}</span>\n </div>\n )}\n </div>\n );\n};\n\nexport default EnhancedAvatar;\n","'use client';\n\nimport React from \"react\";\n\nimport { CollisionBalls, Timeline } from \"@/components\";\nimport type { TimelineConfig, CollisionBallsConfig } from \"@/components\";\n\ninterface AboutProps {\n timelineConfig: TimelineConfig;\n collisionBallsConfig: CollisionBallsConfig;\n}\n\nconst About: React.FC<AboutProps> = ({\n timelineConfig,\n collisionBallsConfig,\n}) => {\n return (\n <section id=\"about\" className=\"py-16 bg-white\">\n <div className=\"container mx-auto px-4\">\n <h2 className=\"text-3xl font-bold text-center mb-12\">关于我</h2>\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-12\">\n <div className=\"bg-white rounded-lg shadow-lg p-6\">\n <h3 className=\"text-2xl font-semibold mb-6\">个人经历</h3>\n <Timeline items={timelineConfig.items} />\n </div>\n <div className=\"bg-white rounded-lg shadow-lg p-6\">\n <h3 className=\"text-2xl font-semibold mb-6\">技能展示</h3>\n <div style={{ height: '400px', position: 'relative' }}>\n <CollisionBalls collisionBallsConfig={collisionBallsConfig} />\n </div>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default About;\n","'use client';\n\nimport React, { useState } from 'react';\n\ninterface FormData {\n name: string;\n email: string;\n message: string;\n}\n\nconst Contact: React.FC = () => {\n const [formData, setFormData] = useState<FormData>({\n name: '',\n email: '',\n message: ''\n });\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitStatus, setSubmitStatus] = useState<'idle' | 'success' | 'error'>('idle');\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const { name, value } = e.target;\n setFormData(prev => ({\n ...prev,\n [name]: value\n }));\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setIsSubmitting(true);\n setSubmitStatus('idle');\n\n try {\n // 这里添加你的表单提交逻辑\n await new Promise(resolve => setTimeout(resolve, 1000)); // 模拟API调用\n setSubmitStatus('success');\n setFormData({ name: '', email: '', message: '' });\n } catch (error) {\n setSubmitStatus('error');\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <section id=\"contact\" className=\"py-16 bg-gray-50\">\n <div className=\"max-w-4xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"text-center mb-12\">\n <h2 className=\"text-3xl font-bold text-gray-900 sm:text-4xl\">\n 联系我\n </h2>\n <p className=\"mt-4 text-lg text-gray-600\">\n 有任何问题或建议?请随时联系我\n </p>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-xl p-6 sm:p-8\">\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n <div>\n <label htmlFor=\"name\" className=\"block text-sm font-medium text-gray-700\">\n 姓名\n </label>\n <input\n type=\"text\"\n name=\"name\"\n id=\"name\"\n value={formData.name}\n onChange={handleChange}\n required\n className=\"mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm\"\n placeholder=\"请输入您的姓名\"\n />\n </div>\n\n <div>\n <label htmlFor=\"email\" className=\"block text-sm font-medium text-gray-700\">\n 邮箱\n </label>\n <input\n type=\"email\"\n name=\"email\"\n id=\"email\"\n value={formData.email}\n onChange={handleChange}\n required\n className=\"mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm\"\n placeholder=\"请输入您的邮箱\"\n />\n </div>\n\n <div>\n <label htmlFor=\"message\" className=\"block text-sm font-medium text-gray-700\">\n 消息\n </label>\n <textarea\n name=\"message\"\n id=\"message\"\n rows={4}\n value={formData.message}\n onChange={handleChange}\n required\n className=\"mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm\"\n placeholder=\"请输入您的消息\"\n />\n </div>\n\n <div className=\"flex items-center justify-end\">\n <button\n type=\"submit\"\n disabled={isSubmitting}\n className={`inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white \n ${isSubmitting \n ? 'bg-blue-400 cursor-not-allowed' \n : 'bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500'\n }`}\n >\n {isSubmitting ? '发送中...' : '发送消息'}\n </button>\n </div>\n\n {submitStatus === 'success' && (\n <div className=\"rounded-md bg-green-50 p-4\">\n <div className=\"flex\">\n <div className=\"flex-shrink-0\">\n <svg className=\"h-5 w-5 text-green-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <div className=\"ml-3\">\n <p className=\"text-sm font-medium text-green-800\">\n 消息已成功发送!\n </p>\n </div>\n </div>\n </div>\n )}\n\n {submitStatus === 'error' && (\n <div className=\"rounded-md bg-red-50 p-4\">\n <div className=\"flex\">\n <div className=\"flex-shrink-0\">\n <svg className=\"h-5 w-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <div className=\"ml-3\">\n <p className=\"text-sm font-medium text-red-800\">\n 发送失败,请稍后重试\n </p>\n </div>\n </div>\n </div>\n )}\n </form>\n </div>\n\n {/* 联系方式 */}\n <div className=\"mt-12 grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3\">\n <div className=\"bg-white rounded-lg shadow-lg p-6 text-center\">\n <div className=\"text-blue-600 mb-4\">\n <svg className=\"h-8 w-8 mx-auto\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\" />\n </svg>\n </div>\n <h3 className=\"text-lg font-medium text-gray-900\">邮箱</h3>\n <p className=\"mt-2 text-gray-600\">your.email@example.com</p>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-lg p-6 text-center\">\n <div className=\"text-blue-600 mb-4\">\n <svg className=\"h-8 w-8 mx-auto\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z\" />\n </svg>\n </div>\n <h3 className=\"text-lg font-medium text-gray-900\">电话</h3>\n <p className=\"mt-2 text-gray-600\">+86 123 4567 8900</p>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-lg p-6 text-center\">\n <div className=\"text-blue-600 mb-4\">\n <svg className=\"h-8 w-8 mx-auto\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </div>\n <h3 className=\"text-lg font-medium text-gray-900\">地址</h3>\n <p className=\"mt-2 text-gray-600\">中国,北京</p>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default Contact; ","'use client';\n\nimport React, { useEffect, useState } from \"react\";\nimport { cn } from '@/utils';\n\nexport interface HomeConfig {\n title: string;\n subtitle: string;\n buttons: Array<{\n text: string;\n link: string;\n }>;\n imageSrc: string;\n}\n\ninterface HomeProps {\n homeConfig: HomeConfig;\n className?: string;\n}\n\nexport const Home: React.FC<HomeProps> = ({ homeConfig, className }) => {\n const { title, subtitle, buttons, imageSrc } = homeConfig;\n const [displayText, setDisplayText] = useState(\"\");\n const [currentIndex, setCurrentIndex] = useState(0);\n\n useEffect(() => {\n if (currentIndex < title.length) {\n const timer = setTimeout(() => {\n setDisplayText((prev) => prev + title[currentIndex]);\n setCurrentIndex((prev) => prev + 1);\n }, 150);\n\n return () => clearTimeout(timer);\n }\n return () => {\n setDisplayText(\"\");\n setCurrentIndex(0);\n };\n }, [currentIndex, title]);\n\n return (\n <section \n id=\"home\" \n className={cn(\"min-h-screen flex items-center justify-center py-16 bg-gradient-to-b from-white to-gray-50\", className)}\n >\n <div className=\"container mx-auto px-4\">\n <div className=\"flex flex-col md:flex-row items-center gap-12\">\n <div className=\"flex-1 text-center md:text-left\">\n <h1 className=\"text-4xl md:text-6xl font-bold mb-6 text-gray-900\">\n <span className=\"inline-block\">{displayText}</span>\n <span className=\"animate-pulse ml-1 text-blue-500\">|</span>\n </h1>\n <p className=\"text-xl md:text-2xl text-gray-600 mb-8\">{subtitle}</p>\n <div className=\"flex flex-wrap gap-4 justify-center md:justify-start\">\n {buttons.map((button) => (\n <a\n key={button.link}\n href={button.link}\n className=\"px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-all duration-300 shadow-md hover:shadow-lg font-medium\"\n >\n {button.text}\n </a>\n ))}\n </div>\n </div>\n <div className=\"flex-1\">\n <div className=\"relative group\">\n <div className=\"absolute -inset-1 bg-gradient-to-r from-blue-600 to-purple-600 rounded-lg blur opacity-25 group-hover:opacity-50 transition duration-1000 group-hover:duration-200\"></div>\n <img\n src={imageSrc}\n alt=\"Profile\"\n className=\"relative w-full max-w-md mx-auto rounded-lg shadow-xl transform hover:scale-[1.02] transition-transform duration-300 bg-white\"\n />\n </div>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default Home;\n\n","'use client';\n\nimport React from 'react';\nimport Link from 'next/link';\nimport { cn } from '@/utils';\n\nexport interface ExperimentCardProps {\n href: string;\n title: string;\n description: string;\n tags: string[];\n category: 'utility' | 'leisure';\n isCompleted?: boolean;\n updatedAt?: string;\n createdAt?: string;\n className?: string;\n}\n\nexport const ExperimentCard: React.FC<ExperimentCardProps> = ({ \n href, \n title, \n description, \n tags, \n category, \n isCompleted,\n updatedAt,\n createdAt,\n className\n}) => {\n // 格式化日期显示\n const formatDate = (dateString?: string) => {\n if (!dateString) return '';\n \n try {\n const date = new Date(dateString);\n return date.toLocaleDateString('zh-CN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n });\n } catch (e) {\n return dateString;\n }\n };\n \n return (\n <Link href={href} className={cn(\"block group\", className)}>\n <div className=\"w-full h-full bg-white rounded-2xl overflow-hidden shadow-md hover:shadow-2xl transition-all duration-300 transform group-hover:-translate-y-1 border border-gray-100 hover:border-gray-200\">\n <div className=\"p-6\">\n <div className=\"flex items-start justify-between mb-4\">\n <h3 className=\"text-xl font-semibold text-gray-900 flex-1 pr-4 leading-tight\">\n {title}\n </h3>\n <div className=\"flex flex-col gap-2 flex-shrink-0\">\n <span className={cn(\n \"px-3 py-1.5 text-xs font-medium rounded-full shadow-sm\",\n category === 'utility' \n ? 'bg-gradient-to-r from-green-50 to-green-100 text-green-700 border border-green-200' \n : 'bg-gradient-to-r from-purple-50 to-purple-100 text-purple-700 border border-purple-200'\n )}>\n {category === 'utility' ? '🔧 实用工具' : '🎮 休闲娱乐'}\n </span>\n <span className={cn(\n \"px-3 py-1.5 text-xs font-medium rounded-full shadow-sm border\",\n isCompleted \n ? 'bg-gradient-to-r from-emerald-50 to-emerald-100 text-emerald-700 border border-emerald-200' \n : 'bg-gradient-to-r from-orange-50 to-orange-100 text-orange-700 border border-orange-200'\n )}>\n {isCompleted ? '✅ 已完成' : '🚧 进行中'}\n </span>\n </div>\n </div>\n <p className=\"text-gray-600 mb-4\">{description}</p>\n \n {/* 显示更新时间 */}\n {updatedAt && (\n <div className=\"flex items-center gap-1 mb-3 text-xs text-gray-500\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span>更新于: {formatDate(updatedAt)}</span>\n {createdAt && createdAt !== updatedAt && (\n <span className=\"ml-2 text-gray-400\">创建于: {formatDate(createdAt)}</span>\n )}\n </div>\n )}\n \n <div className=\"flex flex-wrap gap-2\">\n {tags.map((tag) => (\n <span\n key={tag}\n className=\"px-3 py-1.5 text-xs font-medium bg-gradient-to-r from-gray-50 to-gray-100 text-gray-700 rounded-full border border-gray-200 shadow-sm hover:shadow-md transition-shadow duration-200\"\n >\n #{tag}\n </span>\n ))}\n </div>\n </div>\n </div>\n </Link>\n );\n};\n\nexport default ExperimentCard;\n\n","'use client';\n\nimport React, { useState } from 'react';\nimport { ExperimentCard } from './ExperimentCard';\nimport { cn } from '@/utils';\n\n// Project相关的类型定义\nexport interface Project {\n id: string;\n title: string;\n description: string;\n image: string;\n link?: string;\n tags: string[];\n}\n\nexport interface ProjectsConfig {\n projects: Project[];\n}\n\ninterface ProjectCarouselProps {\n projects: Project[];\n className?: string;\n}\n\nexport const ProjectCarousel: React.FC<ProjectCarouselProps> = ({ projects, className }) => {\n const [currentIndex, setCurrentIndex] = useState(0);\n\n const nextSlide = () => {\n setCurrentIndex((prevIndex) =>\n prevIndex === projects.length - 1 ? 0 : prevIndex + 1\n );\n };\n\n const prevSlide = () => {\n setCurrentIndex((prevIndex) =>\n prevIndex === 0 ? projects.length - 1 : prevIndex - 1\n );\n };\n\n return (\n <section id=\"projects\" className={cn(\"py-16 bg-gray-50\", className)}>\n <div className=\"container mx-auto px-4\">\n <h2 className=\"text-3xl font-bold text-center mb-12 text-gray-900\">项目展示</h2>\n \n <div className=\"relative max-w-4xl mx-auto\">\n {/* 项目卡片 */}\n <div className=\"relative h-[400px] overflow-hidden rounded-lg shadow-xl\">\n {projects.map((project, index) => (\n <div\n key={project.id}\n className={cn(\n \"absolute w-full h-full transition-all duration-500 transform\",\n index === currentIndex\n ? \"translate-x-0 opacity-100\"\n : index < currentIndex\n ? \"-translate-x-full opacity-0\"\n : \"translate-x-full opacity-0\"\n )}\n >\n <ExperimentCard\n href={project.link || '#'}\n title={project.title}\n description={project.description}\n tags={project.tags}\n category=\"utility\"\n />\n </div>\n ))}\n </div>\n\n {/* 导航按钮 */}\n <button\n onClick={prevSlide}\n className=\"absolute left-4 top-1/2 -translate-y-1/2 p-2 rounded-full bg-white/80 hover:bg-white shadow-lg focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all z-10\"\n >\n <svg\n className=\"w-6 h-6 text-gray-600\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n\n <button\n onClick={nextSlide}\n className=\"absolute right-4 top-1/2 -translate-y-1/2 p-2 rounded-full bg-white/80 hover:bg-white shadow-lg focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all z-10\"\n >\n <svg\n className=\"w-6 h-6 text-gray-600\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n\n {/* 指示器 */}\n <div className=\"absolute bottom-4 left-1/2 transform -translate-x-1/2 flex space-x-2 z-10\">\n {projects.map((_, index) => (\n <button\n key={index}\n onClick={() => setCurrentIndex(index)}\n className={cn(\n \"w-2 h-2 rounded-full transition-all duration-300\",\n index === currentIndex ? \"bg-blue-500 w-4\" : \"bg-gray-300\"\n )}\n />\n ))}\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default ProjectCarousel;\n\n"," 'use client';\n\nimport React from 'react';\nimport { NavigationItem, NavigationDirection } from './types';\n\ninterface NavigationItemProps {\n item: NavigationItem;\n direction: NavigationDirection;\n isActive?: boolean;\n onClick: (item: NavigationItem) => void;\n}\n\nconst NavigationItemComponent: React.FC<NavigationItemProps> = ({\n item,\n direction,\n isActive,\n onClick\n}) => {\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault();\n onClick(item);\n };\n\n const getItemClasses = () => {\n const baseClasses = `\n group relative flex items-center gap-3\n transition-all duration-300 ease-in-out\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50\n rounded-lg\n `;\n\n const directionClasses = direction === 'vertical'\n ? 'px-4 py-3 w-full justify-start'\n : 'px-3 py-2 justify-center';\n\n const stateClasses = isActive\n ? 'bg-blue-500 text-white shadow-lg'\n : item.isExternal\n ? 'text-gray-700 hover:bg-purple-50 hover:text-purple-600 border border-purple-200'\n : 'text-gray-700 hover:bg-blue-50 hover:text-blue-600';\n\n return `${baseClasses} ${directionClasses} ${stateClasses}`;\n };\n\n return (\n <a\n href={item.href}\n onClick={handleClick}\n target={item.target}\n rel={item.isExternal ? 'noopener noreferrer' : undefined}\n className={getItemClasses()}\n >\n {/* 图标 */}\n {item.icon && (\n <span className=\"flex-shrink-0\">\n {item.icon}\n </span>\n )}\n\n {/* 标签 */}\n <span className={`font-medium ${direction === 'vertical' ? 'text-sm' : 'text-xs'}`}>\n {item.label}\n </span>\n\n {/* 外链图标 */}\n {item.isExternal && (\n <svg\n className=\"w-3 h-3 opacity-60 group-hover:opacity-100 transition-opacity\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"\n />\n </svg>\n )}\n\n {/* 活动状态指示器 */}\n {direction === 'vertical' && isActive && (\n <div className=\"absolute left-1 top-1/2 transform -translate-y-1/2 w-1 h-6 bg-white rounded-full\" />\n )}\n </a>\n );\n};\n\nexport default NavigationItemComponent;"," 'use client';\n\nimport React from 'react';\nimport NavigationItem from './NavigationItem';\nimport { NavigationProps } from './types';\n\nconst Navigation: React.FC<NavigationProps> = ({\n config,\n isOpen,\n activeItemId,\n onItemClick,\n className = ''\n}) => {\n const { direction, position, items, avatar, logo } = config;\n\n // 获取导航栏位置和尺寸样式\n const getContainerClasses = () => {\n const baseClasses = `\n fixed z-[90]\n bg-white/95 backdrop-blur-lg\n border border-gray-200/50\n shadow-2xl\n transition-all duration-500 ease-in-out\n `;\n\n // 根据方向和位置确定样式\n if (direction === 'vertical') {\n const verticalClasses = 'h-screen w-64 flex flex-col';\n const positionClasses = position === 'left' \n ? `left-0 top-0 ${isOpen ? 'translate-x-0' : '-translate-x-full'}`\n : `right-0 top-0 ${isOpen ? 'translate-x-0' : 'translate-x-full'}`;\n \n return `${baseClasses} ${verticalClasses} ${positionClasses}`;\n } else {\n const horizontalClasses = 'w-full h-16 flex items-center';\n const positionClasses = position === 'top'\n ? `top-0 left-0 right-0 ${isOpen ? 'translate-y-0' : '-translate-y-full'}`\n : `bottom-0 left-0 right-0 ${isOpen ? 'translate-y-0' : 'translate-y-full'}`;\n \n return `${baseClasses} ${horizontalClasses} ${positionClasses}`;\n }\n };\n\n // 获取内容布局样式\n const getContentClasses = () => {\n if (direction === 'vertical') {\n return 'flex flex-col h-full p-4';\n } else {\n return 'flex items-center justify-between w-full px-6';\n }\n };\n\n // 获取导航项列表样式\n const getItemsListClasses = () => {\n if (direction === 'vertical') {\n return 'flex flex-col gap-2 flex-1 overflow-y-auto mt-4';\n } else {\n return 'flex items-center gap-4';\n }\n };\n\n const handleItemClick = (item: any) => {\n // 处理页面跳转\n if (item.isExternal) {\n // 外链跳转\n window.open(item.href, item.target || '_blank');\n } else if (item.href.startsWith('#')) {\n // 锚点跳转\n const element = document.getElementById(item.id);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth' });\n }\n } else {\n // 内部页面跳转\n window.location.href = item.href;\n }\n\n // 触发回调\n onItemClick?.(item);\n };\n\n if (!isOpen) return null;\n\n return (\n <nav className={`${getContainerClasses()} ${className}`}>\n <div className={getContentClasses()}>\n {/* Logo 区域 */}\n {logo && (\n <div className=\"flex items-center justify-center mb-4\">\n <img\n src={logo.src}\n alt={logo.alt || 'Logo'}\n className=\"h-8 w-auto\"\n />\n </div>\n )}\n\n {/* 顶部空间占位(为切换按钮预留) */}\n {direction === 'vertical' && (\n <div className=\"h-12 flex-shrink-0\" />\n )}\n\n {/* 导航项列表 */}\n <div className={getItemsListClasses()}>\n {items.map((item) => (\n <NavigationItem\n key={item.id}\n item={item}\n direction={direction}\n isActive={activeItemId === item.id}\n onClick={handleItemClick}\n />\n ))}\n </div>\n\n {/* 头像区域 */}\n {avatar && direction === 'vertical' && (\n <div className=\"flex items-center justify-center mt-auto pt-4\">\n <img\n src={avatar.src}\n alt={avatar.alt || 'Avatar'}\n className=\"w-10 h-10 rounded-full border-2 border-gray-200\"\n />\n </div>\n )}\n\n {/* 水平布局的头像 */}\n {avatar && direction === 'horizontal' && (\n <div className=\"flex items-center\">\n <img\n src={avatar.src}\n alt={avatar.alt || 'Avatar'}\n className=\"w-8 h-8 rounded-full border-2 border-gray-200\"\n />\n </div>\n )}\n </div>\n </nav>\n );\n};\n\nexport default Navigation;"," 'use client';\n\nimport React from 'react';\nimport { NavigationPosition } from './types';\n\ninterface NavigationToggleProps {\n isOpen: boolean;\n onClick: () => void;\n position: NavigationPosition;\n}\n\nconst NavigationToggle: React.FC<NavigationToggleProps> = ({\n isOpen,\n onClick,\n position\n}) => {\n const getPositionClasses = () => {\n switch (position) {\n case 'top':\n return 'top-4 left-4';\n case 'bottom':\n return 'bottom-4 left-4';\n case 'left':\n return 'top-4 left-4';\n case 'right':\n return 'top-4 right-4';\n default:\n return 'top-4 left-4';\n }\n };\n\n return (\n <button\n onClick={onClick}\n className={`\n fixed ${getPositionClasses()} z-[100]\n p-3 rounded-xl\n bg-white/90 backdrop-blur-md\n shadow-lg hover:shadow-xl\n border border-gray-200/50\n transition-all duration-300 ease-in-out\n hover:scale-105 active:scale-95\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50\n `}\n aria-label={isOpen ? '关闭导航栏' : '打开导航栏'}\n >\n <div className=\"w-5 h-5 flex flex-col justify-center items-center\">\n <span\n className={`\n block w-5 h-0.5 bg-gray-600 rounded-full\n transform transition-all duration-300 ease-in-out\n ${isOpen ? 'rotate-45 translate-y-0.5' : ''}\n `}\n />\n <span\n className={`\n block w-5 h-0.5 bg-gray-600 rounded-full\n transform transition-all duration-300 ease-in-out mt-1\n ${isOpen ? 'opacity-0 scale-0' : 'opacity-100 scale-100'}\n `}\n />\n <span\n className={`\n block w-5 h-0.5 bg-gray-600 rounded-full\n transform transition-all duration-300 ease-in-out mt-1\n ${isOpen ? '-rotate-45 -translate-y-2.5' : ''}\n `}\n />\n </div>\n </button>\n );\n};\n\nexport default NavigationToggle;","'use client';\n\nimport React, { useState, useRef, useEffect, ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface FloatingMenuProps {\n /**\n * 触发按钮的内容\n */\n trigger: ReactNode;\n \n /**\n * 菜单内容\n */\n menu: ReactNode;\n \n /**\n * 初始位置\n */\n initialPosition?: { x: number; y: number };\n \n /**\n * 是否默认打开菜单\n */\n defaultOpen?: boolean;\n \n /**\n * 自定义类名\n */\n className?: string;\n \n /**\n * 菜单类名\n */\n menuClassName?: string;\n \n /**\n * 触发器类名\n */\n triggerClassName?: string;\n \n /**\n * z-index\n */\n zIndex?: number;\n}\n\nconst FloatingMenu: React.FC<FloatingMenuProps> = ({\n trigger,\n menu,\n initialPosition = { x: 20, y: 20 },\n defaultOpen = false,\n className = '',\n menuClassName = '',\n triggerClassName = '',\n zIndex = 1000,\n}) => {\n const [position, setPosition] = useState(initialPosition);\n const [isMenuOpen, setIsMenuOpen] = useState(defaultOpen);\n const [menuDirection, setMenuDirection] = useState<'left' | 'right'>('right');\n const [isDragging, setIsDragging] = useState(false);\n const [dragOffset, setDragOffset] = useState({ x: 0, y: 0 });\n const containerRef = useRef<HTMLDivElement>(null);\n const [mounted, setMounted] = useState(false);\n // 添加一个标志,用于跟踪是否发生了拖动\n const [hasDragged, setHasDragged] = useState(false);\n // 添加一个计时器引用,用于区分点击和拖动\n const dragTimerRef = useRef<number | null>(null);\n // 添加一个引用,记录鼠标按下的初始位置\n const mouseDownPosRef = useRef<{ x: number, y: number } | null>(null);\n\n // 客户端挂载检查\n useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n // 计算菜单方向\n useEffect(() => {\n if (!mounted || !containerRef.current) return;\n \n const updateMenuDirection = () => {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n \n const windowWidth = window.innerWidth;\n const middlePoint = windowWidth / 2;\n \n // 如果悬浮窗在屏幕左半部分,菜单向右展开;否则向左展开\n setMenuDirection(rect.left < middlePoint ? 'right' : 'left');\n };\n \n updateMenuDirection();\n \n // 监听窗口大小变化和滚动事件\n window.addEventListener('resize', updateMenuDirection);\n window.addEventListener('scroll', updateMenuDirection);\n \n return () => {\n window.removeEventListener('resize', updateMenuDirection);\n window.removeEventListener('scroll', updateMenuDirection);\n };\n }, [mounted]);\n\n // 处理拖动开始\n const handleMouseDown = (e: React.MouseEvent) => {\n if (!containerRef.current) return;\n \n // 防止触发菜单点击\n e.stopPropagation();\n \n // 记录鼠标按下的初始位置\n mouseDownPosRef.current = { x: e.clientX, y: e.clientY };\n \n const rect = containerRef.current.getBoundingClientRect();\n setDragOffset({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top\n });\n \n // 重置拖动标志\n setHasDragged(false);\n \n // 设置拖动状态\n setIsDragging(true);\n };\n\n // 处理拖动过程\n useEffect(() => {\n if (!isDragging) return;\n \n const handleMouseMove = (e: MouseEvent) => {\n // 检查是否移动了足够的距离来认为是拖动\n if (mouseDownPosRef.current) {\n const dx = Math.abs(e.clientX - mouseDownPosRef.current.x);\n const dy = Math.abs(e.clientY - mouseDownPosRef.current.y);\n \n // 如果移动距离超过阈值,标记为拖动\n if (dx > 3 || dy > 3) {\n setHasDragged(true);\n }\n }\n \n // 计算新位置并应用边界检查\n const newX = e.clientX - dragOffset.x;\n const newY = e.clientY - dragOffset.y;\n \n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n \n setPosition({\n x: Math.min(Math.max(newX, 0), windowWidth - 50),\n y: Math.min(Math.max(newY, 0), windowHeight - 50)\n });\n };\n \n const handleMouseUp = () => {\n setIsDragging(false);\n \n // 重置鼠标按下位置\n mouseDownPosRef.current = null;\n \n // 设置一个短暂的延时,防止拖动后立即触发点击\n if (dragTimerRef.current) {\n window.clearTimeout(dragTimerRef.current);\n }\n \n dragTimerRef.current = window.setTimeout(() => {\n setHasDragged(false);\n }, 300); // 300ms 后重置拖动状态\n };\n \n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n \n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isDragging, dragOffset]);\n\n // 清理定时器\n useEffect(() => {\n return () => {\n if (dragTimerRef.current) {\n window.clearTimeout(dragTimerRef.current);\n }\n };\n }, []);\n\n // 切换菜单开关\n const toggleMenu = (e: React.MouseEvent) => {\n e.stopPropagation();\n \n // 如果刚刚拖动过,不触发菜单切换\n if (hasDragged) {\n return;\n }\n \n setIsMenuOpen(!isMenuOpen);\n };\n\n // 关闭菜单的点击外部处理\n useEffect(() => {\n if (!isMenuOpen) return;\n \n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsMenuOpen(false);\n }\n };\n \n document.addEventListener('mousedown', handleClickOutside);\n \n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isMenuOpen]);\n\n // 窗口大小变化时的边界检查\n useEffect(() => {\n if (!mounted) return;\n \n const checkBoundaries = () => {\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n \n // 确保悬浮窗不会被拖出屏幕\n setPosition(prev => {\n const newX = Math.min(Math.max(prev.x, 0), windowWidth - 50);\n const newY = Math.min(Math.max(prev.y, 0), windowHeight - 50);\n \n // 只有在实际需要调整时才更新位置\n if (newX !== prev.x || newY !== prev.y) {\n return { x: newX, y: newY };\n }\n return prev;\n });\n };\n \n // 只在窗口大小变化时检查边界\n window.addEventListener('resize', checkBoundaries);\n \n return () => {\n window.removeEventListener('resize', checkBoundaries);\n };\n }, [mounted]);\n\n if (!mounted) return null;\n\n return createPortal(\n <div\n ref={containerRef}\n className={`fixed select-none box-border ${className}`}\n style={{\n left: `${position.x}px`,\n top: `${position.y}px`,\n zIndex,\n }}\n >\n {/* 触发器按钮 */}\n <div \n className={`\n flex items-center justify-center \n w-12 h-12 md:w-12 md:h-12 \n bg-white rounded-full \n shadow-md hover:shadow-lg \n cursor-grab active:cursor-grabbing \n transition-all duration-200 \n hover:scale-105 active:scale-95\n ${triggerClassName}\n `}\n onMouseDown={handleMouseDown}\n onClick={toggleMenu}\n >\n {trigger}\n </div>\n \n {/* 菜单内容 */}\n {isMenuOpen && (\n <div \n className={`\n absolute top-0\n bg-white rounded-lg shadow-xl \n p-3 min-w-[200px] md:min-w-[200px] max-w-[300px]\n z-[1000] \n transition-all duration-200\n ${isMenuOpen ? 'opacity-100 scale-100' : 'opacity-0 scale-95'}\n ${menuDirection === 'left' ? 'right-[calc(100%+10px)]' : 'left-[calc(100%+10px)]'}\n ${menuClassName}\n `}\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n onMouseUp={(e) => e.stopPropagation()}\n onTouchStart={(e) => e.stopPropagation()}\n onTouchMove={(e) => e.stopPropagation()}\n onTouchEnd={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n onPointerUp={(e) => e.stopPropagation()}\n >\n {menu}\n </div>\n )}\n </div>,\n document.body\n );\n};\n\nexport default FloatingMenu;","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport FloatingMenu from './FloatingMenu';\n\nexport const FloatingMenuExample: React.FC = () => {\n const [windowWidth, setWindowWidth] = useState(0);\n \n useEffect(() => {\n setWindowWidth(window.innerWidth);\n const handleResize = () => setWindowWidth(window.innerWidth);\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n const menuItems = [\n { id: 1, label: '首页', icon: '🏠' },\n { id: 2, label: '设置', icon: '⚙️' },\n { id: 3, label: '消息', icon: '📩' },\n { id: 4, label: '帮助', icon: '❓' },\n { id: 5, label: '退出', icon: '🚪' },\n ];\n \n const handleMenuItemClick = (id: number) => {\n console.log(`点击了菜单项: ${id}`);\n };\n \n return (\n <div className=\"w-full h-screen bg-gray-100 relative p-8\">\n <div className=\"max-w-2xl mx-auto bg-white rounded-2xl shadow-sm p-8 mt-12\">\n <h1 className=\"text-3xl font-bold mb-4 text-gray-900\">悬浮菜单示例</h1>\n <p className=\"text-gray-600 leading-relaxed mb-6\">\n 这是一个可拖拽的悬浮菜单组件示例。你可以尝试拖动下方的 <span className=\"font-bold text-blue-600\">蓝色按钮</span> 到处移动。\n </p>\n <div className=\"bg-blue-50 border-l-4 border-blue-500 p-4 mb-6\">\n <p className=\"text-sm text-blue-700\">\n <strong>智能定位:</strong> 菜单会根据按钮在屏幕上的位置自动调整弹出方向(向左或向右)。\n </p>\n </div>\n </div>\n \n <FloatingMenu\n trigger={\n <div className=\"w-12 h-12 bg-blue-600 rounded-full flex items-center justify-center text-white shadow-lg cursor-pointer\">\n <span className=\"text-xl\">➕</span>\n </div>\n }\n menu={\n <div className=\"w-48 bg-white rounded-xl shadow-xl border border-gray-100 overflow-hidden\">\n <div className=\"px-4 py-3 border-b border-gray-100\">\n <h3 className=\"text-sm font-bold text-gray-900\">快捷菜单</h3>\n </div>\n <ul className=\"py-1\">\n {menuItems.map(item => (\n <li \n key={item.id} \n className=\"flex items-center gap-3 px-4 py-2.5 hover:bg-blue-50 text-gray-700 hover:text-blue-600 cursor-pointer transition-colors text-sm\"\n onClick={() => handleMenuItemClick(item.id)}\n >\n <span className=\"text-lg\">{item.icon}</span>\n <span className=\"font-medium\">{item.label}</span>\n </li>\n ))}\n </ul>\n </div>\n }\n initialPosition={{ x: 100, y: 100 }}\n />\n \n {windowWidth > 0 && (\n <FloatingMenu\n trigger={\n <div className=\"w-12 h-12 bg-purple-600 rounded-full flex items-center justify-center text-white shadow-lg cursor-pointer\">\n <span className=\"text-xl\">🔍</span>\n </div>\n }\n menu={\n <div className=\"w-64 bg-white rounded-xl shadow-xl border border-gray-100 p-4\">\n <h3 className=\"text-sm font-bold text-gray-900 mb-3\">快速搜索</h3>\n <div className=\"space-y-3\">\n <input \n type=\"text\" \n placeholder=\"输入关键字...\" \n className=\"w-full px-3 py-2 text-sm border border-gray-200 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent outline-none\"\n />\n <button className=\"w-full bg-purple-600 text-white py-2 rounded-lg text-sm font-medium hover:bg-purple-700 transition-colors\">\n 搜索\n </button>\n </div>\n </div>\n }\n initialPosition={{ x: windowWidth - 100, y: 100 }}\n />\n )}\n </div>\n );\n};\n\nexport default FloatingMenuExample;\n\n","/**\n * 实验田模块工具函数\n */\n\nimport type { ExperimentItem, ViewMode, TestFieldConfig, CompletionFilter } from '../types';\n\n/**\n * 过滤实验项目\n */\nexport function filterExperiments(\n experiments: ExperimentItem[],\n config: Partial<TestFieldConfig>\n): ExperimentItem[] {\n const {\n viewMode = 'all',\n searchQuery = '',\n completionFilter = 'all'\n } = config;\n\n return experiments.filter(experiment => {\n // 类别过滤\n const matchesViewMode = viewMode === 'all' || experiment.category === viewMode;\n \n // 搜索过滤\n const query = searchQuery.toLowerCase();\n const matchesSearch = !query || \n experiment.title.toLowerCase().includes(query) ||\n experiment.description.toLowerCase().includes(query) ||\n experiment.tags.some(tag => tag.toLowerCase().includes(query));\n \n // 完成状态过滤\n const matchesCompletion = (() => {\n switch (completionFilter) {\n case 'completed':\n return experiment.isCompleted === true;\n case 'incomplete':\n return experiment.isCompleted !== true;\n case 'all':\n default:\n return true;\n }\n })();\n \n return matchesViewMode && matchesSearch && matchesCompletion;\n });\n}\n\n/**\n * 排序实验项目\n */\nexport function sortExperiments(\n experiments: ExperimentItem[],\n sortBy: TestFieldConfig['sortBy'] = 'title',\n sortOrder: TestFieldConfig['sortOrder'] = 'asc'\n): ExperimentItem[] {\n return [...experiments].sort((a, b) => {\n let comparison = 0;\n \n switch (sortBy) {\n case 'title':\n comparison = a.title.localeCompare(b.title);\n break;\n case 'category':\n comparison = a.category.localeCompare(b.category);\n break;\n case 'completion':\n // 已完成的排在前面\n const aCompleted = a.isCompleted ? 1 : 0;\n const bCompleted = b.isCompleted ? 1 : 0;\n comparison = bCompleted - aCompleted;\n break;\n case 'createdAt':\n // 处理创建日期排序,确保没有日期的项目排在最后\n if (!a.createdAt && !b.createdAt) {\n comparison = 0;\n } else if (!a.createdAt) {\n comparison = 1; // a没有日期,排在后面\n } else if (!b.createdAt) {\n comparison = -1; // b没有日期,排在后面\n } else {\n // 日期字符串比较(假设格式为YYYY-MM-DD)\n comparison = new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime();\n }\n break;\n case 'updatedAt':\n // 处理更新日期排序,确保没有日期的项目排在最后\n if (!a.updatedAt && !b.updatedAt) {\n comparison = 0;\n } else if (!a.updatedAt) {\n comparison = 1; // a没有日期,排在后面\n } else if (!b.updatedAt) {\n comparison = -1; // b没有日期,排在后面\n } else {\n // 日期字符串比较(假设格式为YYYY-MM-DD)\n comparison = new Date(a.updatedAt).getTime() - new Date(b.updatedAt).getTime();\n }\n break;\n default:\n comparison = 0;\n }\n \n // 如果主要排序字段相同,使用ID作为第二排序键确保稳定性\n if (comparison === 0) {\n comparison = a.id.localeCompare(b.id);\n }\n \n return sortOrder === 'asc' ? comparison : -comparison;\n });\n}\n\n/**\n * 获取所有标签\n */\nexport function getAllTags(experiments: ExperimentItem[]): string[] {\n const allTags = experiments.flatMap(experiment => experiment.tags);\n return Array.from(new Set(allTags)).sort();\n}\n\n/**\n * 根据类别统计实验项目数量\n */\nexport function getExperimentCounts(experiments: ExperimentItem[]) {\n const counts = {\n all: experiments.length,\n utility: 0,\n leisure: 0,\n completed: 0,\n inProgress: 0\n };\n \n experiments.forEach(experiment => {\n if (experiment.category === 'utility') {\n counts.utility++;\n } else if (experiment.category === 'leisure') {\n counts.leisure++;\n }\n \n if (experiment.isCompleted) {\n counts.completed++;\n } else {\n counts.inProgress++;\n }\n });\n \n return counts;\n}\n\n/**\n * 验证实验项目数据\n */\nexport function validateExperiment(experiment: Partial<ExperimentItem>): boolean {\n return !!(\n experiment.id &&\n experiment.title &&\n experiment.description &&\n experiment.path &&\n experiment.category &&\n Array.isArray(experiment.tags)\n );\n}\n\n/**\n * 获取类别显示名称\n */\nexport function getCategoryDisplayName(category: ViewMode): string {\n switch (category) {\n case 'utility':\n return '实用工具';\n case 'leisure':\n return '休闲娱乐';\n case 'all':\n default:\n return '全部';\n }\n}\n\n/**\n * 获取类别颜色\n */\nexport function getCategoryColor(category: ExperimentItem['category']): string {\n switch (category) {\n case 'utility':\n return 'bg-blue-100 text-blue-800 border-blue-200';\n case 'leisure':\n return 'bg-purple-100 text-purple-800 border-purple-200';\n default:\n return 'bg-gray-100 text-gray-800 border-gray-200';\n }\n}\n\n/**\n * 获取完成状态显示名称\n */\nexport function getCompletionFilterDisplayName(filter: CompletionFilter): string {\n switch (filter) {\n case 'completed':\n return '已完成';\n case 'incomplete':\n return '进行中';\n case 'all':\n default:\n return '全部状态';\n }\n}\n\n/**\n * 获取完成状态标签样式\n */\nexport function getCompletionStatusColor(isCompleted?: boolean): string {\n if (isCompleted) {\n return 'bg-green-100 text-green-800 border-green-200';\n }\n return 'bg-yellow-100 text-yellow-800 border-yellow-200';\n}\n\n/**\n * 获取完成状态标签文本\n */\nexport function getCompletionStatusText(isCompleted?: boolean): string {\n return isCompleted ? '已完成' : '进行中';\n}","'use client';\n\nimport React from \"react\";\nimport type { ViewMode } from '../types';\nimport { getCategoryDisplayName } from '../utils';\nimport { FilterButtonGroup } from '@/components';\n\ninterface CategoryFilterProps {\n viewMode: ViewMode;\n onViewModeChange: (mode: ViewMode) => void;\n counts: { utility: number; leisure: number };\n className?: string;\n}\n\nexport const CategoryFilter: React.FC<CategoryFilterProps> = ({ \n viewMode, \n onViewModeChange, \n counts,\n className\n}) => {\n const options = [\n {\n value: 'all' as const,\n label: getCategoryDisplayName('all'),\n icon: '📊',\n activeColor: {\n bg: 'bg-blue-500',\n shadow: 'shadow-blue-200'\n },\n showCount: false\n },\n {\n value: 'utility' as const,\n label: getCategoryDisplayName('utility'),\n icon: '🔧',\n activeColor: {\n bg: 'bg-green-500',\n shadow: 'shadow-green-200'\n },\n count: counts.utility,\n showCount: true\n },\n {\n value: 'leisure' as const,\n label: getCategoryDisplayName('leisure'),\n icon: '🎮',\n activeColor: {\n bg: 'bg-purple-500',\n shadow: 'shadow-purple-200'\n },\n count: counts.leisure,\n showCount: true\n },\n ];\n\n return (\n <FilterButtonGroup\n label=\"项目类别\"\n value={viewMode}\n options={options}\n onChange={onViewModeChange}\n className={className}\n />\n );\n};\n\nexport default CategoryFilter;\n","'use client';\n\nimport React from \"react\";\nimport type { CompletionFilter } from '../types';\nimport { getCompletionFilterDisplayName } from '../utils';\nimport { FilterButtonGroup } from '@/components';\n\ninterface CompletionFilterProps {\n completionFilter: CompletionFilter;\n onCompletionFilterChange: (filter: CompletionFilter) => void;\n counts: { all: number; completed: number; inProgress: number };\n className?: string;\n}\n\nexport const CompletionFilterComponent: React.FC<CompletionFilterProps> = ({ \n completionFilter, \n onCompletionFilterChange, \n counts,\n className\n}) => {\n const options = [\n {\n value: 'all' as const,\n label: getCompletionFilterDisplayName('all'),\n icon: '📊',\n activeColor: {\n bg: 'bg-slate-500',\n shadow: 'shadow-slate-200'\n },\n count: counts.all,\n showCount: true\n },\n {\n value: 'completed' as const,\n label: getCompletionFilterDisplayName('completed'),\n icon: '✅',\n activeColor: {\n bg: 'bg-emerald-500',\n shadow: 'shadow-emerald-200'\n },\n count: counts.completed,\n showCount: true\n },\n {\n value: 'incomplete' as const,\n label: getCompletionFilterDisplayName('incomplete'),\n icon: '🚧',\n activeColor: {\n bg: 'bg-orange-500',\n shadow: 'shadow-orange-200'\n },\n count: counts.inProgress,\n showCount: true\n }\n ];\n\n return (\n <FilterButtonGroup\n label=\"完成状态\"\n value={completionFilter}\n options={options}\n onChange={onCompletionFilterChange}\n className={className}\n />\n );\n};\n\nexport default CompletionFilterComponent;\n","'use client';\n\nimport React from \"react\";\nimport { BackButton } from '@/components';\n\nexport interface PageHeaderProps {\n counts: { all: number; utility: number; leisure: number; completed: number };\n className?: string;\n}\n\nexport const PageHeader: React.FC<PageHeaderProps> = ({ counts, className }) => {\n return (\n <div className={className}>\n {/* 顶部导航 */}\n <div className=\"mb-8\">\n <BackButton />\n </div>\n\n {/* 页面标题 */}\n <div className=\"mb-8\">\n <h1 className=\"text-3xl font-bold text-gray-900\">实验田</h1>\n <p className=\"mt-2 text-sm text-gray-600\">\n 在这里,你可以尝试各种实验性的功能和项目\n </p>\n \n {/* 统计信息 */}\n <div className=\"mt-4 flex flex-wrap gap-4 text-sm text-gray-500\">\n <span>总计: {counts.all} 个项目</span>\n <span>实用工具: {counts.utility} 个</span>\n <span>休闲娱乐: {counts.leisure} 个</span>\n <span>已完成: {counts.completed} 个</span>\n </div>\n </div>\n </div>\n );\n};\n\nexport default PageHeader;\n","'use client';\n\nimport React from \"react\";\nimport { ExperimentCard } from '@/portfolio/ExperimentCard';\nimport type { ExperimentItem } from '../types';\nimport { Grid } from '@/components';\nimport type { GridItem, GridColumns, GridGap } from '@/components';\n\n/** 实验项目网格项接口 */\nexport interface ExperimentGridItem extends GridItem {\n title: string;\n description: string;\n path: string;\n tags: string[];\n category: string;\n isCompleted?: boolean;\n updatedAt?: string;\n createdAt?: string;\n}\n\n/** 实验项目网格组件 Props */\nexport interface ExperimentGridProps<T extends ExperimentGridItem> {\n /** 数据项数组 */\n items: T[];\n /** 自定义渲染函数(可选) */\n renderItem?: (item: T, index: number) => React.ReactNode;\n /** 网格列数配置(可选) */\n columns?: GridColumns;\n /** 间距配置(可选) */\n gap?: GridGap;\n /** 额外的容器类名 */\n className?: string;\n}\n\n/** 默认的 ExperimentCard 渲染器 */\nfunction defaultExperimentRenderer(item: ExperimentItem) {\n return (\n <ExperimentCard\n href={item.path}\n title={item.title}\n description={item.description}\n tags={item.tags}\n category={item.category as any}\n isCompleted={item.isCompleted}\n updatedAt={item.updatedAt}\n createdAt={item.createdAt}\n />\n );\n}\n\n/** 实验项目网格组件 */\nexport function ExperimentGrid<T extends ExperimentGridItem>({\n items,\n renderItem,\n columns = { sm: 1, md: 2, lg: 3, xl: 4 },\n gap = 'md',\n className = ''\n}: ExperimentGridProps<T>) {\n const itemRenderer = renderItem || ((item: T) => defaultExperimentRenderer(item as any));\n\n return (\n <Grid\n items={items}\n renderItem={itemRenderer}\n columns={columns}\n gap={gap}\n className={className}\n />\n );\n}\n\n/** 为了向后兼容,导出一个专门用于 ExperimentItem 的组件 */\nexport function ExperimentItemGrid({ \n experiments, \n ...props \n}: Omit<ExperimentGridProps<ExperimentItem>, 'items'> & { experiments: ExperimentItem[] }) {\n return <ExperimentGrid<ExperimentItem> items={experiments} {...props} />;\n}\n\nexport default ExperimentGrid;\n","'use client';\n\nimport React from \"react\";\n\nexport interface EmptyStateProps {\n searchQuery: string;\n onClearSearch: () => void;\n className?: string;\n}\n\nexport const EmptyState: React.FC<EmptyStateProps> = ({ searchQuery, onClearSearch, className }) => {\n return (\n <div className={`text-center py-12 ${className}`}>\n <svg \n className=\"mx-auto h-12 w-12 text-gray-400\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\" \n strokeWidth={2} \n d=\"M9.172 16.172a4 4 0 015.656 0M9 12h6m-6-4h6m2 5.291A7.962 7.962 0 0112 15c-2.34 0-4.47.904-6.06 2.384\" \n />\n </svg>\n <h3 className=\"mt-2 text-sm font-medium text-gray-900\">没有找到匹配的实验项目</h3>\n <p className=\"mt-1 text-sm text-gray-500\">\n {searchQuery \n ? '尝试调整搜索关键词或筛选条件' \n : '当前分类下暂无实验项目'\n }\n </p>\n {searchQuery && (\n <div className=\"mt-4\">\n <button\n onClick={onClearSearch}\n className=\"inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-blue-700 bg-blue-100 hover:bg-blue-200\"\n >\n 清除搜索\n </button>\n </div>\n )}\n </div>\n );\n};\n\nexport default EmptyState;\n","'use client';\n\nimport React from 'react';\nimport type { TestFieldConfig } from '../types';\n\nexport interface SortControlProps {\n sortBy: TestFieldConfig['sortBy'];\n sortOrder: TestFieldConfig['sortOrder'];\n onSortByChange: (sortBy: TestFieldConfig['sortBy']) => void;\n onSortOrderChange: (sortOrder: TestFieldConfig['sortOrder']) => void;\n}\n\nexport const SortControl: React.FC<SortControlProps> = ({\n sortBy,\n sortOrder,\n onSortByChange,\n onSortOrderChange,\n}) => {\n // 排序方式选项\n const sortOptions: { value: TestFieldConfig['sortBy']; label: string }[] = [\n { value: 'title', label: '名称' },\n { value: 'updatedAt', label: '更新时间' },\n { value: 'createdAt', label: '创建时间' },\n { value: 'category', label: '类别' },\n { value: 'completion', label: '完成状态' },\n ];\n\n return (\n <div className=\"flex flex-col sm:flex-row items-start sm:items-center gap-2 sm:gap-4 p-4 bg-white rounded-lg shadow-sm border border-gray-100\">\n <div className=\"text-sm font-medium text-gray-700\">排序方式:</div>\n \n <div className=\"flex flex-wrap gap-2\">\n {sortOptions.map((option) => (\n <button\n key={option.value}\n className={`px-3 py-1.5 text-sm rounded-full transition-colors ${\n sortBy === option.value\n ? 'bg-blue-100 text-blue-700 font-medium'\n : 'bg-gray-100 text-gray-600 hover:bg-gray-200'\n }`}\n onClick={() => onSortByChange(option.value)}\n >\n {option.label}\n </button>\n ))}\n </div>\n \n <div className=\"ml-auto flex items-center\">\n <button\n className=\"flex items-center gap-1 px-3 py-1.5 text-sm rounded-full bg-gray-100 hover:bg-gray-200\"\n onClick={() => onSortOrderChange(sortOrder === 'asc' ? 'desc' : 'asc')}\n >\n {sortOrder === 'asc' ? (\n <>\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 4h13M3 8h9m-9 4h6m4 0l4-4m0 0l4 4m-4-4v12\" />\n </svg>\n <span>升序</span>\n </>\n ) : (\n <>\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 4h13M3 8h9m-9 4h9m5-4v12m0 0l-4-4m4 4l4-4\" />\n </svg>\n <span>降序</span>\n </>\n )}\n </button>\n </div>\n </div>\n );\n};\n\nexport default SortControl;\n","'use client';\n\nimport React from 'react';\nimport type { SortMode } from '../types';\n\nexport interface SortModeToggleProps {\n sortMode: SortMode;\n onSortModeChange: (mode: SortMode) => void;\n}\n\nexport const SortModeToggle: React.FC<SortModeToggleProps> = ({ sortMode, onSortModeChange }) => {\n return (\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-3 bg-white p-4 rounded-lg shadow-sm border border-gray-100\">\n <span className=\"text-sm font-medium text-gray-700\">排序模式:</span>\n \n <div className=\"flex w-full sm:w-auto p-1 bg-gray-100 rounded-lg\">\n <button\n className={`flex-1 sm:flex-initial px-3 py-1.5 text-sm rounded-md transition-colors ${\n sortMode === 'auto'\n ? 'bg-white text-blue-700 font-medium shadow-sm'\n : 'text-gray-600 hover:bg-gray-200'\n }`}\n onClick={() => onSortModeChange('auto')}\n >\n <div className=\"flex items-center justify-center sm:justify-start space-x-1\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 4h13M3 8h9m-9 4h9m5-4v12m0 0l-4-4m4 4l4-4\" />\n </svg>\n <span>自动排序</span>\n </div>\n </button>\n \n <button\n className={`flex-1 sm:flex-initial px-3 py-1.5 text-sm rounded-md transition-colors ${\n sortMode === 'manual'\n ? 'bg-white text-blue-700 font-medium shadow-sm'\n : 'text-gray-600 hover:bg-gray-200'\n }`}\n onClick={() => onSortModeChange('manual')}\n >\n <div className=\"flex items-center justify-center sm:justify-start space-x-1\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 11.5V14m0-2.5v-6a1.5 1.5 0 113 0m-3 6a1.5 1.5 0 00-3 0v2a7.5 7.5 0 0015 0v-5a1.5 1.5 0 013 0m-6-3V11m0-5.5v-1a1.5 1.5 0 013 0v1m0 0V11m0-5.5a1.5 1.5 0 013 0v3m0 0V11\" />\n </svg>\n <span>手动排序</span>\n </div>\n </button>\n </div>\n </div>\n );\n};\n\nexport default SortModeToggle;\n","'use client';\n\nimport React from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { ExperimentCard } from '@/portfolio/ExperimentCard';\nimport type { ExperimentItem } from '../types';\n\nexport interface SortableExperimentItemProps {\n item: ExperimentItem;\n onMoveUp?: () => void;\n onMoveDown?: () => void;\n isFirst?: boolean;\n isLast?: boolean;\n}\n\nexport const SortableExperimentItem: React.FC<SortableExperimentItemProps> = ({ \n item, \n onMoveUp, \n onMoveDown,\n isFirst,\n isLast \n}) => {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: item.id });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n zIndex: isDragging ? 100 : 1,\n opacity: isDragging ? 0.8 : 1,\n position: 'relative' as const,\n };\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className=\"relative group\"\n >\n {/* 拖拽手柄 - 桌面端 */}\n <div\n {...attributes}\n {...listeners}\n className=\"absolute right-2 top-2 w-8 h-8 bg-white/80 hover:bg-white rounded-full flex items-center justify-center shadow-md z-10\n hidden sm:flex\n opacity-0 group-hover:opacity-100 transition-opacity\n cursor-grab active:cursor-grabbing\n touch-action-none\" /* 防止触摸设备上的滚动冲突 */\n onClick={(e) => e.stopPropagation()}\n aria-label=\"拖动排序\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5 text-gray-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 8h16M4 16h16\" />\n </svg>\n \n <span className=\"absolute top-full mt-1 left-1/2 transform -translate-x-1/2 text-xs bg-gray-800 text-white px-2 py-1 rounded whitespace-nowrap opacity-0 group-hover:opacity-100 transition-opacity\">\n 拖动排序\n </span>\n </div>\n\n {/* 移动端排序按钮组 */}\n <div className=\"absolute right-2 top-2 flex flex-col gap-2 sm:hidden z-10\">\n {/* 向上按钮 */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onMoveUp?.();\n }}\n disabled={isFirst}\n className={`w-8 h-8 rounded-full flex items-center justify-center shadow-md\n ${isFirst ? 'bg-gray-200 cursor-not-allowed' : 'bg-white/80 hover:bg-white active:bg-gray-100'}`}\n aria-label=\"向上移动\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`h-5 w-5 ${isFirst ? 'text-gray-400' : 'text-gray-500'}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n\n {/* 向下按钮 */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onMoveDown?.();\n }}\n disabled={isLast}\n className={`w-8 h-8 rounded-full flex items-center justify-center shadow-md\n ${isLast ? 'bg-gray-200 cursor-not-allowed' : 'bg-white/80 hover:bg-white active:bg-gray-100'}`}\n aria-label=\"向下移动\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`h-5 w-5 ${isLast ? 'text-gray-400' : 'text-gray-500'}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n\n {/* 实验卡片 */}\n <div className={`transition-all ${isDragging ? 'scale-105 shadow-xl' : ''}`}>\n <ExperimentCard\n href={item.path}\n title={item.title}\n description={item.description}\n tags={item.tags}\n category={item.category as any}\n isCompleted={item.isCompleted}\n updatedAt={item.updatedAt}\n createdAt={item.createdAt}\n />\n </div>\n </div>\n );\n};\n\nexport default SortableExperimentItem;\n","'use client';\n\nimport React, { useState } from 'react';\nimport type { ExperimentItem } from '../types';\nimport { \n DndContext, \n closestCenter, \n KeyboardSensor, \n PointerSensor, \n useSensor, \n useSensors,\n DragEndEvent,\n TouchSensor\n} from '@dnd-kit/core';\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n rectSortingStrategy\n} from '@dnd-kit/sortable';\nimport { SortableExperimentItem } from './SortableExperimentItem';\n\nexport interface DraggableExperimentGridProps {\n items: ExperimentItem[];\n onOrderChange?: (items: ExperimentItem[]) => void;\n className?: string;\n}\n\nexport const DraggableExperimentGrid: React.FC<DraggableExperimentGridProps> = ({ \n items: initialItems, \n onOrderChange,\n className = '' \n}) => {\n // 本地状态跟踪项目顺序\n const [items, setItems] = useState<ExperimentItem[]>(initialItems);\n const [isDragging, setIsDragging] = useState(false);\n\n // 设置传感器\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 8, // 需要拖动8px才激活,避免意外触发\n },\n }),\n useSensor(TouchSensor, {\n activationConstraint: {\n delay: 250, // 触摸需要按住250ms才激活,避免与点击冲突\n tolerance: 5, // 允许的移动容差\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n );\n\n // 处理拖拽开始事件\n function handleDragStart() {\n setIsDragging(true);\n }\n\n // 处理拖拽结束事件\n function handleDragEnd(event: DragEndEvent) {\n setIsDragging(false);\n \n const { active, over } = event;\n \n if (over && active.id !== over.id) {\n setItems((currentItems) => {\n // 找到拖拽项和目标项的索引\n const oldIndex = currentItems.findIndex(item => item.id === active.id);\n const newIndex = currentItems.findIndex(item => item.id === over.id);\n \n // 重新排序项目\n const newItems = arrayMove(currentItems, oldIndex, newIndex);\n \n // 如果提供了回调函数,通知父组件顺序变化\n if (onOrderChange) {\n onOrderChange(newItems);\n }\n \n return newItems;\n });\n }\n }\n\n // 处理向上移动\n const handleMoveUp = (index: number) => {\n if (index > 0) {\n setItems((currentItems) => {\n const newItems = arrayMove(currentItems, index, index - 1);\n onOrderChange?.(newItems);\n return newItems;\n });\n }\n };\n\n // 处理向下移动\n const handleMoveDown = (index: number) => {\n if (index < items.length - 1) {\n setItems((currentItems) => {\n const newItems = arrayMove(currentItems, index, index + 1);\n onOrderChange?.(newItems);\n return newItems;\n });\n }\n };\n\n // 当初始项目变化时更新本地状态\n React.useEffect(() => {\n setItems(initialItems);\n }, [initialItems]);\n\n return (\n <div className={`relative ${className}`}>\n <div className=\"mb-4 px-4 py-3 bg-blue-50 text-blue-700 rounded-lg border border-blue-200 text-sm\">\n <div className=\"flex items-start sm:items-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5 mr-2 flex-shrink-0 mt-0.5 sm:mt-0\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clipRule=\"evenodd\" />\n </svg>\n <div>\n <p className=\"mb-1\">拖拽卡片可以自定义排序。点击卡片可以访问对应的实验项目。</p>\n <p className=\"text-xs text-blue-600 sm:hidden\">点击卡片右上角的上下箭头按钮调整顺序</p>\n <p className=\"text-xs text-blue-600 hidden sm:block\">长按卡片右上角的拖动图标进行排序</p>\n </div>\n </div>\n </div>\n \n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n >\n <SortableContext\n items={items.map(item => item.id)}\n strategy={rectSortingStrategy}\n >\n <div className={`\n grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 md:gap-6\n ${isDragging ? 'cursor-grabbing' : ''}\n `}>\n {items.map((item, index) => (\n <SortableExperimentItem \n key={item.id} \n item={item}\n onMoveUp={() => handleMoveUp(index)}\n onMoveDown={() => handleMoveDown(index)}\n isFirst={index === 0}\n isLast={index === items.length - 1}\n />\n ))}\n </div>\n </SortableContext>\n </DndContext>\n </div>\n );\n};\n\nexport default DraggableExperimentGrid;\n","'use client';\n\nimport React from 'react';\nimport { BaseApiClient, UseAuthReturn, useAuth } from '@/auth';\nimport { Shield, AlertTriangle } from 'lucide-react';\nimport { ApiError } from '@/universalFile/server';\n\ninterface PermissionGuardProps {\n children: React.ReactNode;\n fallback?: React.ReactNode;\n apiClient: BaseApiClient;\n}\n\nexport const PermissionGuard: React.FC<PermissionGuardProps> = ({\n apiClient,\n children,\n fallback\n}) => {\n const { user, isLoggedIn } = useAuth(apiClient);\n\n // 检查用户是否有权限(所有登录用户都可以访问实验田)\n const hasPermission = () => {\n if (!isLoggedIn || !user) {\n return false;\n }\n\n // 实验田对所有登录用户开放\n return true;\n };\n\n if (!hasPermission()) {\n return (fallback as any) || (\n <div className=\"min-h-screen bg-gray-50 flex items-center justify-center\">\n <div className=\"max-w-md w-full bg-white rounded-lg shadow-lg p-8 text-center\">\n <div className=\"flex items-center justify-center mb-4\">\n <Shield className=\"w-12 h-12 text-red-500\" />\n </div>\n <h2 className=\"text-xl font-semibold text-gray-900 mb-2\">\n 需要登录\n </h2>\n <p className=\"text-gray-600 mb-4\">\n 请先登录以访问实验田功能。\n </p>\n <div className=\"flex items-center justify-center text-sm text-gray-500 mb-4\">\n <AlertTriangle className=\"w-4 h-4 mr-1\" />\n 实验田对所有注册用户开放\n </div>\n <button\n onClick={() => window.history.back()}\n className=\"inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-white bg-green-600 hover:bg-green-700\"\n >\n 返回上一页\n </button>\n </div>\n </div>\n );\n }\n\n return <>{children}</>;\n};\n\nexport default PermissionGuard;\n","'use client';\n\nimport React from 'react';\nimport { BaseApiClient, useAuth } from '@/auth';\nimport { LogOut, User, FlaskConical } from 'lucide-react';\n\nexport interface UserInfoBarProps {\n apiClient: BaseApiClient;\n}\n\nexport const UserInfoBar: React.FC<UserInfoBarProps> = ({ apiClient }) => {\n const { user, logout, isLoggedIn } = useAuth(apiClient);\n\n const handleLogout = async () => {\n try {\n await logout();\n // 登出后重定向到首页\n window.location.href = '/';\n } catch (error) {\n console.error('登出失败:', error);\n }\n };\n\n if (!isLoggedIn || !user) {\n return null;\n }\n\n return (\n <div className=\"bg-white border-b border-gray-200 px-4 py-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-3\">\n <div className=\"flex items-center space-x-2\">\n <User className=\"w-5 h-5 text-gray-600\" />\n <span className=\"text-sm font-medium text-gray-900\">\n {user.name || user.email || '用户'}\n </span>\n {user.role && (\n <span className=\"inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800\">\n {user.role}\n </span>\n )}\n </div>\n </div>\n \n <div className=\"flex items-center space-x-2\">\n <div className=\"flex items-center space-x-1 text-sm text-gray-500\">\n <FlaskConical className=\"w-4 h-4\" />\n <span>实验田</span>\n </div>\n \n <button\n onClick={handleLogout}\n className=\"inline-flex items-center px-3 py-1.5 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500\"\n >\n <LogOut className=\"w-4 h-4 mr-1\" />\n 登出\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default UserInfoBar;\n"]}
1
+ {"version":3,"sources":["../src/ai/ocr/hooks/useOCR.ts","../src/ai/ocr/components/OCRScanner.tsx","../src/ai/background-removal/hooks/useBackgroundRemoval.ts","../src/ai/background-removal/components/BackgroundRemover.tsx","../src/ai/sentiment-analysis/hooks/useSentimentAnalysis.ts","../src/ai/sentiment-analysis/components/SentimentAnalyzer.tsx","../src/ai/text-generation/hooks/useTextGeneration.ts","../src/ai/text-generation/components/SmartAssistant.tsx","../src/profile/ProfileModal.tsx","../src/profile/internal/BadgeList.tsx","../src/profile/internal/Stat.tsx","../src/profile/internal/StatList.tsx","../src/profile/ProfileButton.tsx","../src/profile/AutoOpenModal.tsx","../src/profile/EnhancedAvatar.tsx","../src/portfolio/About.tsx","../src/portfolio/Contact.tsx","../src/portfolio/Home.tsx","../src/portfolio/ExperimentCard.tsx","../src/portfolio/ProjectCarousel.tsx","../src/navigation/NavigationItem.tsx","../src/navigation/Navigation.tsx","../src/navigation/NavigationToggle.tsx","../src/navigation/FloatingMenu.tsx","../src/navigation/FloatingMenuExample.tsx","../src/testField/utils/index.ts","../src/testField/components/CategoryFilter.tsx","../src/testField/components/CompletionFilter.tsx","../src/testField/components/PageHeader.tsx","../src/testField/components/ExperimentGrid.tsx","../src/testField/components/EmptyState.tsx","../src/testField/components/SortControl.tsx","../src/testField/components/SortModeToggle.tsx","../src/testField/components/SortableExperimentItem.tsx","../src/testField/components/DraggableExperimentGrid.tsx","../src/testField/components/PermissionGuard.tsx","../src/testField/components/UserInfoBar.tsx"],"names":["useState","useRef","useCallback","createWorker","useEffect","React","Upload","X","Loader2","FileText","Eraser","Download","Smile","Frown","Meh","MessageSquare","Send","Bot","User","cn","Dialog","DialogContent","Avatar","AvatarImage","AvatarFallback","Badge","Button","Timeline","CollisionBalls","Link","createPortal","FilterButtonGroup","BackButton","Grid","useSortable","CSS","useSensors","useSensor","PointerSensor","TouchSensor","KeyboardSensor","sortableKeyboardCoordinates","arrayMove","DndContext","closestCenter","SortableContext","rectSortingStrategy","useAuth","Shield","AlertTriangle","FlaskConical","LogOut"],"mappings":"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","file":"index.js","sourcesContent":["import { useState, useCallback, useRef, useEffect } from 'react';\nimport { createWorker, Worker } from 'tesseract.js';\nimport { OCRResult, OCROptions, OCRState } from '../types';\n\nexport const useOCR = (options: OCROptions = {}) => {\n const [state, setState] = useState<OCRState>({\n isProcessing: false,\n progress: 0,\n status: 'idle',\n error: null,\n result: null,\n });\n\n const workerRef = useRef<Worker | null>(null);\n\n const cleanup = useCallback(async () => {\n if (workerRef.current) {\n await workerRef.current.terminate();\n workerRef.current = null;\n }\n }, []);\n\n const recognize = useCallback(\n async (image: string | File | Blob | HTMLImageElement | HTMLCanvasElement) => {\n setState((prev) => ({\n ...prev,\n isProcessing: true,\n error: null,\n progress: 0,\n status: 'initializing',\n }));\n\n try {\n const worker = await createWorker(options.language || 'eng', 1, {\n logger: (m) => {\n if (m.status === 'recognizing text') {\n setState((prev) => ({\n ...prev,\n status: 'recognizing',\n progress: m.progress,\n }));\n }\n options.logger?.(m);\n },\n });\n\n workerRef.current = worker;\n\n const { data } = await worker.recognize(image);\n\n // In some versions of tesseract.js, words and lines are not directly on data\n // We extract them from blocks if needed\n const words = (data as any).words || data.blocks?.flatMap(b => b.paragraphs.flatMap(p => p.lines.flatMap(l => l.words))) || [];\n const lines = (data as any).lines || data.blocks?.flatMap(b => b.paragraphs.flatMap(p => p.lines)) || [];\n\n const result: OCRResult = {\n text: data.text,\n confidence: data.confidence,\n words: words.map((w: any) => ({\n text: w.text,\n confidence: w.confidence,\n bbox: w.bbox,\n })),\n lines: lines.map((l: any) => l.text),\n };\n\n setState((prev) => ({\n ...prev,\n isProcessing: false,\n progress: 1,\n status: 'completed',\n result,\n }));\n\n await worker.terminate();\n workerRef.current = null;\n\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setState((prev) => ({\n ...prev,\n isProcessing: false,\n status: 'error',\n error,\n }));\n throw error;\n }\n },\n [options]\n );\n\n useEffect(() => {\n return () => {\n cleanup();\n };\n }, [cleanup]);\n\n return {\n ...state,\n recognize,\n cleanup,\n };\n};\n\n\n\n\n\n\n\n","import React, { useState, useRef } from 'react';\nimport { useOCR } from '../hooks/useOCR';\nimport { Loader2, Upload, FileText, Image as ImageIcon, X } from 'lucide-react';\n\ninterface OCRScannerProps {\n onResult?: (text: string) => void;\n className?: string;\n language?: string;\n}\n\nexport const OCRScanner: React.FC<OCRScannerProps> = ({\n onResult,\n className = '',\n language = 'eng',\n}) => {\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n \n const { recognize, isProcessing, progress, status, result, error } = useOCR({\n language,\n });\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n // Create preview\n const reader = new FileReader();\n reader.onload = (event) => {\n setImagePreview(event.target?.result as string);\n };\n reader.readAsDataURL(file);\n\n try {\n const ocrResult = await recognize(file);\n onResult?.(ocrResult.text);\n } catch (err) {\n console.error('OCR Error:', err);\n }\n };\n\n const reset = () => {\n setImagePreview(null);\n if (fileInputRef.current) fileInputRef.current.value = '';\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n const handleDrop = async (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n \n const file = e.dataTransfer.files?.[0];\n if (file && file.type.startsWith('image/')) {\n const mockEvent = { target: { files: [file] } } as unknown as React.ChangeEvent<HTMLInputElement>;\n handleFileChange(mockEvent);\n }\n };\n\n return (\n <div \n className={`p-6 border-2 border-dashed rounded-xl transition-all ${\n isProcessing ? 'border-blue-400 bg-blue-50/10' : 'border-gray-200 hover:border-blue-400'\n } ${className}`}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {!imagePreview ? (\n <div \n className=\"flex flex-col items-center justify-center cursor-pointer space-y-4\"\n onClick={() => fileInputRef.current?.click()}\n >\n <div className=\"p-4 bg-blue-50 rounded-full text-blue-500\">\n <Upload size={32} />\n </div>\n <div className=\"text-center\">\n <p className=\"text-lg font-medium text-gray-700\">点击或拖拽图片进行 OCR 识别</p>\n <p className=\"text-sm text-gray-500\">支持 JPG, PNG, WebP</p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div className=\"relative group rounded-lg overflow-hidden border border-gray-200\">\n <img \n src={imagePreview} \n alt=\"Preview\" \n className={`max-h-64 mx-auto object-contain transition-opacity ${isProcessing ? 'opacity-50' : 'opacity-100'}`}\n />\n {!isProcessing && (\n <button \n onClick={reset}\n className=\"absolute top-2 right-2 p-1 bg-white/80 rounded-full hover:bg-white text-gray-600 shadow-sm\"\n >\n <X size={18} />\n </button>\n )}\n \n {isProcessing && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/5\">\n <Loader2 className=\"animate-spin text-blue-500 mb-2\" size={32} />\n <div className=\"w-48 bg-gray-200 rounded-full h-1.5 overflow-hidden\">\n <div \n className=\"bg-blue-500 h-full transition-all duration-300\"\n style={{ width: `${progress * 100}%` }}\n />\n </div>\n <p className=\"text-xs font-medium text-blue-600 mt-2\">\n {status === 'initializing' ? '正在加载引擎...' : `识别中 ${Math.round(progress * 100)}%`}\n </p>\n </div>\n )}\n </div>\n\n {result && !isProcessing && (\n <div className=\"bg-gray-50 p-4 rounded-lg border border-gray-100 animate-in fade-in slide-in-from-bottom-2\">\n <div className=\"flex items-center gap-2 mb-2 text-gray-600 font-medium\">\n <FileText size={18} />\n <span>识别结果 (置信度: {Math.round(result.confidence)}%)</span>\n </div>\n <pre className=\"text-sm text-gray-800 whitespace-pre-wrap font-sans\">\n {result.text}\n </pre>\n </div>\n )}\n\n {error && (\n <div className=\"p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100\">\n 识别失败: {error.message}\n </div>\n )}\n </div>\n )}\n\n <input\n type=\"file\"\n ref={fileInputRef}\n className=\"hidden\"\n accept=\"image/*\"\n onChange={handleFileChange}\n disabled={isProcessing}\n />\n </div>\n );\n};\n\n\n\n\n\n\n\n","import { useState, useCallback, useEffect } from 'react';\nimport { BackgroundRemovalOptions, BackgroundRemovalState } from '../types';\n\nexport const useBackgroundRemoval = (options: BackgroundRemovalOptions = {}) => {\n const [state, setState] = useState<BackgroundRemovalState>({\n isProcessing: false,\n progress: 0,\n status: 'idle',\n error: null,\n resultBlob: null,\n resultUrl: null,\n });\n\n const remove = useCallback(async (image: string | File | Blob | HTMLImageElement | URL) => {\n setState(prev => ({\n ...prev,\n isProcessing: true,\n error: null,\n progress: 0,\n status: 'initializing',\n }));\n\n try {\n const originalKeys = Object.keys;\n const win = (typeof window !== 'undefined' ? window : globalThis) as any;\n const originalProcess = win.process;\n let backgroundRemoval;\n\n try {\n // 环境盾牌:防止库初始化时 Object.keys(null) 崩溃\n (Object as any).keys = function(obj: any) {\n if (obj === null || obj === undefined) return [];\n return originalKeys.call(Object, obj);\n };\n\n if (typeof window !== 'undefined') {\n try {\n Object.defineProperty(win, 'process', {\n value: { env: {}, versions: {}, release: { name: 'node' } },\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n \n backgroundRemoval = await import('@imgly/background-removal');\n } finally {\n Object.keys = originalKeys;\n if (typeof window !== 'undefined' && originalProcess) {\n try {\n Object.defineProperty(win, 'process', {\n value: originalProcess,\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n }\n\n const { removeBackground } = backgroundRemoval;\n\n const config: any = {\n progress: (status: string, progress: number) => {\n setState(prev => ({\n ...prev,\n status,\n progress,\n }));\n options.progress?.(status, progress);\n },\n model: options.model || 'small',\n publicPath: options.publicPath,\n fetchArgs: options.fetchArgs,\n };\n\n const blob = await removeBackground(image, config);\n const url = URL.createObjectURL(blob);\n\n setState(prev => ({\n ...prev,\n isProcessing: false,\n progress: 1,\n status: 'completed',\n resultBlob: blob,\n resultUrl: url,\n }));\n\n return { blob, url };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error('AI Background Removal Error:', msg);\n setState(prev => ({\n ...prev,\n isProcessing: false,\n status: 'error',\n error: new Error(msg),\n }));\n throw err;\n }\n }, [options]);\n\n const cleanup = useCallback(() => {\n if (state.resultUrl) {\n URL.revokeObjectURL(state.resultUrl);\n }\n }, [state.resultUrl]);\n\n useEffect(() => {\n return () => cleanup();\n }, [cleanup]);\n\n return {\n ...state,\n remove,\n cleanup,\n };\n};\n","import React, { useState, useRef } from 'react';\nimport { useBackgroundRemoval } from '../hooks/useBackgroundRemoval';\nimport { Loader2, Upload, Download, Image as ImageIcon, X, Eraser } from 'lucide-react';\n\ninterface BackgroundRemoverProps {\n onResult?: (blob: Blob, url: string) => void;\n className?: string;\n}\n\nexport const BackgroundRemover: React.FC<BackgroundRemoverProps> = ({\n onResult,\n className = '',\n}) => {\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n \n const { remove, isProcessing, progress, status, resultUrl, error } = useBackgroundRemoval();\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n const reader = new FileReader();\n reader.onload = (event) => {\n setImagePreview(event.target?.result as string);\n };\n reader.readAsDataURL(file);\n\n try {\n const { blob, url } = await remove(file);\n onResult?.(blob, url);\n } catch (err) {\n console.error('Background Removal Error:', err);\n }\n };\n\n const reset = () => {\n setImagePreview(null);\n if (fileInputRef.current) fileInputRef.current.value = '';\n };\n\n const downloadResult = () => {\n if (!resultUrl) return;\n const a = document.createElement('a');\n a.href = resultUrl;\n a.download = 'removed_background.png';\n a.click();\n };\n\n return (\n <div className={`p-6 border-2 border-dashed rounded-xl transition-all ${\n isProcessing ? 'border-purple-400 bg-purple-50/10' : 'border-gray-200 hover:border-purple-400'\n } ${className}`}>\n {!imagePreview ? (\n <div \n className=\"flex flex-col items-center justify-center cursor-pointer space-y-4\"\n onClick={() => fileInputRef.current?.click()}\n >\n <div className=\"p-4 bg-purple-50 rounded-full text-purple-500\">\n <Eraser size={32} />\n </div>\n <div className=\"text-center\">\n <p className=\"text-lg font-medium text-gray-700\">上传图片移除背景</p>\n <p className=\"text-sm text-gray-500\">建议使用主体明确的图片</p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium text-gray-500 uppercase tracking-wider\">原图</p>\n <div className=\"relative rounded-lg overflow-hidden border border-gray-200 bg-gray-50\">\n <img src={imagePreview} alt=\"Original\" className=\"max-h-64 mx-auto object-contain\" />\n </div>\n </div>\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium text-gray-500 uppercase tracking-wider\">处理结果</p>\n <div className=\"relative rounded-lg overflow-hidden border border-gray-200 bg-grid-slate-100 bg-[size:20px_20px]\">\n {resultUrl ? (\n <img src={resultUrl} alt=\"Result\" className=\"max-h-64 mx-auto object-contain animate-in fade-in zoom-in-95 duration-500\" />\n ) : (\n <div className=\"h-64 flex flex-col items-center justify-center text-gray-400\">\n {isProcessing ? (\n <>\n <Loader2 className=\"animate-spin text-purple-500 mb-2\" size={32} />\n <div className=\"w-32 bg-gray-200 rounded-full h-1.5 overflow-hidden\">\n <div \n className=\"bg-purple-500 h-full transition-all duration-300\"\n style={{ width: `${progress * 100}%` }}\n />\n </div>\n <p className=\"text-[10px] mt-2 font-mono uppercase\">{status.replace(/-/g, ' ')}</p>\n </>\n ) : (\n <span className=\"text-sm italic\">等待处理...</span>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n\n <div className=\"flex justify-between items-center pt-2\">\n {!isProcessing && (\n <button \n onClick={reset}\n className=\"flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-600 hover:text-gray-900 transition-colors\"\n >\n <X size={16} />\n 重新开始\n </button>\n )}\n \n {resultUrl && !isProcessing && (\n <button \n onClick={downloadResult}\n className=\"flex items-center gap-2 px-6 py-2 bg-purple-600 hover:bg-purple-700 text-white rounded-lg shadow-sm transition-all\"\n >\n <Download size={16} />\n 下载 PNG\n </button>\n )}\n </div>\n\n {error && (\n <div className=\"p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100\">\n 处理失败: {error.message}\n </div>\n )}\n </div>\n )}\n\n <input\n type=\"file\"\n ref={fileInputRef}\n className=\"hidden\"\n accept=\"image/*\"\n onChange={handleFileChange}\n disabled={isProcessing}\n />\n </div>\n );\n};\n\n\n\n\n\n\n\n","import { useState, useCallback, useRef } from 'react';\nimport { SentimentResult, SentimentOptions, SentimentState } from '../types';\n\nexport const useSentimentAnalysis = (options: SentimentOptions = {}) => {\n const [state, setState] = useState<SentimentState>({\n isProcessing: false,\n status: 'idle',\n error: null,\n result: null,\n });\n\n const pipelineRef = useRef<any | null>(null);\n\n const analyze = useCallback(async (text: string) => {\n setState(prev => ({\n ...prev,\n isProcessing: true,\n error: null,\n status: 'loading model',\n }));\n\n try {\n if (!pipelineRef.current) {\n const originalKeys = Object.keys;\n const win = (typeof window !== 'undefined' ? window : globalThis) as any;\n const originalProcess = win.process;\n\n let transformers;\n try {\n (Object as any).keys = function(obj: any) {\n if (obj === null || obj === undefined) return [];\n return originalKeys.call(Object, obj);\n };\n if (typeof window !== 'undefined') {\n try {\n Object.defineProperty(win, 'process', {\n value: { env: {}, versions: {}, release: { name: 'node' }, nextTick: (cb: any) => setTimeout(cb, 0) },\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n transformers = await import('@xenova/transformers');\n } finally {\n Object.keys = originalKeys;\n if (typeof window !== 'undefined' && originalProcess) {\n try {\n Object.defineProperty(win, 'process', { value: originalProcess, configurable: true, writable: true });\n } catch (e) {}\n }\n }\n\n const { pipeline, env } = transformers;\n env.allowLocalModels = false;\n if (env.backends?.onnx) {\n env.backends.onnx.wasm.proxy = true;\n }\n\n const defaultModel = 'Xenova/distilbert-base-multilingual-cased-sentiments-student';\n \n pipelineRef.current = await pipeline('sentiment-analysis', options.model || defaultModel);\n }\n\n setState(prev => ({ ...prev, status: 'analyzing' }));\n \n const output = await pipelineRef.current(text);\n const resultData = output[0];\n\n const label = resultData.label.toLowerCase();\n let sentiment: 'positive' | 'negative' | 'neutral' = 'neutral';\n \n // 增强逻辑:针对中文常见消极词汇进行本地加权\n const negativeKeywords = ['累', '惨', '绝望', '难受', '伤心', '差', '坏', '糟', '不行'];\n const hasNegativeKeyword = negativeKeywords.some(k => text.includes(k));\n\n if (label.includes('positive') && !hasNegativeKeyword) {\n sentiment = 'positive';\n } else if (label.includes('negative') || label.includes('0') || hasNegativeKeyword) {\n sentiment = 'negative';\n }\n\n const result: SentimentResult = {\n label: resultData.label,\n score: resultData.score,\n sentiment,\n };\n\n setState(prev => ({\n ...prev,\n isProcessing: false,\n status: 'completed',\n result,\n }));\n\n return result;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error('AI Sentiment Error:', msg);\n setState(prev => ({ ...prev, isProcessing: false, status: 'error', error: new Error(msg) }));\n throw err;\n }\n }, [options.model]);\n\n return { ...state, analyze };\n};\n\n\n\n\n\n\n\n","import React, { useState } from 'react';\nimport { useSentimentAnalysis } from '../hooks/useSentimentAnalysis';\nimport { MessageSquare, Send, Loader2, Smile, Frown, Meh } from 'lucide-react';\n\ninterface SentimentAnalyzerProps {\n onResult?: (result: any) => void;\n className?: string;\n placeholder?: string;\n}\n\nexport const SentimentAnalyzer: React.FC<SentimentAnalyzerProps> = ({\n onResult,\n className = '',\n placeholder = '输入一段中文或英文,分析其情感倾向...',\n}) => {\n const [text, setText] = useState('');\n const { analyze, isProcessing, status, result, error } = useSentimentAnalysis();\n\n const handleAnalyze = async () => {\n if (!text.trim() || isProcessing) return;\n try {\n const res = await analyze(text);\n onResult?.(res);\n } catch (err) {\n console.error('Sentiment Analysis Error:', err);\n }\n };\n\n const getSentimentIcon = () => {\n if (!result) return null;\n switch (result.sentiment) {\n case 'positive': return <Smile className=\"text-green-500\" size={24} />;\n case 'negative': return <Frown className=\"text-red-500\" size={24} />;\n default: return <Meh className=\"text-yellow-500\" size={24} />;\n }\n };\n\n const getSentimentColor = () => {\n if (!result) return '';\n switch (result.sentiment) {\n case 'positive': return 'bg-green-50 border-green-200 text-green-700';\n case 'negative': return 'bg-red-50 border-red-200 text-red-700';\n default: return 'bg-yellow-50 border-yellow-200 text-yellow-700';\n }\n };\n\n return (\n <div className={`p-6 border rounded-xl bg-white dark:bg-gray-800 shadow-sm ${className}`}>\n <div className=\"flex items-center gap-2 mb-4 text-gray-700 dark:text-gray-300 font-medium\">\n <MessageSquare size={20} />\n <span>文本情感分析</span>\n </div>\n\n <div className=\"relative\">\n <textarea\n value={text}\n onChange={(e) => setText(e.target.value)}\n placeholder={placeholder}\n className=\"w-full h-32 p-4 bg-gray-50 dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all outline-none resize-none text-gray-800 dark:text-gray-200\"\n disabled={isProcessing}\n />\n <button\n onClick={handleAnalyze}\n disabled={!text.trim() || isProcessing}\n className=\"absolute bottom-3 right-3 p-2 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 text-white rounded-md transition-colors shadow-sm\"\n >\n {isProcessing ? <Loader2 className=\"animate-spin\" size={18} /> : <Send size={18} />}\n </button>\n </div>\n\n {isProcessing && (\n <div className=\"mt-4 flex items-center gap-2 text-sm text-blue-600 animate-pulse\">\n <Loader2 size={14} className=\"animate-spin\" />\n <span>正在分析 (首次运行将加载模型资源)...</span>\n </div>\n )}\n\n {result && !isProcessing && (\n <div className={`mt-4 p-4 border rounded-lg flex items-center gap-4 animate-in fade-in slide-in-from-top-2 ${getSentimentColor()}`}>\n <div className=\"p-2 bg-white rounded-full shadow-sm\">\n {getSentimentIcon()}\n </div>\n <div>\n <p className=\"font-bold text-lg capitalize\">{result.sentiment}</p>\n <p className=\"text-sm opacity-80\">\n 置信度: {(result.score * 100).toFixed(1)}% ({result.label})\n </p>\n </div>\n </div>\n )}\n\n {error && (\n <div className=\"mt-4 p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100\">\n 分析失败: {error.message}\n </div>\n )}\n </div>\n );\n};\n\n\n\n\n\n\n\n","import { useState, useCallback, useRef } from 'react';\nimport { TextGenerationOptions, TextGenerationState } from '../types';\n\nexport const useTextGeneration = (options: TextGenerationOptions = {}) => {\n const [state, setState] = useState<TextGenerationState>({\n isProcessing: false,\n status: 'idle',\n error: null,\n result: null,\n });\n\n const pipelineRef = useRef<any | null>(null);\n\n const generate = useCallback(async (prompt: string) => {\n console.log('[AI] Generating for prompt:', prompt);\n \n setState((prev: TextGenerationState) => ({\n ...prev,\n isProcessing: true,\n error: null,\n status: 'initializing',\n }));\n\n try {\n if (!pipelineRef.current) {\n const originalKeys = Object.keys;\n const win = (typeof window !== 'undefined' ? window : globalThis) as any;\n const originalProcess = win.process;\n\n let transformers;\n try {\n (Object as any).keys = function(obj: any) {\n if (obj === null || obj === undefined) return [];\n return originalKeys.call(Object, obj);\n };\n if (typeof window !== 'undefined') {\n try {\n Object.defineProperty(win, 'process', {\n value: { env: {}, versions: {}, release: { name: 'node' }, nextTick: (cb: any) => setTimeout(cb, 0), cwd: () => '/', browser: true },\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n transformers = await import('@xenova/transformers');\n } finally {\n Object.keys = originalKeys;\n if (typeof window !== 'undefined' && originalProcess) {\n try {\n Object.defineProperty(win, 'process', { value: originalProcess, configurable: true, writable: true });\n } catch (e) {}\n }\n }\n\n const { pipeline, env } = transformers;\n env.allowLocalModels = false;\n if (env.backends?.onnx) {\n env.backends.onnx.wasm.proxy = true;\n }\n\n const modelName = options.model || 'Xenova/LaMini-Flan-T5-77M';\n pipelineRef.current = await pipeline('text2text-generation', modelName, {\n progress_callback: (info: any) => {\n if (info.status === 'progress') {\n setState((prev: TextGenerationState) => ({ ...prev, status: `loading model: ${Math.round(info.progress)}%` }));\n }\n }\n });\n }\n\n setState((prev: TextGenerationState) => ({ ...prev, status: 'thinking' }));\n \n // 优化生成参数,使其对小模型更友好\n const output = await pipelineRef.current(prompt, {\n max_new_tokens: options.max_new_tokens || 64,\n temperature: options.temperature || 0.5, // 稍微提高温度\n do_sample: true, // 开启采样,避免空输出\n top_k: 50,\n repetition_penalty: 1.1,\n });\n\n const result = output[0].generated_text || '';\n console.log('[AI] Raw result:', result);\n\n setState((prev: TextGenerationState) => ({\n ...prev,\n isProcessing: false,\n status: 'completed',\n result,\n }));\n\n return result;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error('[AI] Error:', err);\n setState((prev: TextGenerationState) => ({ ...prev, isProcessing: false, status: 'error', error: new Error(msg) }));\n throw err;\n }\n }, [options.model, options.max_new_tokens, options.temperature]);\n\n return { ...state, generate };\n};\n\n\n","import React, { useState, useRef, useEffect } from 'react';\nimport { useTextGeneration } from '../hooks/useTextGeneration';\nimport { Bot, User, Send, Loader2 } from 'lucide-react';\n\ninterface SmartAssistantProps {\n className?: string;\n}\n\nexport const SmartAssistant: React.FC<SmartAssistantProps> = ({ className = '' }) => {\n const [input, setInput] = useState('');\n const [chatHistory, setChatHistory] = useState<Array<{ role: 'user' | 'assistant', content: string }>>([]);\n const scrollRef = useRef<HTMLDivElement>(null);\n \n const { generate, isProcessing: isGenerating, status: genStatus } = useTextGeneration();\n\n useEffect(() => {\n if (scrollRef.current) {\n scrollRef.current.scrollTop = scrollRef.current.scrollHeight;\n }\n }, [chatHistory, isGenerating]);\n\n const handleSend = async () => {\n if (!input.trim() || isGenerating) return;\n\n const userMessage = input.trim();\n setInput('');\n setChatHistory(prev => [...prev, { role: 'user', content: userMessage }]);\n\n // --- 1. 本地硬规则匹配 (意图识别) ---\n // 对于 77M 模型,某些固定回复由逻辑生成效果更好\n let finalContent = '';\n const lowerMessage = userMessage.toLowerCase();\n \n if (lowerMessage.includes('你好') || lowerMessage.includes('hello') || lowerMessage.includes('hi')) {\n finalContent = '你好呀!我是 sa2kit 的本地 AI 助手,很高兴能和你聊天。😊';\n } else if (lowerMessage.includes('谁') || lowerMessage.includes('who are you')) {\n finalContent = '我是一个完全运行在你浏览器本地的小型 AI 模型,我不需要服务器,非常保护你的隐私。';\n } else if (lowerMessage.includes('天气')) {\n finalContent = '虽然我看不见外面的阳光,但听你的语气,今天一定是个适合出门的好天气!☀️';\n } else if (lowerMessage.includes('累') || lowerMessage.includes('难过') || lowerMessage.includes('绝望')) {\n finalContent = '听起来你现在心情不太好... 抱抱你,我会一直在这里陪你聊天的。❤️';\n }\n\n // 如果命中了硬规则,直接显示并返回,不再调用模型\n if (finalContent) {\n // 模拟一点点思考时间,体验更自然\n setTimeout(() => {\n setChatHistory(prev => [...prev, { role: 'assistant', content: finalContent }]);\n }, 500);\n return;\n }\n\n // --- 2. 调用模型生成 (针对非固定意图) ---\n const prompt = `对话。\n人说:“${userMessage}”\nAI回应:“`;\n\n try {\n const response = await generate(prompt);\n \n // 深度清理模型输出\n let modelOutput = response\n .replace(/^AI回应:|^AI:|^Assistant:|^回答:|^答:|^Answer:/i, '')\n .replace(/[. ]*Positive[. ]*|[. ]*Negative[. ]*|[. ]*Neutral[. ]*/gi, '') // 拦截情绪单词\n .replace(/^[\"'“]|[\"'”]$/g, '') // 去掉引号\n .trim();\n\n // --- 3. 结果质量检查 (Recovery) ---\n // 如果模型返回包含大量英文、或者是废话、或者太短\n const isEnglishTrash = /[a-zA-Z]{5,}/.test(modelOutput) && !/[一-龥]/.test(modelOutput);\n const isTooShort = modelOutput.length < 1;\n\n if (isEnglishTrash || isTooShort) {\n console.warn('[AI] Model failure, triggering smart recovery. Raw was:', response);\n modelOutput = '嗯嗯,我正在听。关于“' + userMessage.slice(0, 6) + '...”,你还有什么想分享的吗?';\n }\n\n setChatHistory(prev => [...prev, { role: 'assistant', content: modelOutput }]);\n } catch (err) {\n setChatHistory(prev => [...prev, { role: 'assistant', content: '(本地模型思考过度,暂时休息中...)' }]);\n }\n };\n\n return (\n <div className={`flex flex-col h-[500px] bg-white dark:bg-gray-800 rounded-xl shadow-inner border border-gray-100 dark:border-gray-700 overflow-hidden ${className}`}>\n <div ref={scrollRef} className=\"flex-1 overflow-y-auto p-4 space-y-4 bg-gray-50/50 dark:bg-gray-900/50\">\n {chatHistory.length === 0 && (\n <div className=\"h-full flex flex-col items-center justify-center text-gray-400 space-y-2\">\n <Bot size={48} className=\"opacity-20\" />\n <p className=\"text-sm italic text-center px-8 text-gray-400 font-sans\">\n 你好!我是 100% 本地运行的 AI。<br/>\n 你可以和我聊聊天,我会尝试理解你的意思。\n </p>\n </div>\n )}\n {chatHistory.map((msg, i) => (\n <div key={i} className={`flex ${msg.role === 'user' ? 'justify-end' : 'justify-start'} animate-in fade-in slide-in-from-bottom-2`}>\n <div className={`flex gap-3 max-w-[85%] ${msg.role === 'user' ? 'flex-row-reverse' : ''}`}>\n <div className={`p-2 rounded-lg h-fit ${msg.role === 'user' ? 'bg-blue-100 text-blue-600' : 'bg-white dark:bg-gray-700 shadow-sm border border-gray-100 dark:border-gray-600 text-gray-400'}`}>\n {msg.role === 'user' ? <User size={18} /> : <Bot size={18} />}\n </div>\n <div className={`p-3 rounded-2xl shadow-sm text-sm ${\n msg.role === 'user' \n ? 'bg-blue-600 text-white rounded-tr-none' \n : 'bg-white dark:bg-gray-700 text-gray-800 dark:text-gray-200 rounded-tl-none border border-gray-100 dark:border-gray-600 leading-relaxed'\n }`}>\n {msg.content}\n </div>\n </div>\n </div>\n ))}\n {isGenerating && (\n <div className=\"flex justify-start\">\n <div className=\"flex gap-3 items-center bg-white dark:bg-gray-700 p-3 rounded-2xl rounded-tl-none border border-gray-100 dark:border-gray-600\">\n <Loader2 className=\"animate-spin text-blue-500\" size={16} />\n <div className=\"flex flex-col\">\n <span className=\"text-xs text-gray-500 font-medium\">思考中...</span>\n <span className=\"text-[10px] text-blue-400 font-mono tracking-tighter\">{genStatus}</span>\n </div>\n </div>\n </div>\n )}\n </div>\n\n <div className=\"p-4 bg-white dark:bg-gray-800 border-t border-gray-100 dark:border-gray-700\">\n <div className=\"relative flex items-center gap-2\">\n <input\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && handleSend()}\n placeholder=\"输入文字...\"\n className=\"flex-1 bg-gray-50 dark:bg-gray-900 border-none rounded-full px-5 py-3 pr-12 text-sm focus:ring-2 focus:ring-blue-500 outline-none dark:text-white text-gray-800\"\n disabled={isGenerating}\n />\n <button\n onClick={handleSend}\n disabled={!input.trim() || isGenerating}\n className=\"absolute right-1 p-2.5 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 text-white rounded-full transition-all shadow-md active:scale-95 flex items-center justify-center\"\n >\n <Send size={18} />\n </button>\n </div>\n </div>\n </div>\n );\n};\n\n\n\n\n\n\n\n","'use client';\n\nimport React from 'react';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from '@/components/Dialog';\nimport { Avatar, AvatarImage, AvatarFallback } from '@/components/Avatar';\nimport { ProfileData, SocialLink } from './types';\nimport { cn } from '@/utils';\n\nconst themeStyles = {\n light: \"\",\n dark: \"bg-[#222] text-[#eee] border-[#444]\",\n blue: \"bg-[#f0f8ff] border-[#1890ff]/20\",\n};\n\nexport interface ProfileModalProps {\n isOpen: boolean;\n onClose: () => void;\n data: ProfileData;\n showAvatar?: boolean;\n showContacts?: boolean;\n showSocial?: boolean;\n showBio?: boolean;\n avatarSize?: number;\n onAvatarClick?: () => void;\n onSocialLinkClick?: (url: string, type: string) => void;\n onContactClick?: (type: string, value: string) => void;\n themeName?: 'light' | 'dark' | 'blue';\n className?: string;\n children?: React.ReactNode;\n}\n\nexport const ProfileModal: React.FC<ProfileModalProps> = ({\n isOpen,\n onClose,\n data,\n showAvatar = true,\n showContacts = true,\n showSocial = true,\n showBio = true,\n avatarSize = 80,\n onAvatarClick,\n onSocialLinkClick,\n onContactClick,\n themeName = 'light',\n className,\n}) => {\n // 渲染社交媒体链接\n const renderSocialLinks = () => {\n if (!data.socialLinks || data.socialLinks.length === 0) return null;\n return (\n <div className=\"flex gap-3 mt-2\">\n {data.socialLinks.map((link: SocialLink, index: number) => (\n <a\n key={index}\n href={link.url}\n className={cn(\n \"w-8 h-8 flex items-center justify-center rounded-full no-underline transition-all hover:-translate-y-0.5\",\n themeName === 'dark' ? \"bg-gray-800 text-gray-200 hover:bg-gray-700\" : \"bg-gray-100 text-gray-800 hover:bg-gray-200\"\n )}\n title={link.type}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(e) => {\n if (onSocialLinkClick) {\n e.preventDefault();\n onSocialLinkClick(link.url, link.type);\n }\n }}\n >\n {link.icon ? (\n <span className=\"text-base\">{link.icon}</span>\n ) : (\n <span className=\"text-[10px] font-semibold\">{link.type}</span>\n )}\n </a>\n ))}\n </div>\n );\n };\n\n // 渲染联系方式\n const renderContacts = () => {\n if (!data.contacts || Object.keys(data.contacts).length === 0) return null;\n return (\n <div className={cn(\n \"mt-4 border-t pt-4\",\n themeName === 'dark' ? \"border-gray-800\" : \"border-gray-100\"\n )}>\n {Object.entries(data.contacts).map(([type, value], index) => (\n <div \n key={index} \n className={cn(\n \"flex mb-2 cursor-pointer py-1.5 px-2 rounded transition-colors\",\n themeName === 'dark' ? \"hover:bg-gray-800\" : \"hover:bg-gray-50\"\n )}\n onClick={() => onContactClick && onContactClick(type, value)}\n >\n <span className={cn(\n \"font-medium w-[70px] shrink-0\",\n themeName === 'dark' ? \"text-gray-400\" : \"text-gray-500\"\n )}>{type}:</span>\n <span className={themeName === 'dark' ? \"text-gray-200\" : \"text-gray-800\"}>{value}</span>\n </div>\n ))}\n </div>\n );\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open: boolean) => !open && onClose()}>\n <DialogContent className={cn(\n \"sm:max-w-[500px] p-0 overflow-hidden border-none shadow-2xl\",\n themeStyles[themeName as keyof typeof themeStyles] || \"\",\n className\n )}>\n <div className=\"p-6\">\n <div className=\"flex gap-5 mb-5\">\n {showAvatar && (\n <div \n className=\"shrink-0\"\n onClick={onAvatarClick}\n style={{ cursor: onAvatarClick ? 'pointer' : 'default' }}\n >\n <Avatar className=\"border-2 border-primary/10 shadow-sm\" style={{ width: avatarSize, height: avatarSize }}>\n {data.avatar && <AvatarImage src={data.avatar} alt={data.name} className=\"object-cover\" />}\n <AvatarFallback className=\"text-xl\">\n {data.name.substring(0, 2).toUpperCase()}\n </AvatarFallback>\n </Avatar>\n </div>\n )}\n <div className=\"flex-1 min-w-0 flex flex-col justify-center\">\n <h2 className={cn(\n \"text-2xl font-bold m-0 mb-1\",\n themeName === 'dark' ? \"text-white\" : \"text-gray-900\"\n )}>{data.name}</h2>\n {data.title && <div className={cn(\n \"text-sm mb-2\",\n themeName === 'dark' ? \"text-gray-400\" : \"text-gray-500\"\n )}>{data.title}</div>}\n {showSocial && renderSocialLinks()}\n </div>\n </div>\n \n {showBio && data.bio && (\n <div className={cn(\n \"mb-5 leading-relaxed text-sm\",\n themeName === 'dark' ? \"text-gray-300\" : \"text-gray-600\"\n )}>\n <p>{data.bio}</p>\n </div>\n )}\n \n {showContacts && renderContacts()}\n \n {data.customContent && (\n <div className=\"mt-5\">\n {data.customContent}\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport default ProfileModal;\n","import React from 'react';\nimport { Badge } from '@/components/Badge';\nimport { cn } from '@/utils';\nimport { BadgeType } from '../types';\n \ninterface BadgeListProps {\n badges: BadgeType[];\n className?: string;\n}\n\nexport const BadgeList: React.FC<BadgeListProps> = ({\n badges,\n className = '',\n}) => {\n if (!badges || badges.length === 0) return null;\n\n return (\n <div className={cn(\"flex flex-wrap gap-2 mt-4\", className)}>\n {badges.map((badge, index) => (\n <Badge \n key={index} \n variant={badge.type === 'default' ? 'default' : (badge.type as any)}\n >\n {badge.icon && <span className=\"mr-1\">{badge.icon}</span>}\n {badge.label}\n </Badge>\n ))}\n </div>\n );\n};\n","import { StatType } from '..';\nimport { cn } from '@/utils';\n\ninterface StatProps extends StatType {\n className?: string;\n}\n\nexport const Stat: React.FC<StatProps> = ({\n label,\n value,\n icon,\n className = '',\n}) => {\n return (\n <div className={cn(\"flex flex-col items-center flex-1 text-center\", className)}>\n {icon && <span className=\"mb-2 text-2xl text-gray-400\">{icon}</span>}\n <div>\n <div className=\"text-lg font-semibold text-gray-800\">{value}</div>\n <div className=\"text-xs text-gray-400 mt-1\">{label}</div>\n </div>\n </div>\n );\n};\n","import { StatType } from \"..\";\nimport { Stat } from \"./Stat\";\nimport { cn } from '@/utils';\n\ninterface StatListProps {\n stats: StatType[];\n className?: string;\n}\n\nexport const StatList: React.FC<StatListProps> = ({\n stats,\n className = '',\n}) => {\n if (!stats || stats.length === 0) return null;\n\n return (\n <div className={cn(\"flex justify-between mt-4 pt-4 border-t border-gray-100\", className)}>\n {stats.map((stat, index) => (\n <Stat key={index} {...stat} />\n ))}\n </div>\n );\n}; ","'use client';\n\nimport React, { useState } from 'react';\nimport ProfileModal from './ProfileModal';\nimport { ProfileData } from './types';\nimport { BadgeList } from './internal/BadgeList';\nimport { StatList } from './internal/StatList';\nimport { Button } from '@/components/Button';\n\n// 示例数据\nconst exampleProfileData: ProfileData = {\n name: '张三',\n avatar: 'https://randomuser.me/api/portraits/men/32.jpg',\n title: '高级前端工程师',\n bio: '专注于React和Next.js开发的前端工程师,有5年工作经验。热爱开源,喜欢分享技术经验。',\n contacts: {\n '邮箱': 'zhangsan@example.com',\n '电话': '138-8888-8888',\n '地址': '上海市浦东新区',\n },\n socialLinks: [\n { type: 'GitHub', url: 'https://github.com/zhangsan', icon: '★' },\n { type: 'Twitter', url: 'https://twitter.com/zhangsan', icon: '✦' },\n { type: 'LinkedIn', url: 'https://linkedin.com/in/zhangsan', icon: '✪' },\n ],\n badges: [\n { label: 'React', type: 'primary' },\n { label: 'Next.js', type: 'success' },\n { label: 'TypeScript', type: 'info' },\n { label: 'CSS', type: 'default' },\n ],\n stats: [\n { label: '项目', value: 42 },\n { label: '粉丝', value: 1024 },\n { label: '评分', value: '4.9' },\n ],\n customContent: (\n <div className=\"mt-5 border-t border-gray-100 pt-4\">\n <h3 className=\"text-sm font-semibold mb-2\">专业技能</h3>\n <p className=\"text-sm text-gray-600 leading-relaxed\">\n 精通React、Vue、Angular等前端框架,熟悉TypeScript、JavaScript、CSS3、HTML5等前端技术。\n 有丰富的大型项目开发经验,能独立负责前端架构设计。\n </p>\n </div>\n ),\n};\n\nexport interface ProfileButtonProps {\n data?: ProfileData;\n buttonText?: string;\n variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';\n size?: 'default' | 'sm' | 'lg' | 'icon';\n className?: string;\n modalTheme?: 'light' | 'dark' | 'blue';\n}\n\n/**\n * 个人信息按钮组件,点击后显示个人信息弹窗\n */\nexport const ProfileButton: React.FC<ProfileButtonProps> = ({\n data = exampleProfileData,\n buttonText = '查看个人信息',\n variant = 'default',\n size = 'default',\n className = '',\n modalTheme = 'light',\n}) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const openModal = () => setIsModalOpen(true);\n const closeModal = () => setIsModalOpen(false);\n\n const handleContactClick = (type: string, value: string) => {\n if (type === '邮箱') {\n window.open(`mailto:${value}`);\n } else if (type === '电话') {\n window.open(`tel:${value}`);\n }\n };\n\n return (\n <>\n <Button \n variant={variant}\n size={size}\n onClick={openModal} \n className={className}\n >\n {buttonText}\n </Button>\n\n <ProfileModal\n isOpen={isModalOpen}\n onClose={closeModal}\n data={data}\n themeName={modalTheme}\n onContactClick={handleContactClick}\n onSocialLinkClick={(url) => window.open(url, '_blank')}\n >\n {data.customContent}\n {data.badges && <BadgeList badges={data.badges} />}\n {data.stats && <StatList stats={data.stats} />}\n </ProfileModal>\n </>\n );\n};\n\nexport default ProfileButton;\n","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport ProfileModal from './ProfileModal';\nimport { ProfileData } from './types';\nimport { BadgeList } from './internal/BadgeList';\nimport { StatList } from './internal/StatList';\n\nexport interface AutoOpenModalProps {\n data: ProfileData;\n delay?: number; // 延迟显示时间(毫秒)\n themeName?: 'light' | 'dark' | 'blue';\n onClose?: () => void;\n}\n\n/**\n * 自动打开个人信息弹窗组件\n * 页面加载后自动显示弹窗\n */\nexport const AutoOpenModal: React.FC<AutoOpenModalProps> = ({\n data,\n delay = 500, // 默认延迟500毫秒\n themeName = 'light',\n onClose,\n}) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n // 页面加载后自动显示弹窗\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsModalOpen(true);\n }, delay);\n\n return () => clearTimeout(timer);\n }, [delay]);\n\n const handleClose = () => {\n setIsModalOpen(false);\n if (onClose) {\n onClose();\n }\n };\n\n const handleContactClick = (type: string, value: string) => {\n if (type === '邮箱') {\n window.open(`mailto:${value}`);\n } else if (type === '电话') {\n window.open(`tel:${value}`);\n }\n };\n\n return (\n <ProfileModal\n isOpen={isModalOpen}\n onClose={handleClose}\n data={data}\n themeName={themeName}\n onContactClick={handleContactClick}\n onSocialLinkClick={(url) => window.open(url, '_blank')}\n >\n {data.badges && <BadgeList badges={data.badges} />}\n {data.stats && <StatList stats={data.stats} />}\n </ProfileModal>\n );\n};\n\nexport default AutoOpenModal;\n","'use client';\n\nimport React from 'react';\nimport { Avatar, AvatarImage, AvatarFallback } from '@/components/Avatar';\nimport { cn } from '@/utils';\n\nexport interface EnhancedAvatarProps {\n src?: string;\n name?: string;\n size?: 'small' | 'medium' | 'large' | number;\n mood?: 'online' | 'offline' | 'away';\n statusText?: string;\n onClick?: () => void;\n className?: string;\n}\n\nconst sizeMap = {\n small: 'h-8 w-8',\n medium: 'h-12 w-12',\n large: 'h-16 w-16',\n};\n\nconst moodColors = {\n online: 'bg-green-500',\n offline: 'bg-gray-500',\n away: 'bg-yellow-500',\n};\n\nexport const EnhancedAvatar: React.FC<EnhancedAvatarProps> = ({\n src,\n name,\n size = 'medium',\n mood = 'online',\n statusText,\n onClick,\n className,\n}) => {\n const sizeClass = typeof size === 'string' ? sizeMap[size] : '';\n const customSizeStyle = typeof size === 'number' ? { width: size, height: size } : {};\n\n return (\n <div className={cn(\"relative inline-block\", className)} onClick={onClick}>\n <Avatar className={cn(sizeClass, onClick && \"cursor-pointer hover:ring-2 hover:ring-blue-500 transition-all\")} style={customSizeStyle}>\n {src && <AvatarImage src={src} alt={name || \"Avatar\"} className=\"object-cover\" />}\n <AvatarFallback className=\"bg-primary/10 text-primary-foreground\">\n {name ? name.substring(0, 2).toUpperCase() : '??'}\n </AvatarFallback>\n </Avatar>\n \n {mood && (\n <div\n className={cn(\n \"absolute bottom-0 right-0 rounded-full border-2 border-white\",\n moodColors[mood],\n typeof size === 'number' ? (size > 60 ? 'h-4 w-4' : 'h-3 w-3') : (size === 'large' ? 'h-4 w-4' : 'h-3 w-3')\n )}\n />\n )}\n \n {statusText && (\n <div className=\"absolute -bottom-6 left-1/2 transform -translate-x-1/2 whitespace-nowrap\">\n <span className=\"text-xs text-muted-foreground\">{statusText}</span>\n </div>\n )}\n </div>\n );\n};\n\nexport default EnhancedAvatar;\n","'use client';\n\nimport React from \"react\";\n\nimport { CollisionBalls, Timeline } from \"@/components\";\nimport type { TimelineConfig, CollisionBallsConfig } from \"@/components\";\n\ninterface AboutProps {\n timelineConfig: TimelineConfig;\n collisionBallsConfig: CollisionBallsConfig;\n}\n\nconst About: React.FC<AboutProps> = ({\n timelineConfig,\n collisionBallsConfig,\n}) => {\n return (\n <section id=\"about\" className=\"py-16 bg-white\">\n <div className=\"container mx-auto px-4\">\n <h2 className=\"text-3xl font-bold text-center mb-12\">关于我</h2>\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-12\">\n <div className=\"bg-white rounded-lg shadow-lg p-6\">\n <h3 className=\"text-2xl font-semibold mb-6\">个人经历</h3>\n <Timeline items={timelineConfig.items} />\n </div>\n <div className=\"bg-white rounded-lg shadow-lg p-6\">\n <h3 className=\"text-2xl font-semibold mb-6\">技能展示</h3>\n <div style={{ height: '400px', position: 'relative' }}>\n <CollisionBalls collisionBallsConfig={collisionBallsConfig} />\n </div>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default About;\n","'use client';\n\nimport React, { useState } from 'react';\n\ninterface FormData {\n name: string;\n email: string;\n message: string;\n}\n\nconst Contact: React.FC = () => {\n const [formData, setFormData] = useState<FormData>({\n name: '',\n email: '',\n message: ''\n });\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitStatus, setSubmitStatus] = useState<'idle' | 'success' | 'error'>('idle');\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const { name, value } = e.target;\n setFormData(prev => ({\n ...prev,\n [name]: value\n }));\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setIsSubmitting(true);\n setSubmitStatus('idle');\n\n try {\n // 这里添加你的表单提交逻辑\n await new Promise(resolve => setTimeout(resolve, 1000)); // 模拟API调用\n setSubmitStatus('success');\n setFormData({ name: '', email: '', message: '' });\n } catch (error) {\n setSubmitStatus('error');\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <section id=\"contact\" className=\"py-16 bg-gray-50\">\n <div className=\"max-w-4xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"text-center mb-12\">\n <h2 className=\"text-3xl font-bold text-gray-900 sm:text-4xl\">\n 联系我\n </h2>\n <p className=\"mt-4 text-lg text-gray-600\">\n 有任何问题或建议?请随时联系我\n </p>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-xl p-6 sm:p-8\">\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n <div>\n <label htmlFor=\"name\" className=\"block text-sm font-medium text-gray-700\">\n 姓名\n </label>\n <input\n type=\"text\"\n name=\"name\"\n id=\"name\"\n value={formData.name}\n onChange={handleChange}\n required\n className=\"mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm\"\n placeholder=\"请输入您的姓名\"\n />\n </div>\n\n <div>\n <label htmlFor=\"email\" className=\"block text-sm font-medium text-gray-700\">\n 邮箱\n </label>\n <input\n type=\"email\"\n name=\"email\"\n id=\"email\"\n value={formData.email}\n onChange={handleChange}\n required\n className=\"mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm\"\n placeholder=\"请输入您的邮箱\"\n />\n </div>\n\n <div>\n <label htmlFor=\"message\" className=\"block text-sm font-medium text-gray-700\">\n 消息\n </label>\n <textarea\n name=\"message\"\n id=\"message\"\n rows={4}\n value={formData.message}\n onChange={handleChange}\n required\n className=\"mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm\"\n placeholder=\"请输入您的消息\"\n />\n </div>\n\n <div className=\"flex items-center justify-end\">\n <button\n type=\"submit\"\n disabled={isSubmitting}\n className={`inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white \n ${isSubmitting \n ? 'bg-blue-400 cursor-not-allowed' \n : 'bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500'\n }`}\n >\n {isSubmitting ? '发送中...' : '发送消息'}\n </button>\n </div>\n\n {submitStatus === 'success' && (\n <div className=\"rounded-md bg-green-50 p-4\">\n <div className=\"flex\">\n <div className=\"flex-shrink-0\">\n <svg className=\"h-5 w-5 text-green-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <div className=\"ml-3\">\n <p className=\"text-sm font-medium text-green-800\">\n 消息已成功发送!\n </p>\n </div>\n </div>\n </div>\n )}\n\n {submitStatus === 'error' && (\n <div className=\"rounded-md bg-red-50 p-4\">\n <div className=\"flex\">\n <div className=\"flex-shrink-0\">\n <svg className=\"h-5 w-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <div className=\"ml-3\">\n <p className=\"text-sm font-medium text-red-800\">\n 发送失败,请稍后重试\n </p>\n </div>\n </div>\n </div>\n )}\n </form>\n </div>\n\n {/* 联系方式 */}\n <div className=\"mt-12 grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3\">\n <div className=\"bg-white rounded-lg shadow-lg p-6 text-center\">\n <div className=\"text-blue-600 mb-4\">\n <svg className=\"h-8 w-8 mx-auto\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\" />\n </svg>\n </div>\n <h3 className=\"text-lg font-medium text-gray-900\">邮箱</h3>\n <p className=\"mt-2 text-gray-600\">your.email@example.com</p>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-lg p-6 text-center\">\n <div className=\"text-blue-600 mb-4\">\n <svg className=\"h-8 w-8 mx-auto\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z\" />\n </svg>\n </div>\n <h3 className=\"text-lg font-medium text-gray-900\">电话</h3>\n <p className=\"mt-2 text-gray-600\">+86 123 4567 8900</p>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-lg p-6 text-center\">\n <div className=\"text-blue-600 mb-4\">\n <svg className=\"h-8 w-8 mx-auto\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </div>\n <h3 className=\"text-lg font-medium text-gray-900\">地址</h3>\n <p className=\"mt-2 text-gray-600\">中国,北京</p>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default Contact; ","'use client';\n\nimport React, { useEffect, useState } from \"react\";\nimport { cn } from '@/utils';\n\nexport interface HomeConfig {\n title: string;\n subtitle: string;\n buttons: Array<{\n text: string;\n link: string;\n }>;\n imageSrc: string;\n}\n\ninterface HomeProps {\n homeConfig: HomeConfig;\n className?: string;\n}\n\nexport const Home: React.FC<HomeProps> = ({ homeConfig, className }) => {\n const { title, subtitle, buttons, imageSrc } = homeConfig;\n const [displayText, setDisplayText] = useState(\"\");\n const [currentIndex, setCurrentIndex] = useState(0);\n\n useEffect(() => {\n if (currentIndex < title.length) {\n const timer = setTimeout(() => {\n setDisplayText((prev) => prev + title[currentIndex]);\n setCurrentIndex((prev) => prev + 1);\n }, 150);\n\n return () => clearTimeout(timer);\n }\n return () => {\n setDisplayText(\"\");\n setCurrentIndex(0);\n };\n }, [currentIndex, title]);\n\n return (\n <section \n id=\"home\" \n className={cn(\"min-h-screen flex items-center justify-center py-16 bg-gradient-to-b from-white to-gray-50\", className)}\n >\n <div className=\"container mx-auto px-4\">\n <div className=\"flex flex-col md:flex-row items-center gap-12\">\n <div className=\"flex-1 text-center md:text-left\">\n <h1 className=\"text-4xl md:text-6xl font-bold mb-6 text-gray-900\">\n <span className=\"inline-block\">{displayText}</span>\n <span className=\"animate-pulse ml-1 text-blue-500\">|</span>\n </h1>\n <p className=\"text-xl md:text-2xl text-gray-600 mb-8\">{subtitle}</p>\n <div className=\"flex flex-wrap gap-4 justify-center md:justify-start\">\n {buttons.map((button) => (\n <a\n key={button.link}\n href={button.link}\n className=\"px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-all duration-300 shadow-md hover:shadow-lg font-medium\"\n >\n {button.text}\n </a>\n ))}\n </div>\n </div>\n <div className=\"flex-1\">\n <div className=\"relative group\">\n <div className=\"absolute -inset-1 bg-gradient-to-r from-blue-600 to-purple-600 rounded-lg blur opacity-25 group-hover:opacity-50 transition duration-1000 group-hover:duration-200\"></div>\n <img\n src={imageSrc}\n alt=\"Profile\"\n className=\"relative w-full max-w-md mx-auto rounded-lg shadow-xl transform hover:scale-[1.02] transition-transform duration-300 bg-white\"\n />\n </div>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default Home;\n\n","'use client';\n\nimport React from 'react';\nimport Link from 'next/link';\nimport { cn } from '@/utils';\n\nexport interface ExperimentCardProps {\n href: string;\n title: string;\n description: string;\n tags: string[];\n category: 'utility' | 'leisure';\n isCompleted?: boolean;\n updatedAt?: string;\n createdAt?: string;\n className?: string;\n}\n\nexport const ExperimentCard: React.FC<ExperimentCardProps> = ({ \n href, \n title, \n description, \n tags, \n category, \n isCompleted,\n updatedAt,\n createdAt,\n className\n}) => {\n // 格式化日期显示\n const formatDate = (dateString?: string) => {\n if (!dateString) return '';\n \n try {\n const date = new Date(dateString);\n return date.toLocaleDateString('zh-CN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n });\n } catch (e) {\n return dateString;\n }\n };\n \n return (\n <Link href={href} className={cn(\"block group\", className)}>\n <div className=\"w-full h-full bg-white rounded-2xl overflow-hidden shadow-md hover:shadow-2xl transition-all duration-300 transform group-hover:-translate-y-1 border border-gray-100 hover:border-gray-200\">\n <div className=\"p-6\">\n <div className=\"flex items-start justify-between mb-4\">\n <h3 className=\"text-xl font-semibold text-gray-900 flex-1 pr-4 leading-tight\">\n {title}\n </h3>\n <div className=\"flex flex-col gap-2 flex-shrink-0\">\n <span className={cn(\n \"px-3 py-1.5 text-xs font-medium rounded-full shadow-sm\",\n category === 'utility' \n ? 'bg-gradient-to-r from-green-50 to-green-100 text-green-700 border border-green-200' \n : 'bg-gradient-to-r from-purple-50 to-purple-100 text-purple-700 border border-purple-200'\n )}>\n {category === 'utility' ? '🔧 实用工具' : '🎮 休闲娱乐'}\n </span>\n <span className={cn(\n \"px-3 py-1.5 text-xs font-medium rounded-full shadow-sm border\",\n isCompleted \n ? 'bg-gradient-to-r from-emerald-50 to-emerald-100 text-emerald-700 border border-emerald-200' \n : 'bg-gradient-to-r from-orange-50 to-orange-100 text-orange-700 border border-orange-200'\n )}>\n {isCompleted ? '✅ 已完成' : '🚧 进行中'}\n </span>\n </div>\n </div>\n <p className=\"text-gray-600 mb-4\">{description}</p>\n \n {/* 显示更新时间 */}\n {updatedAt && (\n <div className=\"flex items-center gap-1 mb-3 text-xs text-gray-500\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span>更新于: {formatDate(updatedAt)}</span>\n {createdAt && createdAt !== updatedAt && (\n <span className=\"ml-2 text-gray-400\">创建于: {formatDate(createdAt)}</span>\n )}\n </div>\n )}\n \n <div className=\"flex flex-wrap gap-2\">\n {tags.map((tag) => (\n <span\n key={tag}\n className=\"px-3 py-1.5 text-xs font-medium bg-gradient-to-r from-gray-50 to-gray-100 text-gray-700 rounded-full border border-gray-200 shadow-sm hover:shadow-md transition-shadow duration-200\"\n >\n #{tag}\n </span>\n ))}\n </div>\n </div>\n </div>\n </Link>\n );\n};\n\nexport default ExperimentCard;\n\n","'use client';\n\nimport React, { useState } from 'react';\nimport { ExperimentCard } from './ExperimentCard';\nimport { cn } from '@/utils';\n\n// Project相关的类型定义\nexport interface Project {\n id: string;\n title: string;\n description: string;\n image: string;\n link?: string;\n tags: string[];\n}\n\nexport interface ProjectsConfig {\n projects: Project[];\n}\n\ninterface ProjectCarouselProps {\n projects: Project[];\n className?: string;\n}\n\nexport const ProjectCarousel: React.FC<ProjectCarouselProps> = ({ projects, className }) => {\n const [currentIndex, setCurrentIndex] = useState(0);\n\n const nextSlide = () => {\n setCurrentIndex((prevIndex) =>\n prevIndex === projects.length - 1 ? 0 : prevIndex + 1\n );\n };\n\n const prevSlide = () => {\n setCurrentIndex((prevIndex) =>\n prevIndex === 0 ? projects.length - 1 : prevIndex - 1\n );\n };\n\n return (\n <section id=\"projects\" className={cn(\"py-16 bg-gray-50\", className)}>\n <div className=\"container mx-auto px-4\">\n <h2 className=\"text-3xl font-bold text-center mb-12 text-gray-900\">项目展示</h2>\n \n <div className=\"relative max-w-4xl mx-auto\">\n {/* 项目卡片 */}\n <div className=\"relative h-[400px] overflow-hidden rounded-lg shadow-xl\">\n {projects.map((project, index) => (\n <div\n key={project.id}\n className={cn(\n \"absolute w-full h-full transition-all duration-500 transform\",\n index === currentIndex\n ? \"translate-x-0 opacity-100\"\n : index < currentIndex\n ? \"-translate-x-full opacity-0\"\n : \"translate-x-full opacity-0\"\n )}\n >\n <ExperimentCard\n href={project.link || '#'}\n title={project.title}\n description={project.description}\n tags={project.tags}\n category=\"utility\"\n />\n </div>\n ))}\n </div>\n\n {/* 导航按钮 */}\n <button\n onClick={prevSlide}\n className=\"absolute left-4 top-1/2 -translate-y-1/2 p-2 rounded-full bg-white/80 hover:bg-white shadow-lg focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all z-10\"\n >\n <svg\n className=\"w-6 h-6 text-gray-600\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n\n <button\n onClick={nextSlide}\n className=\"absolute right-4 top-1/2 -translate-y-1/2 p-2 rounded-full bg-white/80 hover:bg-white shadow-lg focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all z-10\"\n >\n <svg\n className=\"w-6 h-6 text-gray-600\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n\n {/* 指示器 */}\n <div className=\"absolute bottom-4 left-1/2 transform -translate-x-1/2 flex space-x-2 z-10\">\n {projects.map((_, index) => (\n <button\n key={index}\n onClick={() => setCurrentIndex(index)}\n className={cn(\n \"w-2 h-2 rounded-full transition-all duration-300\",\n index === currentIndex ? \"bg-blue-500 w-4\" : \"bg-gray-300\"\n )}\n />\n ))}\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default ProjectCarousel;\n\n"," 'use client';\n\nimport React from 'react';\nimport { NavigationItem, NavigationDirection } from './types';\n\ninterface NavigationItemProps {\n item: NavigationItem;\n direction: NavigationDirection;\n isActive?: boolean;\n onClick: (item: NavigationItem) => void;\n}\n\nconst NavigationItemComponent: React.FC<NavigationItemProps> = ({\n item,\n direction,\n isActive,\n onClick\n}) => {\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault();\n onClick(item);\n };\n\n const getItemClasses = () => {\n const baseClasses = `\n group relative flex items-center gap-3\n transition-all duration-300 ease-in-out\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50\n rounded-lg\n `;\n\n const directionClasses = direction === 'vertical'\n ? 'px-4 py-3 w-full justify-start'\n : 'px-3 py-2 justify-center';\n\n const stateClasses = isActive\n ? 'bg-blue-500 text-white shadow-lg'\n : item.isExternal\n ? 'text-gray-700 hover:bg-purple-50 hover:text-purple-600 border border-purple-200'\n : 'text-gray-700 hover:bg-blue-50 hover:text-blue-600';\n\n return `${baseClasses} ${directionClasses} ${stateClasses}`;\n };\n\n return (\n <a\n href={item.href}\n onClick={handleClick}\n target={item.target}\n rel={item.isExternal ? 'noopener noreferrer' : undefined}\n className={getItemClasses()}\n >\n {/* 图标 */}\n {item.icon && (\n <span className=\"flex-shrink-0\">\n {item.icon}\n </span>\n )}\n\n {/* 标签 */}\n <span className={`font-medium ${direction === 'vertical' ? 'text-sm' : 'text-xs'}`}>\n {item.label}\n </span>\n\n {/* 外链图标 */}\n {item.isExternal && (\n <svg\n className=\"w-3 h-3 opacity-60 group-hover:opacity-100 transition-opacity\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"\n />\n </svg>\n )}\n\n {/* 活动状态指示器 */}\n {direction === 'vertical' && isActive && (\n <div className=\"absolute left-1 top-1/2 transform -translate-y-1/2 w-1 h-6 bg-white rounded-full\" />\n )}\n </a>\n );\n};\n\nexport default NavigationItemComponent;"," 'use client';\n\nimport React from 'react';\nimport NavigationItem from './NavigationItem';\nimport { NavigationProps } from './types';\n\nconst Navigation: React.FC<NavigationProps> = ({\n config,\n isOpen,\n activeItemId,\n onItemClick,\n className = ''\n}) => {\n const { direction, position, items, avatar, logo } = config;\n\n // 获取导航栏位置和尺寸样式\n const getContainerClasses = () => {\n const baseClasses = `\n fixed z-[90]\n bg-white/95 backdrop-blur-lg\n border border-gray-200/50\n shadow-2xl\n transition-all duration-500 ease-in-out\n `;\n\n // 根据方向和位置确定样式\n if (direction === 'vertical') {\n const verticalClasses = 'h-screen w-64 flex flex-col';\n const positionClasses = position === 'left' \n ? `left-0 top-0 ${isOpen ? 'translate-x-0' : '-translate-x-full'}`\n : `right-0 top-0 ${isOpen ? 'translate-x-0' : 'translate-x-full'}`;\n \n return `${baseClasses} ${verticalClasses} ${positionClasses}`;\n } else {\n const horizontalClasses = 'w-full h-16 flex items-center';\n const positionClasses = position === 'top'\n ? `top-0 left-0 right-0 ${isOpen ? 'translate-y-0' : '-translate-y-full'}`\n : `bottom-0 left-0 right-0 ${isOpen ? 'translate-y-0' : 'translate-y-full'}`;\n \n return `${baseClasses} ${horizontalClasses} ${positionClasses}`;\n }\n };\n\n // 获取内容布局样式\n const getContentClasses = () => {\n if (direction === 'vertical') {\n return 'flex flex-col h-full p-4';\n } else {\n return 'flex items-center justify-between w-full px-6';\n }\n };\n\n // 获取导航项列表样式\n const getItemsListClasses = () => {\n if (direction === 'vertical') {\n return 'flex flex-col gap-2 flex-1 overflow-y-auto mt-4';\n } else {\n return 'flex items-center gap-4';\n }\n };\n\n const handleItemClick = (item: any) => {\n // 处理页面跳转\n if (item.isExternal) {\n // 外链跳转\n window.open(item.href, item.target || '_blank');\n } else if (item.href.startsWith('#')) {\n // 锚点跳转\n const element = document.getElementById(item.id);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth' });\n }\n } else {\n // 内部页面跳转\n window.location.href = item.href;\n }\n\n // 触发回调\n onItemClick?.(item);\n };\n\n if (!isOpen) return null;\n\n return (\n <nav className={`${getContainerClasses()} ${className}`}>\n <div className={getContentClasses()}>\n {/* Logo 区域 */}\n {logo && (\n <div className=\"flex items-center justify-center mb-4\">\n <img\n src={logo.src}\n alt={logo.alt || 'Logo'}\n className=\"h-8 w-auto\"\n />\n </div>\n )}\n\n {/* 顶部空间占位(为切换按钮预留) */}\n {direction === 'vertical' && (\n <div className=\"h-12 flex-shrink-0\" />\n )}\n\n {/* 导航项列表 */}\n <div className={getItemsListClasses()}>\n {items.map((item) => (\n <NavigationItem\n key={item.id}\n item={item}\n direction={direction}\n isActive={activeItemId === item.id}\n onClick={handleItemClick}\n />\n ))}\n </div>\n\n {/* 头像区域 */}\n {avatar && direction === 'vertical' && (\n <div className=\"flex items-center justify-center mt-auto pt-4\">\n <img\n src={avatar.src}\n alt={avatar.alt || 'Avatar'}\n className=\"w-10 h-10 rounded-full border-2 border-gray-200\"\n />\n </div>\n )}\n\n {/* 水平布局的头像 */}\n {avatar && direction === 'horizontal' && (\n <div className=\"flex items-center\">\n <img\n src={avatar.src}\n alt={avatar.alt || 'Avatar'}\n className=\"w-8 h-8 rounded-full border-2 border-gray-200\"\n />\n </div>\n )}\n </div>\n </nav>\n );\n};\n\nexport default Navigation;"," 'use client';\n\nimport React from 'react';\nimport { NavigationPosition } from './types';\n\ninterface NavigationToggleProps {\n isOpen: boolean;\n onClick: () => void;\n position: NavigationPosition;\n}\n\nconst NavigationToggle: React.FC<NavigationToggleProps> = ({\n isOpen,\n onClick,\n position\n}) => {\n const getPositionClasses = () => {\n switch (position) {\n case 'top':\n return 'top-4 left-4';\n case 'bottom':\n return 'bottom-4 left-4';\n case 'left':\n return 'top-4 left-4';\n case 'right':\n return 'top-4 right-4';\n default:\n return 'top-4 left-4';\n }\n };\n\n return (\n <button\n onClick={onClick}\n className={`\n fixed ${getPositionClasses()} z-[100]\n p-3 rounded-xl\n bg-white/90 backdrop-blur-md\n shadow-lg hover:shadow-xl\n border border-gray-200/50\n transition-all duration-300 ease-in-out\n hover:scale-105 active:scale-95\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50\n `}\n aria-label={isOpen ? '关闭导航栏' : '打开导航栏'}\n >\n <div className=\"w-5 h-5 flex flex-col justify-center items-center\">\n <span\n className={`\n block w-5 h-0.5 bg-gray-600 rounded-full\n transform transition-all duration-300 ease-in-out\n ${isOpen ? 'rotate-45 translate-y-0.5' : ''}\n `}\n />\n <span\n className={`\n block w-5 h-0.5 bg-gray-600 rounded-full\n transform transition-all duration-300 ease-in-out mt-1\n ${isOpen ? 'opacity-0 scale-0' : 'opacity-100 scale-100'}\n `}\n />\n <span\n className={`\n block w-5 h-0.5 bg-gray-600 rounded-full\n transform transition-all duration-300 ease-in-out mt-1\n ${isOpen ? '-rotate-45 -translate-y-2.5' : ''}\n `}\n />\n </div>\n </button>\n );\n};\n\nexport default NavigationToggle;","'use client';\n\nimport React, { useState, useRef, useEffect, ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport interface FloatingMenuProps {\n /**\n * 触发按钮的内容\n */\n trigger: ReactNode;\n \n /**\n * 菜单内容\n */\n menu: ReactNode;\n \n /**\n * 初始位置\n */\n initialPosition?: { x: number; y: number };\n \n /**\n * 是否默认打开菜单\n */\n defaultOpen?: boolean;\n \n /**\n * 自定义类名\n */\n className?: string;\n \n /**\n * 菜单类名\n */\n menuClassName?: string;\n \n /**\n * 触发器类名\n */\n triggerClassName?: string;\n \n /**\n * z-index\n */\n zIndex?: number;\n}\n\nconst FloatingMenu: React.FC<FloatingMenuProps> = ({\n trigger,\n menu,\n initialPosition = { x: 20, y: 20 },\n defaultOpen = false,\n className = '',\n menuClassName = '',\n triggerClassName = '',\n zIndex = 1000,\n}) => {\n const [position, setPosition] = useState(initialPosition);\n const [isMenuOpen, setIsMenuOpen] = useState(defaultOpen);\n const [menuDirection, setMenuDirection] = useState<'left' | 'right'>('right');\n const [isDragging, setIsDragging] = useState(false);\n const [dragOffset, setDragOffset] = useState({ x: 0, y: 0 });\n const containerRef = useRef<HTMLDivElement>(null);\n const [mounted, setMounted] = useState(false);\n // 添加一个标志,用于跟踪是否发生了拖动\n const [hasDragged, setHasDragged] = useState(false);\n // 添加一个计时器引用,用于区分点击和拖动\n const dragTimerRef = useRef<number | null>(null);\n // 添加一个引用,记录鼠标按下的初始位置\n const mouseDownPosRef = useRef<{ x: number, y: number } | null>(null);\n\n // 客户端挂载检查\n useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n // 计算菜单方向\n useEffect(() => {\n if (!mounted || !containerRef.current) return;\n \n const updateMenuDirection = () => {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n \n const windowWidth = window.innerWidth;\n const middlePoint = windowWidth / 2;\n \n // 如果悬浮窗在屏幕左半部分,菜单向右展开;否则向左展开\n setMenuDirection(rect.left < middlePoint ? 'right' : 'left');\n };\n \n updateMenuDirection();\n \n // 监听窗口大小变化和滚动事件\n window.addEventListener('resize', updateMenuDirection);\n window.addEventListener('scroll', updateMenuDirection);\n \n return () => {\n window.removeEventListener('resize', updateMenuDirection);\n window.removeEventListener('scroll', updateMenuDirection);\n };\n }, [mounted]);\n\n // 处理拖动开始\n const handleMouseDown = (e: React.MouseEvent) => {\n if (!containerRef.current) return;\n \n // 防止触发菜单点击\n e.stopPropagation();\n \n // 记录鼠标按下的初始位置\n mouseDownPosRef.current = { x: e.clientX, y: e.clientY };\n \n const rect = containerRef.current.getBoundingClientRect();\n setDragOffset({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top\n });\n \n // 重置拖动标志\n setHasDragged(false);\n \n // 设置拖动状态\n setIsDragging(true);\n };\n\n // 处理拖动过程\n useEffect(() => {\n if (!isDragging) return;\n \n const handleMouseMove = (e: MouseEvent) => {\n // 检查是否移动了足够的距离来认为是拖动\n if (mouseDownPosRef.current) {\n const dx = Math.abs(e.clientX - mouseDownPosRef.current.x);\n const dy = Math.abs(e.clientY - mouseDownPosRef.current.y);\n \n // 如果移动距离超过阈值,标记为拖动\n if (dx > 3 || dy > 3) {\n setHasDragged(true);\n }\n }\n \n // 计算新位置并应用边界检查\n const newX = e.clientX - dragOffset.x;\n const newY = e.clientY - dragOffset.y;\n \n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n \n setPosition({\n x: Math.min(Math.max(newX, 0), windowWidth - 50),\n y: Math.min(Math.max(newY, 0), windowHeight - 50)\n });\n };\n \n const handleMouseUp = () => {\n setIsDragging(false);\n \n // 重置鼠标按下位置\n mouseDownPosRef.current = null;\n \n // 设置一个短暂的延时,防止拖动后立即触发点击\n if (dragTimerRef.current) {\n window.clearTimeout(dragTimerRef.current);\n }\n \n dragTimerRef.current = window.setTimeout(() => {\n setHasDragged(false);\n }, 300); // 300ms 后重置拖动状态\n };\n \n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n \n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isDragging, dragOffset]);\n\n // 清理定时器\n useEffect(() => {\n return () => {\n if (dragTimerRef.current) {\n window.clearTimeout(dragTimerRef.current);\n }\n };\n }, []);\n\n // 切换菜单开关\n const toggleMenu = (e: React.MouseEvent) => {\n e.stopPropagation();\n \n // 如果刚刚拖动过,不触发菜单切换\n if (hasDragged) {\n return;\n }\n \n setIsMenuOpen(!isMenuOpen);\n };\n\n // 关闭菜单的点击外部处理\n useEffect(() => {\n if (!isMenuOpen) return;\n \n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsMenuOpen(false);\n }\n };\n \n document.addEventListener('mousedown', handleClickOutside);\n \n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isMenuOpen]);\n\n // 窗口大小变化时的边界检查\n useEffect(() => {\n if (!mounted) return;\n \n const checkBoundaries = () => {\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n \n // 确保悬浮窗不会被拖出屏幕\n setPosition(prev => {\n const newX = Math.min(Math.max(prev.x, 0), windowWidth - 50);\n const newY = Math.min(Math.max(prev.y, 0), windowHeight - 50);\n \n // 只有在实际需要调整时才更新位置\n if (newX !== prev.x || newY !== prev.y) {\n return { x: newX, y: newY };\n }\n return prev;\n });\n };\n \n // 只在窗口大小变化时检查边界\n window.addEventListener('resize', checkBoundaries);\n \n return () => {\n window.removeEventListener('resize', checkBoundaries);\n };\n }, [mounted]);\n\n if (!mounted) return null;\n\n return createPortal(\n <div\n ref={containerRef}\n className={`fixed select-none box-border ${className}`}\n style={{\n left: `${position.x}px`,\n top: `${position.y}px`,\n zIndex,\n }}\n >\n {/* 触发器按钮 */}\n <div \n className={`\n flex items-center justify-center \n w-12 h-12 md:w-12 md:h-12 \n bg-white rounded-full \n shadow-md hover:shadow-lg \n cursor-grab active:cursor-grabbing \n transition-all duration-200 \n hover:scale-105 active:scale-95\n ${triggerClassName}\n `}\n onMouseDown={handleMouseDown}\n onClick={toggleMenu}\n >\n {trigger}\n </div>\n \n {/* 菜单内容 */}\n {isMenuOpen && (\n <div \n className={`\n absolute top-0\n bg-white rounded-lg shadow-xl \n p-3 min-w-[200px] md:min-w-[200px] max-w-[300px]\n z-[1000] \n transition-all duration-200\n ${isMenuOpen ? 'opacity-100 scale-100' : 'opacity-0 scale-95'}\n ${menuDirection === 'left' ? 'right-[calc(100%+10px)]' : 'left-[calc(100%+10px)]'}\n ${menuClassName}\n `}\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n onMouseUp={(e) => e.stopPropagation()}\n onTouchStart={(e) => e.stopPropagation()}\n onTouchMove={(e) => e.stopPropagation()}\n onTouchEnd={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n onPointerUp={(e) => e.stopPropagation()}\n >\n {menu}\n </div>\n )}\n </div>,\n document.body\n );\n};\n\nexport default FloatingMenu;","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport FloatingMenu from './FloatingMenu';\n\nexport const FloatingMenuExample: React.FC = () => {\n const [windowWidth, setWindowWidth] = useState(0);\n \n useEffect(() => {\n setWindowWidth(window.innerWidth);\n const handleResize = () => setWindowWidth(window.innerWidth);\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n const menuItems = [\n { id: 1, label: '首页', icon: '🏠' },\n { id: 2, label: '设置', icon: '⚙️' },\n { id: 3, label: '消息', icon: '📩' },\n { id: 4, label: '帮助', icon: '❓' },\n { id: 5, label: '退出', icon: '🚪' },\n ];\n \n const handleMenuItemClick = (id: number) => {\n console.log(`点击了菜单项: ${id}`);\n };\n \n return (\n <div className=\"w-full h-screen bg-gray-100 relative p-8\">\n <div className=\"max-w-2xl mx-auto bg-white rounded-2xl shadow-sm p-8 mt-12\">\n <h1 className=\"text-3xl font-bold mb-4 text-gray-900\">悬浮菜单示例</h1>\n <p className=\"text-gray-600 leading-relaxed mb-6\">\n 这是一个可拖拽的悬浮菜单组件示例。你可以尝试拖动下方的 <span className=\"font-bold text-blue-600\">蓝色按钮</span> 到处移动。\n </p>\n <div className=\"bg-blue-50 border-l-4 border-blue-500 p-4 mb-6\">\n <p className=\"text-sm text-blue-700\">\n <strong>智能定位:</strong> 菜单会根据按钮在屏幕上的位置自动调整弹出方向(向左或向右)。\n </p>\n </div>\n </div>\n \n <FloatingMenu\n trigger={\n <div className=\"w-12 h-12 bg-blue-600 rounded-full flex items-center justify-center text-white shadow-lg cursor-pointer\">\n <span className=\"text-xl\">➕</span>\n </div>\n }\n menu={\n <div className=\"w-48 bg-white rounded-xl shadow-xl border border-gray-100 overflow-hidden\">\n <div className=\"px-4 py-3 border-b border-gray-100\">\n <h3 className=\"text-sm font-bold text-gray-900\">快捷菜单</h3>\n </div>\n <ul className=\"py-1\">\n {menuItems.map(item => (\n <li \n key={item.id} \n className=\"flex items-center gap-3 px-4 py-2.5 hover:bg-blue-50 text-gray-700 hover:text-blue-600 cursor-pointer transition-colors text-sm\"\n onClick={() => handleMenuItemClick(item.id)}\n >\n <span className=\"text-lg\">{item.icon}</span>\n <span className=\"font-medium\">{item.label}</span>\n </li>\n ))}\n </ul>\n </div>\n }\n initialPosition={{ x: 100, y: 100 }}\n />\n \n {windowWidth > 0 && (\n <FloatingMenu\n trigger={\n <div className=\"w-12 h-12 bg-purple-600 rounded-full flex items-center justify-center text-white shadow-lg cursor-pointer\">\n <span className=\"text-xl\">🔍</span>\n </div>\n }\n menu={\n <div className=\"w-64 bg-white rounded-xl shadow-xl border border-gray-100 p-4\">\n <h3 className=\"text-sm font-bold text-gray-900 mb-3\">快速搜索</h3>\n <div className=\"space-y-3\">\n <input \n type=\"text\" \n placeholder=\"输入关键字...\" \n className=\"w-full px-3 py-2 text-sm border border-gray-200 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent outline-none\"\n />\n <button className=\"w-full bg-purple-600 text-white py-2 rounded-lg text-sm font-medium hover:bg-purple-700 transition-colors\">\n 搜索\n </button>\n </div>\n </div>\n }\n initialPosition={{ x: windowWidth - 100, y: 100 }}\n />\n )}\n </div>\n );\n};\n\nexport default FloatingMenuExample;\n\n","/**\n * 实验田模块工具函数\n */\n\nimport type { ExperimentItem, ViewMode, TestFieldConfig, CompletionFilter } from '../types';\n\n/**\n * 过滤实验项目\n */\nexport function filterExperiments(\n experiments: ExperimentItem[],\n config: Partial<TestFieldConfig>\n): ExperimentItem[] {\n const {\n viewMode = 'all',\n searchQuery = '',\n completionFilter = 'all'\n } = config;\n\n return experiments.filter(experiment => {\n // 类别过滤\n const matchesViewMode = viewMode === 'all' || experiment.category === viewMode;\n \n // 搜索过滤\n const query = searchQuery.toLowerCase();\n const matchesSearch = !query || \n experiment.title.toLowerCase().includes(query) ||\n experiment.description.toLowerCase().includes(query) ||\n experiment.tags.some(tag => tag.toLowerCase().includes(query));\n \n // 完成状态过滤\n const matchesCompletion = (() => {\n switch (completionFilter) {\n case 'completed':\n return experiment.isCompleted === true;\n case 'incomplete':\n return experiment.isCompleted !== true;\n case 'all':\n default:\n return true;\n }\n })();\n \n return matchesViewMode && matchesSearch && matchesCompletion;\n });\n}\n\n/**\n * 排序实验项目\n */\nexport function sortExperiments(\n experiments: ExperimentItem[],\n sortBy: TestFieldConfig['sortBy'] = 'title',\n sortOrder: TestFieldConfig['sortOrder'] = 'asc'\n): ExperimentItem[] {\n return [...experiments].sort((a, b) => {\n let comparison = 0;\n \n switch (sortBy) {\n case 'title':\n comparison = a.title.localeCompare(b.title);\n break;\n case 'category':\n comparison = a.category.localeCompare(b.category);\n break;\n case 'completion':\n // 已完成的排在前面\n const aCompleted = a.isCompleted ? 1 : 0;\n const bCompleted = b.isCompleted ? 1 : 0;\n comparison = bCompleted - aCompleted;\n break;\n case 'createdAt':\n // 处理创建日期排序,确保没有日期的项目排在最后\n if (!a.createdAt && !b.createdAt) {\n comparison = 0;\n } else if (!a.createdAt) {\n comparison = 1; // a没有日期,排在后面\n } else if (!b.createdAt) {\n comparison = -1; // b没有日期,排在后面\n } else {\n // 日期字符串比较(假设格式为YYYY-MM-DD)\n comparison = new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime();\n }\n break;\n case 'updatedAt':\n // 处理更新日期排序,确保没有日期的项目排在最后\n if (!a.updatedAt && !b.updatedAt) {\n comparison = 0;\n } else if (!a.updatedAt) {\n comparison = 1; // a没有日期,排在后面\n } else if (!b.updatedAt) {\n comparison = -1; // b没有日期,排在后面\n } else {\n // 日期字符串比较(假设格式为YYYY-MM-DD)\n comparison = new Date(a.updatedAt).getTime() - new Date(b.updatedAt).getTime();\n }\n break;\n default:\n comparison = 0;\n }\n \n // 如果主要排序字段相同,使用ID作为第二排序键确保稳定性\n if (comparison === 0) {\n comparison = a.id.localeCompare(b.id);\n }\n \n return sortOrder === 'asc' ? comparison : -comparison;\n });\n}\n\n/**\n * 获取所有标签\n */\nexport function getAllTags(experiments: ExperimentItem[]): string[] {\n const allTags = experiments.flatMap(experiment => experiment.tags);\n return Array.from(new Set(allTags)).sort();\n}\n\n/**\n * 根据类别统计实验项目数量\n */\nexport function getExperimentCounts(experiments: ExperimentItem[]) {\n const counts = {\n all: experiments.length,\n utility: 0,\n leisure: 0,\n completed: 0,\n inProgress: 0\n };\n \n experiments.forEach(experiment => {\n if (experiment.category === 'utility') {\n counts.utility++;\n } else if (experiment.category === 'leisure') {\n counts.leisure++;\n }\n \n if (experiment.isCompleted) {\n counts.completed++;\n } else {\n counts.inProgress++;\n }\n });\n \n return counts;\n}\n\n/**\n * 验证实验项目数据\n */\nexport function validateExperiment(experiment: Partial<ExperimentItem>): boolean {\n return !!(\n experiment.id &&\n experiment.title &&\n experiment.description &&\n experiment.path &&\n experiment.category &&\n Array.isArray(experiment.tags)\n );\n}\n\n/**\n * 获取类别显示名称\n */\nexport function getCategoryDisplayName(category: ViewMode): string {\n switch (category) {\n case 'utility':\n return '实用工具';\n case 'leisure':\n return '休闲娱乐';\n case 'all':\n default:\n return '全部';\n }\n}\n\n/**\n * 获取类别颜色\n */\nexport function getCategoryColor(category: ExperimentItem['category']): string {\n switch (category) {\n case 'utility':\n return 'bg-blue-100 text-blue-800 border-blue-200';\n case 'leisure':\n return 'bg-purple-100 text-purple-800 border-purple-200';\n default:\n return 'bg-gray-100 text-gray-800 border-gray-200';\n }\n}\n\n/**\n * 获取完成状态显示名称\n */\nexport function getCompletionFilterDisplayName(filter: CompletionFilter): string {\n switch (filter) {\n case 'completed':\n return '已完成';\n case 'incomplete':\n return '进行中';\n case 'all':\n default:\n return '全部状态';\n }\n}\n\n/**\n * 获取完成状态标签样式\n */\nexport function getCompletionStatusColor(isCompleted?: boolean): string {\n if (isCompleted) {\n return 'bg-green-100 text-green-800 border-green-200';\n }\n return 'bg-yellow-100 text-yellow-800 border-yellow-200';\n}\n\n/**\n * 获取完成状态标签文本\n */\nexport function getCompletionStatusText(isCompleted?: boolean): string {\n return isCompleted ? '已完成' : '进行中';\n}","'use client';\n\nimport React from \"react\";\nimport type { ViewMode } from '../types';\nimport { getCategoryDisplayName } from '../utils';\nimport { FilterButtonGroup } from '@/components';\n\ninterface CategoryFilterProps {\n viewMode: ViewMode;\n onViewModeChange: (mode: ViewMode) => void;\n counts: { utility: number; leisure: number };\n className?: string;\n}\n\nexport const CategoryFilter: React.FC<CategoryFilterProps> = ({ \n viewMode, \n onViewModeChange, \n counts,\n className\n}) => {\n const options = [\n {\n value: 'all' as const,\n label: getCategoryDisplayName('all'),\n icon: '📊',\n activeColor: {\n bg: 'bg-blue-500',\n shadow: 'shadow-blue-200'\n },\n showCount: false\n },\n {\n value: 'utility' as const,\n label: getCategoryDisplayName('utility'),\n icon: '🔧',\n activeColor: {\n bg: 'bg-green-500',\n shadow: 'shadow-green-200'\n },\n count: counts.utility,\n showCount: true\n },\n {\n value: 'leisure' as const,\n label: getCategoryDisplayName('leisure'),\n icon: '🎮',\n activeColor: {\n bg: 'bg-purple-500',\n shadow: 'shadow-purple-200'\n },\n count: counts.leisure,\n showCount: true\n },\n ];\n\n return (\n <FilterButtonGroup\n label=\"项目类别\"\n value={viewMode}\n options={options}\n onChange={onViewModeChange}\n className={className}\n />\n );\n};\n\nexport default CategoryFilter;\n","'use client';\n\nimport React from \"react\";\nimport type { CompletionFilter } from '../types';\nimport { getCompletionFilterDisplayName } from '../utils';\nimport { FilterButtonGroup } from '@/components';\n\ninterface CompletionFilterProps {\n completionFilter: CompletionFilter;\n onCompletionFilterChange: (filter: CompletionFilter) => void;\n counts: { all: number; completed: number; inProgress: number };\n className?: string;\n}\n\nexport const CompletionFilterComponent: React.FC<CompletionFilterProps> = ({ \n completionFilter, \n onCompletionFilterChange, \n counts,\n className\n}) => {\n const options = [\n {\n value: 'all' as const,\n label: getCompletionFilterDisplayName('all'),\n icon: '📊',\n activeColor: {\n bg: 'bg-slate-500',\n shadow: 'shadow-slate-200'\n },\n count: counts.all,\n showCount: true\n },\n {\n value: 'completed' as const,\n label: getCompletionFilterDisplayName('completed'),\n icon: '✅',\n activeColor: {\n bg: 'bg-emerald-500',\n shadow: 'shadow-emerald-200'\n },\n count: counts.completed,\n showCount: true\n },\n {\n value: 'incomplete' as const,\n label: getCompletionFilterDisplayName('incomplete'),\n icon: '🚧',\n activeColor: {\n bg: 'bg-orange-500',\n shadow: 'shadow-orange-200'\n },\n count: counts.inProgress,\n showCount: true\n }\n ];\n\n return (\n <FilterButtonGroup\n label=\"完成状态\"\n value={completionFilter}\n options={options}\n onChange={onCompletionFilterChange}\n className={className}\n />\n );\n};\n\nexport default CompletionFilterComponent;\n","'use client';\n\nimport React from \"react\";\nimport { BackButton } from '@/components';\n\nexport interface PageHeaderProps {\n counts: { all: number; utility: number; leisure: number; completed: number };\n className?: string;\n}\n\nexport const PageHeader: React.FC<PageHeaderProps> = ({ counts, className }) => {\n return (\n <div className={className}>\n {/* 顶部导航 */}\n <div className=\"mb-8\">\n <BackButton />\n </div>\n\n {/* 页面标题 */}\n <div className=\"mb-8\">\n <h1 className=\"text-3xl font-bold text-gray-900\">实验田</h1>\n <p className=\"mt-2 text-sm text-gray-600\">\n 在这里,你可以尝试各种实验性的功能和项目\n </p>\n \n {/* 统计信息 */}\n <div className=\"mt-4 flex flex-wrap gap-4 text-sm text-gray-500\">\n <span>总计: {counts.all} 个项目</span>\n <span>实用工具: {counts.utility} 个</span>\n <span>休闲娱乐: {counts.leisure} 个</span>\n <span>已完成: {counts.completed} 个</span>\n </div>\n </div>\n </div>\n );\n};\n\nexport default PageHeader;\n","'use client';\n\nimport React from \"react\";\nimport { ExperimentCard } from '@/portfolio/ExperimentCard';\nimport type { ExperimentItem } from '../types';\nimport { Grid } from '@/components';\nimport type { GridItem, GridColumns, GridGap } from '@/components';\n\n/** 实验项目网格项接口 */\nexport interface ExperimentGridItem extends GridItem {\n title: string;\n description: string;\n path: string;\n tags: string[];\n category: string;\n isCompleted?: boolean;\n updatedAt?: string;\n createdAt?: string;\n}\n\n/** 实验项目网格组件 Props */\nexport interface ExperimentGridProps<T extends ExperimentGridItem> {\n /** 数据项数组 */\n items: T[];\n /** 自定义渲染函数(可选) */\n renderItem?: (item: T, index: number) => React.ReactNode;\n /** 网格列数配置(可选) */\n columns?: GridColumns;\n /** 间距配置(可选) */\n gap?: GridGap;\n /** 额外的容器类名 */\n className?: string;\n}\n\n/** 默认的 ExperimentCard 渲染器 */\nfunction defaultExperimentRenderer(item: ExperimentItem) {\n return (\n <ExperimentCard\n href={item.path}\n title={item.title}\n description={item.description}\n tags={item.tags}\n category={item.category as any}\n isCompleted={item.isCompleted}\n updatedAt={item.updatedAt}\n createdAt={item.createdAt}\n />\n );\n}\n\n/** 实验项目网格组件 */\nexport function ExperimentGrid<T extends ExperimentGridItem>({\n items,\n renderItem,\n columns = { sm: 1, md: 2, lg: 3, xl: 4 },\n gap = 'md',\n className = ''\n}: ExperimentGridProps<T>) {\n const itemRenderer = renderItem || ((item: T) => defaultExperimentRenderer(item as any));\n\n return (\n <Grid\n items={items}\n renderItem={itemRenderer}\n columns={columns}\n gap={gap}\n className={className}\n />\n );\n}\n\n/** 为了向后兼容,导出一个专门用于 ExperimentItem 的组件 */\nexport function ExperimentItemGrid({ \n experiments, \n ...props \n}: Omit<ExperimentGridProps<ExperimentItem>, 'items'> & { experiments: ExperimentItem[] }) {\n return <ExperimentGrid<ExperimentItem> items={experiments} {...props} />;\n}\n\nexport default ExperimentGrid;\n","'use client';\n\nimport React from \"react\";\n\nexport interface EmptyStateProps {\n searchQuery: string;\n onClearSearch: () => void;\n className?: string;\n}\n\nexport const EmptyState: React.FC<EmptyStateProps> = ({ searchQuery, onClearSearch, className }) => {\n return (\n <div className={`text-center py-12 ${className}`}>\n <svg \n className=\"mx-auto h-12 w-12 text-gray-400\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\" \n strokeWidth={2} \n d=\"M9.172 16.172a4 4 0 015.656 0M9 12h6m-6-4h6m2 5.291A7.962 7.962 0 0112 15c-2.34 0-4.47.904-6.06 2.384\" \n />\n </svg>\n <h3 className=\"mt-2 text-sm font-medium text-gray-900\">没有找到匹配的实验项目</h3>\n <p className=\"mt-1 text-sm text-gray-500\">\n {searchQuery \n ? '尝试调整搜索关键词或筛选条件' \n : '当前分类下暂无实验项目'\n }\n </p>\n {searchQuery && (\n <div className=\"mt-4\">\n <button\n onClick={onClearSearch}\n className=\"inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-blue-700 bg-blue-100 hover:bg-blue-200\"\n >\n 清除搜索\n </button>\n </div>\n )}\n </div>\n );\n};\n\nexport default EmptyState;\n","'use client';\n\nimport React from 'react';\nimport type { TestFieldConfig } from '../types';\n\nexport interface SortControlProps {\n sortBy: TestFieldConfig['sortBy'];\n sortOrder: TestFieldConfig['sortOrder'];\n onSortByChange: (sortBy: TestFieldConfig['sortBy']) => void;\n onSortOrderChange: (sortOrder: TestFieldConfig['sortOrder']) => void;\n}\n\nexport const SortControl: React.FC<SortControlProps> = ({\n sortBy,\n sortOrder,\n onSortByChange,\n onSortOrderChange,\n}) => {\n // 排序方式选项\n const sortOptions: { value: TestFieldConfig['sortBy']; label: string }[] = [\n { value: 'title', label: '名称' },\n { value: 'updatedAt', label: '更新时间' },\n { value: 'createdAt', label: '创建时间' },\n { value: 'category', label: '类别' },\n { value: 'completion', label: '完成状态' },\n ];\n\n return (\n <div className=\"flex flex-col sm:flex-row items-start sm:items-center gap-2 sm:gap-4 p-4 bg-white rounded-lg shadow-sm border border-gray-100\">\n <div className=\"text-sm font-medium text-gray-700\">排序方式:</div>\n \n <div className=\"flex flex-wrap gap-2\">\n {sortOptions.map((option) => (\n <button\n key={option.value}\n className={`px-3 py-1.5 text-sm rounded-full transition-colors ${\n sortBy === option.value\n ? 'bg-blue-100 text-blue-700 font-medium'\n : 'bg-gray-100 text-gray-600 hover:bg-gray-200'\n }`}\n onClick={() => onSortByChange(option.value)}\n >\n {option.label}\n </button>\n ))}\n </div>\n \n <div className=\"ml-auto flex items-center\">\n <button\n className=\"flex items-center gap-1 px-3 py-1.5 text-sm rounded-full bg-gray-100 hover:bg-gray-200\"\n onClick={() => onSortOrderChange(sortOrder === 'asc' ? 'desc' : 'asc')}\n >\n {sortOrder === 'asc' ? (\n <>\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 4h13M3 8h9m-9 4h6m4 0l4-4m0 0l4 4m-4-4v12\" />\n </svg>\n <span>升序</span>\n </>\n ) : (\n <>\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 4h13M3 8h9m-9 4h9m5-4v12m0 0l-4-4m4 4l4-4\" />\n </svg>\n <span>降序</span>\n </>\n )}\n </button>\n </div>\n </div>\n );\n};\n\nexport default SortControl;\n","'use client';\n\nimport React from 'react';\nimport type { SortMode } from '../types';\n\nexport interface SortModeToggleProps {\n sortMode: SortMode;\n onSortModeChange: (mode: SortMode) => void;\n}\n\nexport const SortModeToggle: React.FC<SortModeToggleProps> = ({ sortMode, onSortModeChange }) => {\n return (\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-3 bg-white p-4 rounded-lg shadow-sm border border-gray-100\">\n <span className=\"text-sm font-medium text-gray-700\">排序模式:</span>\n \n <div className=\"flex w-full sm:w-auto p-1 bg-gray-100 rounded-lg\">\n <button\n className={`flex-1 sm:flex-initial px-3 py-1.5 text-sm rounded-md transition-colors ${\n sortMode === 'auto'\n ? 'bg-white text-blue-700 font-medium shadow-sm'\n : 'text-gray-600 hover:bg-gray-200'\n }`}\n onClick={() => onSortModeChange('auto')}\n >\n <div className=\"flex items-center justify-center sm:justify-start space-x-1\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 4h13M3 8h9m-9 4h9m5-4v12m0 0l-4-4m4 4l4-4\" />\n </svg>\n <span>自动排序</span>\n </div>\n </button>\n \n <button\n className={`flex-1 sm:flex-initial px-3 py-1.5 text-sm rounded-md transition-colors ${\n sortMode === 'manual'\n ? 'bg-white text-blue-700 font-medium shadow-sm'\n : 'text-gray-600 hover:bg-gray-200'\n }`}\n onClick={() => onSortModeChange('manual')}\n >\n <div className=\"flex items-center justify-center sm:justify-start space-x-1\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 11.5V14m0-2.5v-6a1.5 1.5 0 113 0m-3 6a1.5 1.5 0 00-3 0v2a7.5 7.5 0 0015 0v-5a1.5 1.5 0 013 0m-6-3V11m0-5.5v-1a1.5 1.5 0 013 0v1m0 0V11m0-5.5a1.5 1.5 0 013 0v3m0 0V11\" />\n </svg>\n <span>手动排序</span>\n </div>\n </button>\n </div>\n </div>\n );\n};\n\nexport default SortModeToggle;\n","'use client';\n\nimport React from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { ExperimentCard } from '@/portfolio/ExperimentCard';\nimport type { ExperimentItem } from '../types';\n\nexport interface SortableExperimentItemProps {\n item: ExperimentItem;\n onMoveUp?: () => void;\n onMoveDown?: () => void;\n isFirst?: boolean;\n isLast?: boolean;\n}\n\nexport const SortableExperimentItem: React.FC<SortableExperimentItemProps> = ({ \n item, \n onMoveUp, \n onMoveDown,\n isFirst,\n isLast \n}) => {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: item.id });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n zIndex: isDragging ? 100 : 1,\n opacity: isDragging ? 0.8 : 1,\n position: 'relative' as const,\n };\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className=\"relative group\"\n >\n {/* 拖拽手柄 - 桌面端 */}\n <div\n {...attributes}\n {...listeners}\n className=\"absolute right-2 top-2 w-8 h-8 bg-white/80 hover:bg-white rounded-full flex items-center justify-center shadow-md z-10\n hidden sm:flex\n opacity-0 group-hover:opacity-100 transition-opacity\n cursor-grab active:cursor-grabbing\n touch-action-none\" /* 防止触摸设备上的滚动冲突 */\n onClick={(e) => e.stopPropagation()}\n aria-label=\"拖动排序\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5 text-gray-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 8h16M4 16h16\" />\n </svg>\n \n <span className=\"absolute top-full mt-1 left-1/2 transform -translate-x-1/2 text-xs bg-gray-800 text-white px-2 py-1 rounded whitespace-nowrap opacity-0 group-hover:opacity-100 transition-opacity\">\n 拖动排序\n </span>\n </div>\n\n {/* 移动端排序按钮组 */}\n <div className=\"absolute right-2 top-2 flex flex-col gap-2 sm:hidden z-10\">\n {/* 向上按钮 */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onMoveUp?.();\n }}\n disabled={isFirst}\n className={`w-8 h-8 rounded-full flex items-center justify-center shadow-md\n ${isFirst ? 'bg-gray-200 cursor-not-allowed' : 'bg-white/80 hover:bg-white active:bg-gray-100'}`}\n aria-label=\"向上移动\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`h-5 w-5 ${isFirst ? 'text-gray-400' : 'text-gray-500'}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n\n {/* 向下按钮 */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onMoveDown?.();\n }}\n disabled={isLast}\n className={`w-8 h-8 rounded-full flex items-center justify-center shadow-md\n ${isLast ? 'bg-gray-200 cursor-not-allowed' : 'bg-white/80 hover:bg-white active:bg-gray-100'}`}\n aria-label=\"向下移动\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`h-5 w-5 ${isLast ? 'text-gray-400' : 'text-gray-500'}`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n\n {/* 实验卡片 */}\n <div className={`transition-all ${isDragging ? 'scale-105 shadow-xl' : ''}`}>\n <ExperimentCard\n href={item.path}\n title={item.title}\n description={item.description}\n tags={item.tags}\n category={item.category as any}\n isCompleted={item.isCompleted}\n updatedAt={item.updatedAt}\n createdAt={item.createdAt}\n />\n </div>\n </div>\n );\n};\n\nexport default SortableExperimentItem;\n","'use client';\n\nimport React, { useState } from 'react';\nimport type { ExperimentItem } from '../types';\nimport { \n DndContext, \n closestCenter, \n KeyboardSensor, \n PointerSensor, \n useSensor, \n useSensors,\n DragEndEvent,\n TouchSensor\n} from '@dnd-kit/core';\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n rectSortingStrategy\n} from '@dnd-kit/sortable';\nimport { SortableExperimentItem } from './SortableExperimentItem';\n\nexport interface DraggableExperimentGridProps {\n items: ExperimentItem[];\n onOrderChange?: (items: ExperimentItem[]) => void;\n className?: string;\n}\n\nexport const DraggableExperimentGrid: React.FC<DraggableExperimentGridProps> = ({ \n items: initialItems, \n onOrderChange,\n className = '' \n}) => {\n // 本地状态跟踪项目顺序\n const [items, setItems] = useState<ExperimentItem[]>(initialItems);\n const [isDragging, setIsDragging] = useState(false);\n\n // 设置传感器\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 8, // 需要拖动8px才激活,避免意外触发\n },\n }),\n useSensor(TouchSensor, {\n activationConstraint: {\n delay: 250, // 触摸需要按住250ms才激活,避免与点击冲突\n tolerance: 5, // 允许的移动容差\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n );\n\n // 处理拖拽开始事件\n function handleDragStart() {\n setIsDragging(true);\n }\n\n // 处理拖拽结束事件\n function handleDragEnd(event: DragEndEvent) {\n setIsDragging(false);\n \n const { active, over } = event;\n \n if (over && active.id !== over.id) {\n setItems((currentItems) => {\n // 找到拖拽项和目标项的索引\n const oldIndex = currentItems.findIndex(item => item.id === active.id);\n const newIndex = currentItems.findIndex(item => item.id === over.id);\n \n // 重新排序项目\n const newItems = arrayMove(currentItems, oldIndex, newIndex);\n \n // 如果提供了回调函数,通知父组件顺序变化\n if (onOrderChange) {\n onOrderChange(newItems);\n }\n \n return newItems;\n });\n }\n }\n\n // 处理向上移动\n const handleMoveUp = (index: number) => {\n if (index > 0) {\n setItems((currentItems) => {\n const newItems = arrayMove(currentItems, index, index - 1);\n onOrderChange?.(newItems);\n return newItems;\n });\n }\n };\n\n // 处理向下移动\n const handleMoveDown = (index: number) => {\n if (index < items.length - 1) {\n setItems((currentItems) => {\n const newItems = arrayMove(currentItems, index, index + 1);\n onOrderChange?.(newItems);\n return newItems;\n });\n }\n };\n\n // 当初始项目变化时更新本地状态\n React.useEffect(() => {\n setItems(initialItems);\n }, [initialItems]);\n\n return (\n <div className={`relative ${className}`}>\n <div className=\"mb-4 px-4 py-3 bg-blue-50 text-blue-700 rounded-lg border border-blue-200 text-sm\">\n <div className=\"flex items-start sm:items-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5 mr-2 flex-shrink-0 mt-0.5 sm:mt-0\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clipRule=\"evenodd\" />\n </svg>\n <div>\n <p className=\"mb-1\">拖拽卡片可以自定义排序。点击卡片可以访问对应的实验项目。</p>\n <p className=\"text-xs text-blue-600 sm:hidden\">点击卡片右上角的上下箭头按钮调整顺序</p>\n <p className=\"text-xs text-blue-600 hidden sm:block\">长按卡片右上角的拖动图标进行排序</p>\n </div>\n </div>\n </div>\n \n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n >\n <SortableContext\n items={items.map(item => item.id)}\n strategy={rectSortingStrategy}\n >\n <div className={`\n grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 md:gap-6\n ${isDragging ? 'cursor-grabbing' : ''}\n `}>\n {items.map((item, index) => (\n <SortableExperimentItem \n key={item.id} \n item={item}\n onMoveUp={() => handleMoveUp(index)}\n onMoveDown={() => handleMoveDown(index)}\n isFirst={index === 0}\n isLast={index === items.length - 1}\n />\n ))}\n </div>\n </SortableContext>\n </DndContext>\n </div>\n );\n};\n\nexport default DraggableExperimentGrid;\n","'use client';\n\nimport React from 'react';\nimport { BaseApiClient, UseAuthReturn, useAuth } from '@/auth';\nimport { Shield, AlertTriangle } from 'lucide-react';\nimport { ApiError } from '@/universalFile/server';\n\ninterface PermissionGuardProps {\n children: React.ReactNode;\n fallback?: React.ReactNode;\n apiClient: BaseApiClient;\n}\n\nexport const PermissionGuard: React.FC<PermissionGuardProps> = ({\n apiClient,\n children,\n fallback\n}) => {\n const { user, isLoggedIn } = useAuth(apiClient);\n\n // 检查用户是否有权限(所有登录用户都可以访问实验田)\n const hasPermission = () => {\n if (!isLoggedIn || !user) {\n return false;\n }\n\n // 实验田对所有登录用户开放\n return true;\n };\n\n if (!hasPermission()) {\n return (fallback as any) || (\n <div className=\"min-h-screen bg-gray-50 flex items-center justify-center\">\n <div className=\"max-w-md w-full bg-white rounded-lg shadow-lg p-8 text-center\">\n <div className=\"flex items-center justify-center mb-4\">\n <Shield className=\"w-12 h-12 text-red-500\" />\n </div>\n <h2 className=\"text-xl font-semibold text-gray-900 mb-2\">\n 需要登录\n </h2>\n <p className=\"text-gray-600 mb-4\">\n 请先登录以访问实验田功能。\n </p>\n <div className=\"flex items-center justify-center text-sm text-gray-500 mb-4\">\n <AlertTriangle className=\"w-4 h-4 mr-1\" />\n 实验田对所有注册用户开放\n </div>\n <button\n onClick={() => window.history.back()}\n className=\"inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-white bg-green-600 hover:bg-green-700\"\n >\n 返回上一页\n </button>\n </div>\n </div>\n );\n }\n\n return <>{children}</>;\n};\n\nexport default PermissionGuard;\n","'use client';\n\nimport React from 'react';\nimport { BaseApiClient, useAuth } from '@/auth';\nimport { LogOut, User, FlaskConical } from 'lucide-react';\n\nexport interface UserInfoBarProps {\n apiClient: BaseApiClient;\n}\n\nexport const UserInfoBar: React.FC<UserInfoBarProps> = ({ apiClient }) => {\n const { user, logout, isLoggedIn } = useAuth(apiClient);\n\n const handleLogout = async () => {\n try {\n await logout();\n // 登出后重定向到首页\n window.location.href = '/';\n } catch (error) {\n console.error('登出失败:', error);\n }\n };\n\n if (!isLoggedIn || !user) {\n return null;\n }\n\n return (\n <div className=\"bg-white border-b border-gray-200 px-4 py-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-3\">\n <div className=\"flex items-center space-x-2\">\n <User className=\"w-5 h-5 text-gray-600\" />\n <span className=\"text-sm font-medium text-gray-900\">\n {user.name || user.email || '用户'}\n </span>\n {user.role && (\n <span className=\"inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800\">\n {user.role}\n </span>\n )}\n </div>\n </div>\n \n <div className=\"flex items-center space-x-2\">\n <div className=\"flex items-center space-x-1 text-sm text-gray-500\">\n <FlaskConical className=\"w-4 h-4\" />\n <span>实验田</span>\n </div>\n \n <button\n onClick={handleLogout}\n className=\"inline-flex items-center px-3 py-1.5 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500\"\n >\n <LogOut className=\"w-4 h-4 mr-1\" />\n 登出\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default UserInfoBar;\n"]}