sa2kit 1.6.2 → 1.6.3

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 (50) hide show
  1. package/dist/audioDetection/index.js.map +1 -1
  2. package/dist/audioDetection/index.mjs.map +1 -1
  3. package/dist/{chunk-5XUE72Y3.mjs → chunk-6LEA37ZM.mjs} +2 -2
  4. package/dist/{chunk-5XUE72Y3.mjs.map → chunk-6LEA37ZM.mjs.map} +1 -1
  5. package/dist/chunk-EBP7AE6F.js +167 -0
  6. package/dist/chunk-EBP7AE6F.js.map +1 -0
  7. package/dist/chunk-MBG4DBGP.mjs +154 -0
  8. package/dist/chunk-MBG4DBGP.mjs.map +1 -0
  9. package/dist/{chunk-DQVPZTVC.js → chunk-QKXKXAAV.js} +2 -2
  10. package/dist/{chunk-DQVPZTVC.js.map → chunk-QKXKXAAV.js.map} +1 -1
  11. package/dist/imageCrop/index.js.map +1 -1
  12. package/dist/imageCrop/index.mjs.map +1 -1
  13. package/dist/index-DtLpANUB.d.mts +70 -0
  14. package/dist/index-DtLpANUB.d.ts +70 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/index.mjs.map +1 -1
  17. package/dist/mmd/admin/index.d.mts +1 -1
  18. package/dist/mmd/admin/index.d.ts +1 -1
  19. package/dist/mmd/index.d.mts +16 -2
  20. package/dist/mmd/index.d.ts +16 -2
  21. package/dist/mmd/index.js +280 -130
  22. package/dist/mmd/index.js.map +1 -1
  23. package/dist/mmd/index.mjs +280 -130
  24. package/dist/mmd/index.mjs.map +1 -1
  25. package/dist/mmd/server/index.d.mts +1 -1
  26. package/dist/mmd/server/index.d.ts +1 -1
  27. package/dist/music/index.d.mts +30 -0
  28. package/dist/music/index.d.ts +30 -0
  29. package/dist/music/index.js +458 -0
  30. package/dist/music/index.js.map +1 -0
  31. package/dist/music/index.mjs +427 -0
  32. package/dist/music/index.mjs.map +1 -0
  33. package/dist/music/server/index.d.mts +1 -0
  34. package/dist/music/server/index.d.ts +1 -0
  35. package/dist/music/server/index.js +29 -0
  36. package/dist/music/server/index.js.map +1 -0
  37. package/dist/music/server/index.mjs +4 -0
  38. package/dist/music/server/index.mjs.map +1 -0
  39. package/dist/testYourself/admin/index.js +3 -3
  40. package/dist/testYourself/admin/index.mjs +1 -1
  41. package/dist/testYourself/index.js +7 -7
  42. package/dist/testYourself/index.js.map +1 -1
  43. package/dist/testYourself/index.mjs +2 -2
  44. package/dist/testYourself/index.mjs.map +1 -1
  45. package/dist/{types-DxYJqqes.d.mts → types-B60F7EZZ.d.mts} +16 -1
  46. package/dist/{types-DxYJqqes.d.ts → types-B60F7EZZ.d.ts} +16 -1
  47. package/dist/universalFile/server/index.js +5 -5
  48. package/dist/universalFile/server/index.mjs +1 -1
  49. package/package.json +32 -19
  50. package/tailwind.animations.js +5 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/music/adapters/kugou.ts","../../src/music/adapters/netease.ts","../../src/music/adapters/tencent.ts","../../src/music/adapters/xiami.ts","../../src/music/hooks/useMusic.ts","../../src/music/components/MusicPlayer.tsx"],"names":["useState","ListIcon","MusicIcon"],"mappings":"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","file":"index.mjs","sourcesContent":["import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const kugouAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n const info = root.data?.data?.info || root.data?.info || root.info || [];\n const total = root.data?.data?.total || root.data?.total || info.length;\n return {\n tracks: info.map((item: any) => {\n // 优先从 trans_param.union_cover 提取封面,并替换 {size} 为 400\n let pic = item.pic || '';\n if (item.trans_param?.union_cover) {\n pic = item.trans_param.union_cover.replace('{size}', '400');\n }\n\n return {\n id: item.hash || item.id,\n name: item.songname || item.filename || 'Unknown',\n artist: item.singername || 'Unknown Artist',\n album: item.album_name || item.album || '',\n pic: pic,\n url: item.url,\n lrc: item.lrc,\n source: 'kugou',\n isVip: item.privilege >= 8,\n playable: item.status !== 0,\n };\n }),\n total: total,\n };\n },\n\n parseGetSongUrl(data: any): string | null {\n return data.url?.url || data.url?.backup_url?.[0] || null;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || root.data || '';\n }\n};\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const neteaseAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n const songs = root.result?.songs || root.songs || (Array.isArray(root) ? root : []);\n \n return {\n tracks: songs.map((item: any) => ({\n id: item.id,\n name: item.name,\n artist: Array.isArray(item.artist) ? item.artist.join(', ') : item.artist,\n album: item.album?.name || item.album,\n pic: item.pic || item.album?.picUrl,\n url: item.url,\n lrc: item.lrc,\n source: 'netease',\n isVip: item.fee === 1 || item.fee === 4,\n playable: item.noCopyrightRcmd === null,\n })),\n total: root.result?.songCount || songs.length,\n };\n },\n\n parseGetSongUrl(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n const item = root.data?.[0] || root[0] || root;\n return item.url || null;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || '';\n }\n};\n\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const tencentAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n \n // 兼容多种 QQ 音乐返回结构\n const songData = root.data?.data?.song || root.data?.song || root.data || root;\n const list = songData.list || root.songs || [];\n const total = songData.totalnum || root.total || list.length;\n \n return {\n tracks: list.map((item: any) => {\n // 解析歌手名\n const artist = Array.isArray(item.singer) \n ? item.singer.map((s: any) => s.name).join(', ') \n : (item.singer?.[0]?.name || item.artist || 'Unknown');\n\n // 处理封面图 (QQ 音乐封面通常基于 album mid)\n let pic = item.pic;\n if (!pic && item.album?.mid) {\n pic = `https://y.gtimg.cn/music/photo_new/T002R300x300M000${item.album.mid}.jpg`;\n }\n\n return {\n id: item.mid || item.id || item.songid,\n name: item.name || item.title || item.songname,\n artist: artist,\n album: item.album?.name || item.albumname || item.album,\n pic: pic || '',\n url: item.url,\n lrc: item.lrc,\n source: 'tencent',\n isVip: item.pay?.pay_play === 1,\n playable: item.action?.switch !== 0,\n };\n }),\n total: total,\n };\n },\n\n parseGetSongUrl(data: any): string | null {\n\n const root = data\n\n const urlData = root.url.url;\n let finalUrl = Object.values(urlData)[0] as string;\n console.log('finalUrl2', finalUrl);\n return finalUrl.startsWith('http') ? finalUrl : `http://${finalUrl}`;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || '';\n }\n};\n\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const xiamiAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n // 虾米返回的结构(根据提供的数据,类似于网易云的结构)\n const result = root.data?.result || root.result || root;\n const songs = result.songs || (Array.isArray(root) ? root : []);\n \n return {\n tracks: songs.map((item: any) => ({\n id: item.id?.toString() || '',\n name: item.name || 'Unknown',\n artist: Array.isArray(item.ar) \n ? item.ar.map((a: any) => a.name).join(', ') \n : (item.artist || 'Unknown Artist'),\n album: item.al?.name || item.album || '',\n pic: item.al?.picUrl || item.pic || '',\n url: item.url,\n lrc: item.lrc,\n source: 'xiami',\n // 这里的逻辑参考提供的数据结构\n isVip: item.fee === 1 || item.fee === 8,\n playable: item.copyright !== 0,\n })),\n total: result.songCount || songs.length,\n };\n },\n\n parseGetSongUrl(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n // 兼容多种可能的包装结构\n const item = root.data?.[0] || root.data || root[0] || root;\n return item.url || null;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || root.data || '';\n }\n};\n\n","import useSWR from 'swr';\nimport { useState, useCallback, useMemo } from 'react';\nimport { MusicTrack, SearchOptions, SearchResult, MusicApiResponse } from '../types';\nimport { DEFAULT_MUSIC_SOURCE } from '../constants';\nimport { \n kugouAdapter, \n neteaseAdapter, \n tencentAdapter, \n xiamiAdapter,\n MusicSourceAdapter \n} from '../adapters';\n\nconst fetcher = (url: string) => fetch(url).then(res => res.json());\n\nconst ADAPTERS: Record<string, MusicSourceAdapter> = {\n kugou: kugouAdapter,\n netease: neteaseAdapter,\n tencent: tencentAdapter,\n xiami: xiamiAdapter,\n};\n\nexport function useMusic() {\n const [searchOptions, setSearchOptions] = useState<SearchOptions | null>(null);\n\n // 搜索歌曲\n const { data: rawData, error: searchError, isLoading: isSearching } = useSWR<MusicApiResponse<any>>(\n searchOptions ? `/api/music/search?keyword=${encodeURIComponent(searchOptions.keyword)}&source=${searchOptions.source || DEFAULT_MUSIC_SOURCE}&limit=${searchOptions.limit || 20}&offset=${searchOptions.offset || 0}` : null,\n fetcher\n );\n\n const searchResult = useMemo(() => {\n if (!rawData?.data || !searchOptions) return undefined;\n const adapter = ADAPTERS[searchOptions.source || DEFAULT_MUSIC_SOURCE];\n if (adapter) {\n return adapter.parseSearchResult(rawData.data);\n }\n return undefined;\n }, [rawData, searchOptions]);\n\n const search = useCallback((options: SearchOptions) => {\n setSearchOptions(options);\n }, []);\n\n // 获取播放链接\n const getSongUrl = useCallback(async (id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<string | undefined> => {\n try {\n const res = await fetch(`/api/music/url?id=${id}&source=${source}`);\n const json: MusicApiResponse<any> = await res.json();\n const adapter = ADAPTERS[source];\n console.log('json2', json.data,source,adapter);\n if (adapter && json.data) {\n console.log('getSongUrl2', json.data);\n return adapter.parseGetSongUrl(json.data) || undefined;\n }\n return json.data?.url;\n } catch (err) {\n console.error('[Music] Failed to get song URL:', err);\n return undefined;\n }\n }, []);\n\n // 获取歌词\n const getLyric = useCallback(async (id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<string | undefined> => {\n try {\n const res = await fetch(`/api/music/lyric?id=${id}&source=${source}`);\n const json: MusicApiResponse<any> = await res.json();\n const adapter = ADAPTERS[source];\n if (adapter && json.data) {\n return adapter.parseGetLyric(json.data);\n }\n return json.data?.lyric;\n } catch (err) {\n console.error('[Music] Failed to get lyric:', err);\n return undefined;\n }\n }, []);\n\n return {\n search,\n searchResult,\n isSearching,\n searchError,\n getSongUrl,\n getLyric,\n };\n}\n\n","import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport {\n Play,\n Pause,\n SkipBack,\n SkipForward,\n Search,\n Volume2,\n VolumeX,\n Music as MusicIcon,\n Loader2,\n ChevronLeft,\n ChevronRight,\n LayoutGrid,\n List as ListIcon\n} from 'lucide-react';\nimport { useMusic } from '../hooks/useMusic';\nimport { MusicTrack } from '../types';\nimport { MUSIC_SOURCES, DEFAULT_MUSIC_SOURCE, MusicSource, MUSIC_SOURCE_NAMES } from '../constants';\n\nexport const MusicPlayer: React.FC = () => {\n const { search, searchResult: searchData, isSearching, getSongUrl } = useMusic();\n const [keyword, setKeyword] = useState('');\n const [selectedSource, setSelectedSource] = useState<MusicSource>(DEFAULT_MUSIC_SOURCE);\n const [currentPage, setCurrentPage] = useState(0);\n const [layoutMode, setLayoutMode] = useState<'grid' | 'list'>('grid');\n const pageSize = 20;\n\n const [currentTrack, setCurrentTrack] = useState<MusicTrack | null>(null);\n const [isPlaying, setIsPlaying] = useState(false);\n const [progress, setProgress] = useState(0);\n const [duration, setDuration] = useState(0);\n const [volume, setVolume] = useState(0.7);\n const [isMuted, setIsMuted] = useState(false);\n const [isLoadingUrl, setIsLoadingUrl] = useState(false);\n\n const audioRef = useRef<HTMLAudioElement | null>(null);\n\n const handleSearch = (e: React.FormEvent) => {\n e.preventDefault();\n if (keyword.trim()) {\n setCurrentPage(0);\n search({ keyword, source: selectedSource, offset: 0, limit: pageSize });\n }\n };\n\n const handlePageChange = (newPage: number) => {\n setCurrentPage(newPage);\n search({ keyword, source: selectedSource, offset: newPage, limit: pageSize });\n };\n\n const playTrack = async (track: MusicTrack) => {\n setIsLoadingUrl(true);\n const url = await getSongUrl(track.id, track.source);\n setIsLoadingUrl(false);\n\n if (url) {\n const fullTrack = { ...track, url };\n setCurrentTrack(fullTrack);\n setIsPlaying(true);\n if (audioRef.current) {\n audioRef.current.src = url;\n audioRef.current.play();\n }\n } else {\n alert('无法获取播放链接');\n }\n };\n\n const togglePlay = () => {\n if (!audioRef.current || !currentTrack) return;\n\n if (isPlaying) {\n audioRef.current.pause();\n } else {\n audioRef.current.play();\n }\n setIsPlaying(!isPlaying);\n };\n\n const handleTimeUpdate = () => {\n if (audioRef.current) {\n setProgress(audioRef.current.currentTime);\n setDuration(audioRef.current.duration);\n }\n };\n\n const handleSeek = (e: React.ChangeEvent<HTMLInputElement>) => {\n const time = parseFloat(e.target.value);\n setProgress(time);\n if (audioRef.current) {\n audioRef.current.currentTime = time;\n }\n };\n\n const formatTime = (time: number) => {\n if (isNaN(time)) return '00:00';\n const mins = Math.floor(time / 60);\n const secs = Math.floor(time % 60);\n return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n };\n\n return (\n <div className=\"flex flex-col h-full bg-black text-white font-sans\">\n {/* 搜索栏 */}\n <div className=\"p-6 border-b border-gray-800 max-w-400 mx-auto\">\n <form onSubmit={handleSearch} className=\"flex flex-row items-center gap-4 max-w-screen mx-auto\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-500\" />\n <input\n type=\"text\"\n value={keyword}\n onChange={(e) => setKeyword(e.target.value)}\n placeholder=\"搜索歌曲、歌手...\"\n className=\"w-full bg-gray-900 border border-gray-700 rounded-full py-2 pl-10 pr-4 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all\"\n />\n </div>\n <select\n value={selectedSource}\n onChange={(e) => setSelectedSource(e.target.value as MusicSource)}\n className=\"bg-gray-900 p-2 border border-gray-700 text-gray-300 text-sm rounded-full px-4 focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all cursor-pointer hover:bg-gray-800\"\n >\n {MUSIC_SOURCES.map((src) => (\n <option key={src} value={src}>\n {MUSIC_SOURCE_NAMES[src]}\n </option>\n ))}\n </select>\n <div className=\" flex items-center justify-center max-w-lg bg-gray-900 rounded-full p-2 border border-gray-700\">\n <button\n \n onClick={() => setLayoutMode('list')}\n className={`p-1.5 rounded-full transition-all ${layoutMode === 'list' ? 'bg-blue-600 text-white' : 'text-gray-500 hover:text-gray-300'}`}\n title=\"列表视图\"\n >\n <ListIcon className=\"w-4 h-4\" />\n </button>\n <button\n \n onClick={() => setLayoutMode('grid')}\n className={`p-1.5 rounded-full transition-all ${layoutMode === 'grid' ? 'bg-blue-600 text-white' : 'text-gray-500 hover:text-gray-300'}`}\n title=\"网格视图\"\n >\n <LayoutGrid className=\"w-4 h-4\" />\n </button>\n </div>\n <button\n type=\"submit\"\n disabled={isSearching}\n className=\"bg-blue-600 hover:bg-blue-700 disabled:bg-blue-800 text-white rounded-full px-8 py-2 font-medium transition-all hover:scale-105 active:scale-95 flex items-center justify-center gap-2 shrink-0\"\n >\n {isSearching ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : '搜索'}\n </button>\n </form>\n </div>\n\n {/* 歌曲列表和详情区域 */}\n <div className=\"flex-1 flex overflow-hidden\">\n {/* 左侧列表 */}\n <div className=\"flex-1 overflow-y-auto p-6 scrollbar-thin scrollbar-thumb-gray-800\">\n {Array.isArray(searchData?.tracks) && searchData.tracks.length > 0 ? (\n <div className={layoutMode === 'grid'\n ? \"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\"\n : \"flex flex-col gap-2 max-w-5xl mx-auto\"\n }>\n {searchData.tracks.map((track) => (\n <div\n key={track.id}\n onClick={() => playTrack(track)}\n className={`flex items-center gap-4 p-3 rounded-xl cursor-pointer transition-all ${currentTrack?.id === track.id\n ? 'bg-blue-600/20 border border-blue-500/50 shadow-[0_0_15px_rgba(59,130,246,0.2)]'\n : 'bg-gray-900/50 border border-gray-800 hover:bg-gray-800/80 hover:border-gray-700'\n } ${layoutMode === 'list' ? 'hover:pl-5' : ''}`}\n >\n <div className={`relative rounded-lg overflow-hidden shrink-0 bg-gray-800 transition-all ${layoutMode === 'grid' ? 'w-14 h-14' : 'w-12 h-12'\n }`}>\n {track.pic ? (\n <img src={track.pic} alt={track.name} className=\"w-full h-full object-cover\" />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center\">\n <MusicIcon className=\"w-6 h-6 text-gray-600\" />\n </div>\n )}\n {currentTrack?.id === track.id && isPlaying && (\n <div className=\"absolute inset-0 bg-black/40 flex items-center justify-center\">\n <div className=\"flex gap-0.5 items-end h-4\">\n <div className=\"w-0.5 bg-blue-400 animate-music-bar\" style={{ height: '60%' }} />\n <div className=\"w-0.5 bg-blue-400 animate-music-bar\" style={{ height: '100%', animationDelay: '0.2s' }} />\n <div className=\"w-0.5 bg-blue-400 animate-music-bar\" style={{ height: '40%', animationDelay: '0.4s' }} />\n </div>\n </div>\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <h3 className={`font-semibold truncate ${layoutMode === 'grid' ? 'text-sm' : 'text-base'}`}>{track.name}</h3>\n <span className=\"text-[10px] px-1.5 py-0.5 rounded-md bg-gray-800 text-gray-400 shrink-0\">\n {MUSIC_SOURCE_NAMES[track.source].replace('音乐', '')}\n </span>\n {track.isVip && (\n <span className=\"text-[10px] px-1.5 py-0.5 rounded-md bg-yellow-500/10 text-yellow-500 border border-yellow-500/20 shrink-0 font-bold\">\n VIP\n </span>\n )}\n </div>\n <p className=\"text-xs text-gray-400 truncate mt-1\">{track.artist}</p>\n </div>\n {layoutMode === 'list' && (\n <div className=\"hidden sm:block text-xs text-gray-500 px-4 truncate max-w-[200px]\">\n {track.album}\n </div>\n )}\n </div>\n ))}\n </div>\n ) : (\n <div className=\"h-full flex flex-col items-center justify-center text-gray-500 gap-4\">\n <div className=\"w-16 h-16 rounded-full bg-gray-900 flex items-center justify-center\">\n <MusicIcon className=\"w-8 h-8\" />\n </div>\n <p>{isSearching ? '正在搜索...' : '搜索你喜欢的音乐'}</p>\n </div>\n )}\n\n {/* 分页控制 */}\n {searchData?.tracks && searchData.tracks.length > 0 && (\n <div className=\"mt-8 flex items-center justify-center gap-4 pb-8\">\n <button\n onClick={() => handlePageChange(Math.max(0, currentPage - 1))}\n disabled={currentPage === 0 || isSearching}\n className=\"p-2 rounded-full bg-gray-900 border border-gray-800 text-gray-400 hover:text-white hover:border-gray-700 disabled:opacity-50 disabled:cursor-not-allowed transition-all\"\n >\n <ChevronLeft className=\"w-5 h-5\" />\n </button>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium text-blue-500 bg-blue-500/10 px-3 py-1 rounded-md\">\n 第 {currentPage + 1} 页\n </span>\n {searchData.total > 0 && (\n <span className=\"text-xs text-gray-500\">\n 共 {Math.ceil(searchData.total / pageSize)} 页\n </span>\n )}\n </div>\n <button\n onClick={() => handlePageChange(currentPage + 1)}\n disabled={isSearching || (searchData.total > 0 && (currentPage + 1) * pageSize >= searchData.total)}\n className=\"p-2 rounded-full bg-gray-900 border border-gray-800 text-gray-400 hover:text-white hover:border-gray-700 disabled:opacity-50 disabled:cursor-not-allowed transition-all\"\n >\n <ChevronRight className=\"w-5 h-5\" />\n </button>\n </div>\n )}\n </div>\n </div>\n\n {/* 底部播放控制栏 */}\n <div className=\"bg-gray-900/80 backdrop-blur-xl border-t border-gray-800 p-4 pb-8 md:pb-4\">\n <div className=\"max-w-7xl mx-auto flex flex-col md:flex-row items-center gap-4\">\n {/* 歌曲信息 */}\n <div className=\"flex items-center gap-4 w-full md:w-1/4\">\n <div className=\"w-12 h-12 rounded-lg overflow-hidden bg-gray-800 shrink-0\">\n {currentTrack?.pic ? (\n <img src={currentTrack.pic} alt=\"\" className=\"w-full h-full object-cover\" />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center\">\n <MusicIcon className=\"w-5 h-5 text-gray-600\" />\n </div>\n )}\n </div>\n <div className=\"flex-1 min-w-0\">\n <h4 className=\"font-medium text-sm truncate\">{currentTrack?.name || '未在播放'}</h4>\n <p className=\"text-xs text-gray-400 truncate mt-0.5\">{currentTrack?.artist || '-'}</p>\n </div>\n </div>\n\n {/* 播放控制 */}\n <div className=\"flex flex-col items-center gap-2 flex-1 w-full\">\n <div className=\"flex items-center gap-6\">\n <button className=\"text-gray-400 hover:text-white transition-colors\">\n <SkipBack className=\"w-5 h-5 fill-current\" />\n </button>\n <button\n onClick={togglePlay}\n disabled={!currentTrack || isLoadingUrl}\n className=\"w-10 h-10 rounded-full bg-white text-black flex items-center justify-center hover:scale-105 transition-transform disabled:opacity-50 disabled:scale-100\"\n >\n {isLoadingUrl ? (\n <Loader2 className=\"w-5 h-5 animate-spin\" />\n ) : isPlaying ? (\n <Pause className=\"w-5 h-5 fill-current\" />\n ) : (\n <Play className=\"w-5 h-5 fill-current ml-0.5\" />\n )}\n </button>\n <button className=\"text-gray-400 hover:text-white transition-colors\">\n <SkipForward className=\"w-5 h-5 fill-current\" />\n </button>\n </div>\n\n <div className=\"flex items-center gap-3 w-full max-w-2xl text-xs text-gray-400\">\n <span>{formatTime(progress)}</span>\n <div className=\"flex-1 relative h-1 group cursor-pointer\">\n <input\n type=\"range\"\n min=\"0\"\n max={duration || 0}\n step=\"0.1\"\n value={progress}\n onChange={handleSeek}\n className=\"absolute inset-0 w-full h-full opacity-0 z-10 cursor-pointer\"\n />\n <div className=\"absolute inset-0 bg-gray-700 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-blue-500 group-hover:bg-blue-400 transition-colors\"\n style={{ width: `${(progress / (duration || 1)) * 100}%` }}\n />\n </div>\n </div>\n <span>{formatTime(duration)}</span>\n </div>\n </div>\n\n {/* 音量控制 */}\n <div className=\"hidden md:flex items-center gap-3 w-1/4 justify-end\">\n <button\n onClick={() => setIsMuted(!isMuted)}\n className=\"text-gray-400 hover:text-white transition-colors\"\n >\n {isMuted || volume === 0 ? <VolumeX className=\"w-5 h-5\" /> : <Volume2 className=\"w-5 h-5\" />}\n </button>\n <div className=\"w-24 relative h-1 group\">\n <input\n type=\"range\"\n min=\"0\"\n max=\"1\"\n step=\"0.01\"\n value={isMuted ? 0 : volume}\n onChange={(e) => {\n const val = parseFloat(e.target.value);\n setVolume(val);\n setIsMuted(false);\n if (audioRef.current) audioRef.current.volume = val;\n }}\n className=\"absolute inset-0 w-full h-full opacity-0 z-10 cursor-pointer\"\n />\n <div className=\"absolute inset-0 bg-gray-700 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-gray-300 group-hover:bg-blue-400 transition-colors\"\n style={{ width: `${(isMuted ? 0 : volume) * 100}%` }}\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <audio\n ref={audioRef}\n {...({ referrerPolicy: 'no-referrer' } as any)}\n onTimeUpdate={handleTimeUpdate}\n onEnded={() => setIsPlaying(false)}\n onPlay={() => setIsPlaying(true)}\n onPause={() => setIsPlaying(false)}\n style={{ display: 'none' }}\n />\n </div>\n );\n};\n"]}
@@ -0,0 +1 @@
1
+ export { f as MetingService, e as createLyricHandler, c as createSearchHandler, d as createSongUrlHandler, m as musicService } from '../../index-DtLpANUB.mjs';
@@ -0,0 +1 @@
1
+ export { f as MetingService, e as createLyricHandler, c as createSearchHandler, d as createSongUrlHandler, m as musicService } from '../../index-DtLpANUB.js';
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ var chunkEBP7AE6F_js = require('../../chunk-EBP7AE6F.js');
4
+ require('../../chunk-DGUM43GV.js');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "MetingService", {
9
+ enumerable: true,
10
+ get: function () { return chunkEBP7AE6F_js.MetingService; }
11
+ });
12
+ Object.defineProperty(exports, "createLyricHandler", {
13
+ enumerable: true,
14
+ get: function () { return chunkEBP7AE6F_js.createLyricHandler; }
15
+ });
16
+ Object.defineProperty(exports, "createSearchHandler", {
17
+ enumerable: true,
18
+ get: function () { return chunkEBP7AE6F_js.createSearchHandler; }
19
+ });
20
+ Object.defineProperty(exports, "createSongUrlHandler", {
21
+ enumerable: true,
22
+ get: function () { return chunkEBP7AE6F_js.createSongUrlHandler; }
23
+ });
24
+ Object.defineProperty(exports, "musicService", {
25
+ enumerable: true,
26
+ get: function () { return chunkEBP7AE6F_js.musicService; }
27
+ });
28
+ //# sourceMappingURL=index.js.map
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,4 @@
1
+ export { MetingService, createLyricHandler, createSearchHandler, createSongUrlHandler, musicService } from '../../chunk-MBG4DBGP.mjs';
2
+ import '../../chunk-BJTO5JO5.mjs';
3
+ //# sourceMappingURL=index.mjs.map
4
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
@@ -1,17 +1,17 @@
1
1
  'use strict';
2
2
 
3
- var chunkDQVPZTVC_js = require('../../chunk-DQVPZTVC.js');
3
+ var chunkQKXKXAAV_js = require('../../chunk-QKXKXAAV.js');
4
4
  require('../../chunk-DGUM43GV.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "ConfigList", {
9
9
  enumerable: true,
10
- get: function () { return chunkDQVPZTVC_js.ConfigList; }
10
+ get: function () { return chunkQKXKXAAV_js.ConfigList; }
11
11
  });
12
12
  Object.defineProperty(exports, "ConfigManager", {
13
13
  enumerable: true,
14
- get: function () { return chunkDQVPZTVC_js.ConfigManager; }
14
+ get: function () { return chunkQKXKXAAV_js.ConfigManager; }
15
15
  });
16
16
  //# sourceMappingURL=index.js.map
17
17
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- export { ConfigList, ConfigManager } from '../../chunk-5XUE72Y3.mjs';
1
+ export { ConfigList, ConfigManager } from '../../chunk-6LEA37ZM.mjs';
2
2
  import '../../chunk-BJTO5JO5.mjs';
3
3
  //# sourceMappingURL=index.mjs.map
4
4
  //# sourceMappingURL=index.mjs.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkDQVPZTVC_js = require('../chunk-DQVPZTVC.js');
3
+ var chunkQKXKXAAV_js = require('../chunk-QKXKXAAV.js');
4
4
  var chunkOEDY7GI4_js = require('../chunk-OEDY7GI4.js');
5
5
  var chunkTOC5FSHP_js = require('../chunk-TOC5FSHP.js');
6
6
  require('../chunk-DGUM43GV.js');
@@ -228,14 +228,14 @@ var TestYourself = ({
228
228
  const config = loadedConfig || propConfig || {
229
229
  gameTitle: "\u6D4B\u6D4B\u4F60\u662F\u4EC0\u4E48",
230
230
  gameDescription: "\u957F\u6309\u6309\u94AE\uFF0C\u53D1\u73B0\u4F60\u7684\u4E13\u5C5E\u5C5E\u6027",
231
- results: chunkDQVPZTVC_js.DEFAULT_RESULTS
231
+ results: chunkQKXKXAAV_js.DEFAULT_RESULTS
232
232
  };
233
233
  const {
234
234
  gameTitle,
235
235
  gameDescription,
236
236
  buttonText = "\u957F\u6309\u5F00\u59CB\u6D4B\u8BD5",
237
237
  longPressDuration = 2e3,
238
- results = chunkDQVPZTVC_js.DEFAULT_RESULTS,
238
+ results = chunkQKXKXAAV_js.DEFAULT_RESULTS,
239
239
  enableIPFetch = false,
240
240
  customSalt,
241
241
  resultStyle = "card"
@@ -285,7 +285,7 @@ var TestYourself = ({
285
285
  fingerprint.ip = ip;
286
286
  }
287
287
  }
288
- const actualResults = results.length > 0 ? results : chunkDQVPZTVC_js.DEFAULT_RESULTS;
288
+ const actualResults = results.length > 0 ? results : chunkQKXKXAAV_js.DEFAULT_RESULTS;
289
289
  const hash = generateDeviceHash(fingerprint, customSalt);
290
290
  const index = selectResultIndex(hash, actualResults.length);
291
291
  const selectedResult = actualResults[index];
@@ -709,15 +709,15 @@ if (typeof document !== "undefined" && !document.getElementById("test-yourself-s
709
709
 
710
710
  Object.defineProperty(exports, "ConfigList", {
711
711
  enumerable: true,
712
- get: function () { return chunkDQVPZTVC_js.ConfigList; }
712
+ get: function () { return chunkQKXKXAAV_js.ConfigList; }
713
713
  });
714
714
  Object.defineProperty(exports, "ConfigManager", {
715
715
  enumerable: true,
716
- get: function () { return chunkDQVPZTVC_js.ConfigManager; }
716
+ get: function () { return chunkQKXKXAAV_js.ConfigManager; }
717
717
  });
718
718
  Object.defineProperty(exports, "DEFAULT_RESULTS", {
719
719
  enumerable: true,
720
- get: function () { return chunkDQVPZTVC_js.DEFAULT_RESULTS; }
720
+ get: function () { return chunkQKXKXAAV_js.DEFAULT_RESULTS; }
721
721
  });
722
722
  Object.defineProperty(exports, "DatabaseConfigAdapter", {
723
723
  enumerable: true,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/testYourself/utils/fingerprint.ts","../../src/testYourself/components/TestYourself.tsx"],"names":["useState","useEffect","getDefaultConfigService","DEFAULT_RESULTS","useRef","React"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 设备指纹生成工具\n * Device Fingerprint Generator\n */\n\nimport type { DeviceFingerprint } from '../types';\n\n/**\n * 生成Canvas指纹\n */\nfunction getCanvasFingerprint(): string {\n try {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) return 'no-canvas';\n\n canvas.width = 200;\n canvas.height = 50;\n\n // 绘制文字\n ctx.textBaseline = 'top';\n ctx.font = '14px Arial';\n ctx.fillStyle = '#f60';\n ctx.fillRect(0, 0, 200, 50);\n ctx.fillStyle = '#069';\n ctx.fillText('Canvas Fingerprint 🎨', 2, 15);\n\n // 转换为数据URL\n return canvas.toDataURL();\n } catch (error) {\n return 'canvas-error';\n }\n}\n\n/**\n * 生成WebGL指纹\n */\nfunction getWebGLFingerprint(): string {\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n if (!gl) return 'no-webgl';\n\n const glContext = gl as WebGLRenderingContext;\n const debugInfo = glContext.getExtension('WEBGL_debug_renderer_info');\n \n if (debugInfo) {\n const vendor = glContext.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);\n const renderer = glContext.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);\n return `${vendor}~${renderer}`;\n }\n\n return 'webgl-no-debug';\n } catch (error) {\n return 'webgl-error';\n }\n}\n\n/**\n * 检测可用字体\n */\nfunction getAvailableFonts(): string {\n const testFonts = [\n 'Arial', 'Verdana', 'Courier New', 'Georgia', 'Times New Roman',\n 'Comic Sans MS', 'Trebuchet MS', 'Arial Black', 'Impact',\n 'Courier', 'Helvetica', 'Monaco', 'Consolas', 'Menlo'\n ];\n \n const availableFonts: string[] = [];\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n \n if (!ctx) return 'no-fonts';\n\n const baseFonts = ['monospace', 'sans-serif', 'serif'];\n const testString = 'mmmmmmmmmmlli';\n const baseWidths: { [key: string]: number } = {};\n\n // 获取基础字体宽度\n baseFonts.forEach(font => {\n ctx.font = `72px ${font}`;\n baseWidths[font] = ctx.measureText(testString).width;\n });\n\n // 测试每个字体\n testFonts.forEach(font => {\n let detected = false;\n baseFonts.forEach(baseFont => {\n ctx.font = `72px ${font}, ${baseFont}`;\n const width = ctx.measureText(testString).width;\n if (width !== baseWidths[baseFont]) {\n detected = true;\n }\n });\n if (detected) {\n availableFonts.push(font);\n }\n });\n\n return availableFonts.join(',') || 'no-custom-fonts';\n}\n\n/**\n * 获取设备指纹信息(增强版)\n */\nexport function getDeviceFingerprint(): DeviceFingerprint {\n const fingerprint: DeviceFingerprint = {\n // 基础信息\n userAgent: navigator.userAgent,\n screenResolution: `${window.screen.width}x${window.screen.height}`,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n language: navigator.language,\n platform: navigator.platform,\n\n // 显示信息\n colorDepth: window.screen.colorDepth,\n devicePixelRatio: window.devicePixelRatio,\n\n // 硬件信息\n hardwareConcurrency: navigator.hardwareConcurrency || 0,\n maxTouchPoints: navigator.maxTouchPoints || 0,\n\n // Canvas和WebGL指纹\n canvasFingerprint: getCanvasFingerprint(),\n webglFingerprint: getWebGLFingerprint(),\n\n // 字体检测\n fonts: getAvailableFonts(),\n\n // 浏览器能力\n cookieEnabled: navigator.cookieEnabled,\n localStorageEnabled: (() => {\n try {\n return typeof localStorage !== 'undefined';\n } catch {\n return false;\n }\n })(),\n sessionStorageEnabled: (() => {\n try {\n return typeof sessionStorage !== 'undefined';\n } catch {\n return false;\n }\n })(),\n indexedDBEnabled: (() => {\n try {\n return typeof indexedDB !== 'undefined';\n } catch {\n return false;\n }\n })(),\n };\n\n return fingerprint;\n}\n\n/**\n * 尝试获取IP地址\n * 注意:由于浏览器安全限制,直接获取IP地址需要外部API\n */\nexport async function tryGetIPAddress(): Promise<string | null> {\n try {\n // 尝试使用公共API获取IP\n // 注意:这需要CORS支持,实际使用时可能需要配置\n const response = await fetch('https://api.ipify.org?format=json', {\n method: 'GET',\n mode: 'cors',\n });\n \n if (response.ok) {\n const data = await response.json();\n return data.ip || null;\n }\n } catch (error) {\n console.warn('无法获取IP地址:', error);\n }\n \n return null;\n}\n\n/**\n * 简单的哈希函数 (DJB2算法)\n */\nfunction simpleHash(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash) + str.charCodeAt(i);\n }\n return Math.abs(hash);\n}\n\n/**\n * 生成设备唯一标识\n * @param fingerprint 设备指纹\n * @param salt 盐值\n * @returns 唯一标识哈希值\n */\nexport function generateDeviceHash(\n fingerprint: DeviceFingerprint,\n salt: string = 'test-yourself-salt-2024'\n): string {\n // 组合所有指纹信息(包含新增的特征)\n const components = [\n // 基础信息\n fingerprint.userAgent,\n fingerprint.ip || 'no-ip',\n fingerprint.screenResolution,\n fingerprint.timezone,\n fingerprint.language,\n fingerprint.platform,\n \n // 显示信息\n fingerprint.colorDepth?.toString() || '0',\n fingerprint.devicePixelRatio?.toString() || '0',\n \n // 硬件信息\n fingerprint.hardwareConcurrency?.toString() || '0',\n fingerprint.maxTouchPoints?.toString() || '0',\n \n // Canvas和WebGL指纹(这些是最独特的)\n fingerprint.canvasFingerprint || 'no-canvas',\n fingerprint.webglFingerprint || 'no-webgl',\n \n // 字体(不同设备安装的字体不同)\n fingerprint.fonts || 'no-fonts',\n \n // 浏览器能力\n fingerprint.cookieEnabled ? '1' : '0',\n fingerprint.localStorageEnabled ? '1' : '0',\n fingerprint.sessionStorageEnabled ? '1' : '0',\n fingerprint.indexedDBEnabled ? '1' : '0',\n \n // 盐值\n salt,\n ];\n\n // 拼接并生成哈希\n const combined = components.join('|');\n const hash = simpleHash(combined);\n \n return hash.toString(36); // 转换为36进制字符串\n}\n\n/**\n * 根据哈希值选择结果索引\n * @param hash 设备哈希值\n * @param totalResults 总结果数\n * @returns 结果索引 (0 到 totalResults-1)\n */\nexport function selectResultIndex(hash: string, totalResults: number): number {\n const numHash = parseInt(hash, 36);\n return numHash % totalResults;\n}\n\n\n\n\n\n\n","/**\n * 测测你是什么 - 主组件\n * Test Yourself Game - Main Component\n */\n\n'use client';\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport type { TestYourselfProps, TestResult, TestStatus, DeviceFingerprint, TestConfig } from '../types';\nimport { \n getDeviceFingerprint, \n tryGetIPAddress, \n generateDeviceHash, \n selectResultIndex \n} from '../utils/fingerprint';\nimport { DEFAULT_RESULTS } from '../data/defaultResults';\n\nconst STORAGE_KEY = 'test-yourself-result';\n\nexport const TestYourself: React.FC<TestYourselfProps> = ({\n config: propConfig,\n configId,\n onResult,\n className = '',\n}) => {\n const [loadedConfig, setLoadedConfig] = useState<TestConfig | null>(null);\n const [configLoading, setConfigLoading] = useState(false);\n\n // 加载配置(如果提供了 configId)\n useEffect(() => {\n const loadConfig = async () => {\n if (configId) {\n setConfigLoading(true);\n try {\n // 动态导入 ConfigService\n const { getDefaultConfigService } = await import('../server/ConfigService');\n const service = getDefaultConfigService();\n const savedConfig = await service.getConfig(configId);\n if (savedConfig) {\n setLoadedConfig(savedConfig.config);\n } else {\n console.warn(`配置 ${configId} 不存在,使用默认配置`);\n }\n } catch (error) {\n console.error('加载配置失败:', error);\n } finally {\n setConfigLoading(false);\n }\n }\n };\n\n loadConfig();\n }, [configId]);\n\n // 使用加载的配置或属性传入的配置\n const config = loadedConfig || propConfig || {\n gameTitle: '测测你是什么',\n gameDescription: '长按按钮,发现你的专属属性',\n results: DEFAULT_RESULTS,\n };\n\n const {\n gameTitle,\n gameDescription,\n buttonText = '长按开始测试',\n longPressDuration = 2000,\n results = DEFAULT_RESULTS,\n enableIPFetch = false,\n customSalt,\n resultStyle = 'card',\n } = config;\n\n const [status, setStatus] = useState<TestStatus>('idle');\n const [result, setResult] = useState<TestResult | null>(null);\n const [pressProgress, setPressProgress] = useState(0);\n const [ipWarning, setIpWarning] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n const pressTimerRef = useRef<NodeJS.Timeout | null>(null);\n const progressIntervalRef = useRef<NodeJS.Timeout | null>(null);\n const startTimeRef = useRef<number>(0);\n\n // 初始化:检查localStorage和获取IP\n useEffect(() => {\n const initializeTest = async () => {\n // 等待配置加载完成\n if (configLoading) {\n return;\n }\n\n // 使用不同的 storage key(如果有 configId)\n const storageKey = configId ? `${STORAGE_KEY}_${configId}` : STORAGE_KEY;\n \n // 检查localStorage中是否已有结果\n const savedResult = localStorage.getItem(storageKey);\n if (savedResult) {\n try {\n const parsed = JSON.parse(savedResult);\n setResult(parsed);\n setStatus('completed');\n setIsLoading(false);\n return;\n } catch (error) {\n console.error('解析保存的结果失败:', error);\n }\n }\n\n // 如果启用IP获取,尝试获取\n if (enableIPFetch) {\n const ip = await tryGetIPAddress();\n if (!ip) {\n setIpWarning('⚠️ 无法获取IP地址,将仅使用浏览器指纹生成结果');\n }\n }\n\n setIsLoading(false);\n };\n\n initializeTest();\n }, [enableIPFetch, configLoading, configId]);\n\n // 计算并保存结果\n const calculateResult = async (): Promise<TestResult> => {\n try {\n // 获取设备指纹\n const fingerprint: DeviceFingerprint = getDeviceFingerprint();\n\n // 如果启用IP,尝试获取\n if (enableIPFetch) {\n const ip = await tryGetIPAddress();\n if (ip) {\n fingerprint.ip = ip;\n }\n }\n\n // 使用实际结果数据(如果配置的results为空,使用默认数据)\n const actualResults = results.length > 0 ? results : DEFAULT_RESULTS;\n\n // 生成唯一哈希\n const hash = generateDeviceHash(fingerprint, customSalt);\n\n // 根据哈希选择结果\n const index = selectResultIndex(hash, actualResults.length);\n const selectedResult = actualResults[index];\n\n if (!selectedResult) {\n console.error('无法获取测试结果,index:', index, 'total:', actualResults.length);\n throw new Error('无法获取测试结果');\n }\n\n console.log('计算结果成功:', selectedResult);\n\n // 保存到localStorage(使用不同的 key)\n const storageKey = configId ? `${STORAGE_KEY}_${configId}` : STORAGE_KEY;\n localStorage.setItem(storageKey, JSON.stringify(selectedResult));\n\n return selectedResult;\n } catch (error) {\n console.error('计算结果失败:', error);\n throw error;\n }\n };\n\n // 处理按下\n const handlePressStart = (e: React.MouseEvent | React.TouchEvent) => {\n if (status !== 'idle') return;\n\n // 阻止默认行为(防止移动端长按出现选择菜单)\n e.preventDefault();\n\n setStatus('pressing');\n startTimeRef.current = Date.now();\n\n // 设置进度更新\n progressIntervalRef.current = setInterval(() => {\n const elapsed = Date.now() - startTimeRef.current;\n const progress = Math.min((elapsed / longPressDuration) * 100, 100);\n setPressProgress(progress);\n }, 16); // ~60fps\n\n // 设置完成定时器\n pressTimerRef.current = setTimeout(async () => {\n try {\n setPressProgress(100);\n \n // 清理进度定时器\n if (progressIntervalRef.current) {\n clearInterval(progressIntervalRef.current);\n progressIntervalRef.current = null;\n }\n \n console.log('开始计算结果...');\n \n // 计算结果\n const testResult = await calculateResult();\n \n console.log('结果计算完成,更新状态:', testResult);\n \n // 先更新结果,再更新状态\n setResult(testResult);\n \n // 使用setTimeout确保状态更新\n setTimeout(() => {\n setStatus('completed');\n console.log('状态已更新为 completed');\n }, 0);\n\n // 调用回调\n if (onResult) {\n onResult(testResult);\n }\n } catch (error) {\n console.error('测试失败:', error);\n // 重置状态\n setStatus('idle');\n setPressProgress(0);\n alert('测试失败,请重试');\n }\n }, longPressDuration);\n\n // 添加全局监听器(用于PC端)\n if ('button' in e && e.button === 0) {\n // 鼠标事件\n const handleGlobalMouseUp = () => {\n handlePressEnd();\n document.removeEventListener('mouseup', handleGlobalMouseUp);\n };\n document.addEventListener('mouseup', handleGlobalMouseUp);\n }\n };\n\n // 处理松开\n const handlePressEnd = () => {\n if (status !== 'pressing') return;\n\n // 清理定时器\n if (pressTimerRef.current) {\n clearTimeout(pressTimerRef.current);\n pressTimerRef.current = null;\n }\n if (progressIntervalRef.current) {\n clearInterval(progressIntervalRef.current);\n progressIntervalRef.current = null;\n }\n\n // 重置状态\n setStatus('idle');\n setPressProgress(0);\n };\n\n // 处理鼠标离开(仅用于提示,不取消长按)\n const handleMouseLeave = (e: React.MouseEvent) => {\n // PC端:不取消长按,让用户可以移出按钮区域\n // 只要保持鼠标按下就继续\n };\n\n // 处理触摸移动(移动端)\n const handleTouchMove = (e: React.TouchEvent) => {\n // 检查手指是否移出按钮区域\n const touch = e.touches[0];\n if (!touch) return;\n \n const target = e.currentTarget as HTMLElement;\n const rect = target.getBoundingClientRect();\n \n const isInside = \n touch.clientX >= rect.left &&\n touch.clientX <= rect.right &&\n touch.clientY >= rect.top &&\n touch.clientY <= rect.bottom;\n \n // 如果移出按钮,取消长按(移动端才取消)\n if (!isInside && status === 'pressing') {\n handlePressEnd();\n }\n };\n\n // 清理\n useEffect(() => {\n return () => {\n if (pressTimerRef.current) {\n clearTimeout(pressTimerRef.current);\n }\n if (progressIntervalRef.current) {\n clearInterval(progressIntervalRef.current);\n }\n };\n }, []);\n\n // 重新测试\n const handleReset = () => {\n const storageKey = configId ? `${STORAGE_KEY}_${configId}` : STORAGE_KEY;\n localStorage.removeItem(storageKey);\n setResult(null);\n setStatus('idle');\n setPressProgress(0);\n };\n\n // 背景容器样式\n const backgroundStyle: React.CSSProperties = {\n position: 'relative',\n minHeight: '100vh',\n overflow: 'hidden',\n background: 'linear-gradient(135deg, #f3e8ff 0%, #fce7f3 50%, #dbeafe 100%)',\n };\n\n // 装饰性光晕\n const DecorativeBackground = () => (\n <>\n <div style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '384px',\n height: '384px',\n background: 'radial-gradient(circle, rgba(192, 132, 252, 0.3) 0%, transparent 70%)',\n borderRadius: '50%',\n filter: 'blur(60px)',\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'none',\n }} />\n <div style={{\n position: 'absolute',\n top: '50%',\n right: 0,\n width: '384px',\n height: '384px',\n background: 'radial-gradient(circle, rgba(244, 114, 182, 0.3) 0%, transparent 70%)',\n borderRadius: '50%',\n filter: 'blur(60px)',\n transform: 'translateX(50%)',\n pointerEvents: 'none',\n }} />\n <div style={{\n position: 'absolute',\n bottom: 0,\n left: '50%',\n width: '384px',\n height: '384px',\n background: 'radial-gradient(circle, rgba(147, 197, 253, 0.3) 0%, transparent 70%)',\n borderRadius: '50%',\n filter: 'blur(60px)',\n transform: 'translate(-50%, 50%)',\n pointerEvents: 'none',\n }} />\n </>\n );\n\n if (isLoading) {\n return (\n <div className={className} style={backgroundStyle}>\n <DecorativeBackground />\n <div style={{\n position: 'relative',\n zIndex: 10,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n }}>\n <div style={{ textAlign: 'center' }}>\n <div style={{\n position: 'relative',\n width: '64px',\n height: '64px',\n margin: '0 auto 16px',\n }}>\n <div style={{\n position: 'absolute',\n inset: 0,\n border: '4px solid #e9d5ff',\n borderRadius: '50%',\n }} />\n <div style={{\n position: 'absolute',\n inset: 0,\n border: '4px solid transparent',\n borderTopColor: '#a855f7',\n borderRadius: '50%',\n animation: 'spin 1s linear infinite',\n }} />\n </div>\n <p style={{ fontSize: '14px', color: '#6b7280' }}>✨ 加载中</p>\n </div>\n </div>\n </div>\n );\n }\n\n // 结果展示\n if (status === 'completed' && result) {\n return (\n <div className={className} style={backgroundStyle}>\n <DecorativeBackground />\n <div style={{\n position: 'relative',\n zIndex: 10,\n minHeight: '100vh',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '24px',\n }}>\n <div style={{ maxWidth: '420px', width: '100%' }}>\n {/* 结果卡片 - 可爱风格 */}\n <div style={{\n position: 'relative',\n background: 'linear-gradient(135deg, #fdf2f8 0%, #faf5ff 50%, #eff6ff 100%)',\n borderRadius: '32px',\n boxShadow: '0 25px 50px -12px rgba(168, 85, 247, 0.25), 0 0 0 1px rgba(168, 85, 247, 0.1)',\n overflow: 'hidden',\n padding: '40px 32px',\n textAlign: 'center',\n }}>\n {/* 装饰性星星 */}\n <div style={{ position: 'absolute', top: '20px', left: '20px', fontSize: '24px', opacity: 0.6 }}>✨</div>\n <div style={{ position: 'absolute', top: '40px', right: '30px', fontSize: '20px', opacity: 0.5 }}>⭐</div>\n <div style={{ position: 'absolute', bottom: '30px', left: '40px', fontSize: '18px', opacity: 0.4 }}>💫</div>\n <div style={{ position: 'absolute', bottom: '50px', right: '25px', fontSize: '22px', opacity: 0.5 }}>🌟</div>\n \n {/* Emoji 展示 */}\n <div style={{ marginBottom: '24px' }}>\n <div style={{ \n display: 'inline-block',\n fontSize: '80px',\n animation: 'bounce-slow 2s ease-in-out infinite',\n filter: 'drop-shadow(0 10px 20px rgba(0,0,0,0.1))',\n }}>\n {result.imageType === 'emoji' ? result.image : '🎉'}\n </div>\n </div>\n\n {/* 标题 */}\n <h2 style={{\n fontSize: '32px',\n fontWeight: 800,\n background: 'linear-gradient(135deg, #9333ea 0%, #ec4899 100%)',\n WebkitBackgroundClip: 'text',\n WebkitTextFillColor: 'transparent',\n backgroundClip: 'text',\n marginBottom: '16px',\n lineHeight: 1.3,\n }}>\n {result.title}\n </h2>\n\n {/* 描述卡片 */}\n <div style={{\n background: 'rgba(255, 255, 255, 0.8)',\n borderRadius: '20px',\n padding: '20px 24px',\n marginBottom: '28px',\n boxShadow: '0 4px 15px rgba(168, 85, 247, 0.1)',\n border: '2px dashed rgba(168, 85, 247, 0.2)',\n }}>\n <p style={{\n fontSize: '16px',\n color: '#6b7280',\n lineHeight: 1.7,\n margin: 0,\n }}>\n {result.description}\n </p>\n </div>\n\n {/* 可爱装饰线 */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n marginBottom: '24px',\n }}>\n <span style={{ width: '40px', height: '3px', background: 'linear-gradient(to right, #a855f7, transparent)', borderRadius: '999px' }}></span>\n <span style={{ fontSize: '16px' }}>💕</span>\n <span style={{ width: '40px', height: '3px', background: 'linear-gradient(to left, #ec4899, transparent)', borderRadius: '999px' }}></span>\n </div>\n\n {/* 重新测试按钮 */}\n <button\n onClick={handleReset}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n padding: '14px 32px',\n fontSize: '16px',\n fontWeight: 600,\n color: 'white',\n background: 'linear-gradient(135deg, #a855f7 0%, #ec4899 100%)',\n border: 'none',\n borderRadius: '9999px',\n cursor: 'pointer',\n boxShadow: '0 10px 25px -5px rgba(168, 85, 247, 0.4)',\n transition: 'all 0.3s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = 'scale(1.05) translateY(-2px)';\n e.currentTarget.style.boxShadow = '0 15px 35px -5px rgba(168, 85, 247, 0.5)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'scale(1) translateY(0)';\n e.currentTarget.style.boxShadow = '0 10px 25px -5px rgba(168, 85, 247, 0.4)';\n }}\n >\n <span>🔄</span>\n <span>重新测试</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // 测试界面 - 时尚可爱设计\n return (\n <div className={className} style={backgroundStyle}>\n <DecorativeBackground />\n <div style={{\n position: 'relative',\n zIndex: 10,\n minHeight: '100vh',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '16px',\n }}>\n <div style={{ maxWidth: '512px', width: '100%', textAlign: 'center', userSelect: 'none' }}>\n {/* 标题区域 */}\n <div style={{ marginBottom: '48px' }}>\n <div style={{ \n display: 'inline-block', \n marginBottom: '16px',\n animation: 'bounce-slow 2s ease-in-out infinite',\n }}>\n <span style={{ fontSize: '56px' }}>🎲</span>\n </div>\n <h1 style={{\n fontSize: '48px',\n fontWeight: 900,\n marginBottom: '12px',\n background: 'linear-gradient(135deg, #9333ea 0%, #ec4899 50%, #3b82f6 100%)',\n WebkitBackgroundClip: 'text',\n WebkitTextFillColor: 'transparent',\n backgroundClip: 'text',\n lineHeight: 1.2,\n }}>\n {gameTitle}\n </h1>\n {gameDescription && (\n <p style={{ \n fontSize: '18px', \n color: '#6b7280', \n fontWeight: 500,\n }}>\n {gameDescription}\n </p>\n )}\n </div>\n\n {/* 长按按钮区域 */}\n <div style={{ marginBottom: '24px' }}>\n {/* 主按钮 */}\n <button\n onMouseDown={handlePressStart}\n onMouseLeave={handleMouseLeave}\n onTouchStart={handlePressStart}\n onTouchEnd={handlePressEnd}\n onTouchMove={handleTouchMove}\n onTouchCancel={handlePressEnd}\n onContextMenu={(e) => e.preventDefault()}\n onDragStart={(e) => e.preventDefault()}\n style={{\n display: 'block',\n margin: '0 auto',\n width: '200px',\n height: '200px',\n borderRadius: '50%',\n border: 'none',\n fontSize: '20px',\n fontWeight: 'bold',\n cursor: 'pointer',\n position: 'relative',\n overflow: 'hidden',\n userSelect: 'none',\n WebkitTouchCallout: 'none',\n WebkitUserSelect: 'none',\n touchAction: 'none',\n transition: 'transform 0.3s ease',\n transform: status === 'pressing' ? 'scale(0.95)' : 'scale(1)',\n background: status === 'pressing' \n ? `linear-gradient(to top, rgb(168, 85, 247) ${pressProgress}%, rgb(236, 72, 153) ${pressProgress}%)`\n : 'linear-gradient(135deg, #4f46e5 0%, #7c3aed 25%, #db2777 50%, #f97316 75%, #059669 100%)',\n boxShadow: status === 'pressing' \n ? 'inset 0 4px 12px rgba(0,0,0,0.3), 0 0 0 4px rgba(168, 85, 247, 0.5)'\n : '0 15px 35px -10px rgba(79, 70, 229, 0.6), 0 0 0 4px rgba(255,255,255,0.8)',\n }}\n >\n {/* 按钮内容 */}\n <div style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'white',\n pointerEvents: 'none',\n }}>\n {status === 'pressing' ? (\n <>\n <span style={{ fontSize: '36px', fontWeight: 900, marginBottom: '4px' }}>{Math.round(pressProgress)}%</span>\n <span style={{ fontSize: '14px', opacity: 0.8 }}>继续按住</span>\n </>\n ) : (\n <>\n <span style={{ fontSize: '32px', marginBottom: '8px' }}>👆</span>\n <span style={{ fontSize: '16px', fontWeight: 'bold', padding: '0 16px' }}>{buttonText}</span>\n </>\n )}\n </div>\n\n {/* 内部装饰圆环 */}\n {status === 'idle' && (\n <div style={{\n position: 'absolute',\n top: '16px',\n left: '16px',\n right: '16px',\n bottom: '16px',\n border: '2px solid rgba(255,255,255,0.3)',\n borderRadius: '50%',\n }}></div>\n )}\n </button>\n\n {/* 进度条 */}\n {status === 'pressing' && (\n <div style={{\n marginTop: '16px',\n marginLeft: 'auto',\n marginRight: 'auto',\n width: '192px',\n height: '8px',\n backgroundColor: '#e5e7eb',\n borderRadius: '9999px',\n overflow: 'hidden',\n }}>\n <div style={{\n height: '100%',\n width: `${pressProgress}%`,\n background: 'linear-gradient(to right, #a855f7, #ec4899)',\n transition: 'width 0.1s ease',\n }} />\n </div>\n )}\n </div>\n\n {/* 底部提示 - 简洁可爱 */}\n <div style={{ marginTop: '24px' }}>\n {status === 'pressing' ? (\n <p style={{ \n fontSize: '18px', \n fontWeight: 500, \n color: '#9333ea',\n animation: 'pulse 2s ease-in-out infinite',\n }}>\n ✨ 正在分析中...\n </p>\n ) : (\n <div style={{ \n display: 'flex', \n alignItems: 'center', \n justifyContent: 'center', \n gap: '8px',\n }}>\n <span style={{ \n display: 'inline-block', \n width: '6px', \n height: '6px', \n backgroundColor: '#a855f7', \n borderRadius: '50%',\n animation: 'bounce 1s infinite',\n }} />\n <span style={{ \n display: 'inline-block', \n width: '6px', \n height: '6px', \n backgroundColor: '#ec4899', \n borderRadius: '50%',\n animation: 'bounce 1s infinite 0.1s',\n }} />\n <span style={{ \n display: 'inline-block', \n width: '6px', \n height: '6px', \n backgroundColor: '#3b82f6', \n borderRadius: '50%',\n animation: 'bounce 1s infinite 0.2s',\n }} />\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n// 添加CSS样式来支持触摸优化和动画\nconst touchOptimizationStyles = `\n @keyframes bounce-slow {\n 0%, 100% {\n transform: translateY(0);\n }\n 50% {\n transform: translateY(-10px);\n }\n }\n \n @keyframes bounce {\n 0%, 100% {\n transform: translateY(0);\n }\n 50% {\n transform: translateY(-4px);\n }\n }\n \n @keyframes pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n }\n \n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n`;\n\n// 注入样式\nif (typeof document !== 'undefined' && !document.getElementById('test-yourself-styles')) {\n const style = document.createElement('style');\n style.id = 'test-yourself-styles';\n style.textContent = touchOptimizationStyles;\n document.head.appendChild(style);\n};\n\nexport default TestYourself;\n\n\n"]}
1
+ {"version":3,"sources":["../../src/testYourself/utils/fingerprint.ts","../../src/testYourself/components/TestYourself.tsx"],"names":["useState","useEffect","getDefaultConfigService","DEFAULT_RESULTS","useRef","React"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 设备指纹生成工具\n * Device Fingerprint Generator\n */\n\nimport type { DeviceFingerprint } from '../types';\n\n/**\n * 生成Canvas指纹\n */\nfunction getCanvasFingerprint(): string {\n try {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) return 'no-canvas';\n\n canvas.width = 200;\n canvas.height = 50;\n\n // 绘制文字\n ctx.textBaseline = 'top';\n ctx.font = '14px Arial';\n ctx.fillStyle = '#f60';\n ctx.fillRect(0, 0, 200, 50);\n ctx.fillStyle = '#069';\n ctx.fillText('Canvas Fingerprint 🎨', 2, 15);\n\n // 转换为数据URL\n return canvas.toDataURL();\n } catch (error) {\n return 'canvas-error';\n }\n}\n\n/**\n * 生成WebGL指纹\n */\nfunction getWebGLFingerprint(): string {\n try {\n const canvas = document.createElement('canvas');\n const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n if (!gl) return 'no-webgl';\n\n const glContext = gl as WebGLRenderingContext;\n const debugInfo = glContext.getExtension('WEBGL_debug_renderer_info');\n \n if (debugInfo) {\n const vendor = glContext.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);\n const renderer = glContext.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);\n return `${vendor}~${renderer}`;\n }\n\n return 'webgl-no-debug';\n } catch (error) {\n return 'webgl-error';\n }\n}\n\n/**\n * 检测可用字体\n */\nfunction getAvailableFonts(): string {\n const testFonts = [\n 'Arial', 'Verdana', 'Courier New', 'Georgia', 'Times New Roman',\n 'Comic Sans MS', 'Trebuchet MS', 'Arial Black', 'Impact',\n 'Courier', 'Helvetica', 'Monaco', 'Consolas', 'Menlo'\n ];\n \n const availableFonts: string[] = [];\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n \n if (!ctx) return 'no-fonts';\n\n const baseFonts = ['monospace', 'sans-serif', 'serif'];\n const testString = 'mmmmmmmmmmlli';\n const baseWidths: { [key: string]: number } = {};\n\n // 获取基础字体宽度\n baseFonts.forEach(font => {\n ctx.font = `72px ${font}`;\n baseWidths[font] = ctx.measureText(testString).width;\n });\n\n // 测试每个字体\n testFonts.forEach(font => {\n let detected = false;\n baseFonts.forEach(baseFont => {\n ctx.font = `72px ${font}, ${baseFont}`;\n const width = ctx.measureText(testString).width;\n if (width !== baseWidths[baseFont]) {\n detected = true;\n }\n });\n if (detected) {\n availableFonts.push(font);\n }\n });\n\n return availableFonts.join(',') || 'no-custom-fonts';\n}\n\n/**\n * 获取设备指纹信息(增强版)\n */\nexport function getDeviceFingerprint(): DeviceFingerprint {\n const fingerprint: DeviceFingerprint = {\n // 基础信息\n userAgent: navigator.userAgent,\n screenResolution: `${window.screen.width}x${window.screen.height}`,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n language: navigator.language,\n platform: navigator.platform,\n\n // 显示信息\n colorDepth: window.screen.colorDepth,\n devicePixelRatio: window.devicePixelRatio,\n\n // 硬件信息\n hardwareConcurrency: navigator.hardwareConcurrency || 0,\n maxTouchPoints: navigator.maxTouchPoints || 0,\n\n // Canvas和WebGL指纹\n canvasFingerprint: getCanvasFingerprint(),\n webglFingerprint: getWebGLFingerprint(),\n\n // 字体检测\n fonts: getAvailableFonts(),\n\n // 浏览器能力\n cookieEnabled: navigator.cookieEnabled,\n localStorageEnabled: (() => {\n try {\n return typeof localStorage !== 'undefined';\n } catch {\n return false;\n }\n })(),\n sessionStorageEnabled: (() => {\n try {\n return typeof sessionStorage !== 'undefined';\n } catch {\n return false;\n }\n })(),\n indexedDBEnabled: (() => {\n try {\n return typeof indexedDB !== 'undefined';\n } catch {\n return false;\n }\n })(),\n };\n\n return fingerprint;\n}\n\n/**\n * 尝试获取IP地址\n * 注意:由于浏览器安全限制,直接获取IP地址需要外部API\n */\nexport async function tryGetIPAddress(): Promise<string | null> {\n try {\n // 尝试使用公共API获取IP\n // 注意:这需要CORS支持,实际使用时可能需要配置\n const response = await fetch('https://api.ipify.org?format=json', {\n method: 'GET',\n mode: 'cors',\n });\n \n if (response.ok) {\n const data = await response.json();\n return data.ip || null;\n }\n } catch (error) {\n console.warn('无法获取IP地址:', error);\n }\n \n return null;\n}\n\n/**\n * 简单的哈希函数 (DJB2算法)\n */\nfunction simpleHash(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) + hash) + str.charCodeAt(i);\n }\n return Math.abs(hash);\n}\n\n/**\n * 生成设备唯一标识\n * @param fingerprint 设备指纹\n * @param salt 盐值\n * @returns 唯一标识哈希值\n */\nexport function generateDeviceHash(\n fingerprint: DeviceFingerprint,\n salt: string = 'test-yourself-salt-2024'\n): string {\n // 组合所有指纹信息(包含新增的特征)\n const components = [\n // 基础信息\n fingerprint.userAgent,\n fingerprint.ip || 'no-ip',\n fingerprint.screenResolution,\n fingerprint.timezone,\n fingerprint.language,\n fingerprint.platform,\n \n // 显示信息\n fingerprint.colorDepth?.toString() || '0',\n fingerprint.devicePixelRatio?.toString() || '0',\n \n // 硬件信息\n fingerprint.hardwareConcurrency?.toString() || '0',\n fingerprint.maxTouchPoints?.toString() || '0',\n \n // Canvas和WebGL指纹(这些是最独特的)\n fingerprint.canvasFingerprint || 'no-canvas',\n fingerprint.webglFingerprint || 'no-webgl',\n \n // 字体(不同设备安装的字体不同)\n fingerprint.fonts || 'no-fonts',\n \n // 浏览器能力\n fingerprint.cookieEnabled ? '1' : '0',\n fingerprint.localStorageEnabled ? '1' : '0',\n fingerprint.sessionStorageEnabled ? '1' : '0',\n fingerprint.indexedDBEnabled ? '1' : '0',\n \n // 盐值\n salt,\n ];\n\n // 拼接并生成哈希\n const combined = components.join('|');\n const hash = simpleHash(combined);\n \n return hash.toString(36); // 转换为36进制字符串\n}\n\n/**\n * 根据哈希值选择结果索引\n * @param hash 设备哈希值\n * @param totalResults 总结果数\n * @returns 结果索引 (0 到 totalResults-1)\n */\nexport function selectResultIndex(hash: string, totalResults: number): number {\n const numHash = parseInt(hash, 36);\n return numHash % totalResults;\n}\n\n\n\n\n\n\n\n\n","/**\n * 测测你是什么 - 主组件\n * Test Yourself Game - Main Component\n */\n\n'use client';\n\nimport React, { useState, useEffect, useRef } from 'react';\nimport type { TestYourselfProps, TestResult, TestStatus, DeviceFingerprint, TestConfig } from '../types';\nimport { \n getDeviceFingerprint, \n tryGetIPAddress, \n generateDeviceHash, \n selectResultIndex \n} from '../utils/fingerprint';\nimport { DEFAULT_RESULTS } from '../data/defaultResults';\n\nconst STORAGE_KEY = 'test-yourself-result';\n\nexport const TestYourself: React.FC<TestYourselfProps> = ({\n config: propConfig,\n configId,\n onResult,\n className = '',\n}) => {\n const [loadedConfig, setLoadedConfig] = useState<TestConfig | null>(null);\n const [configLoading, setConfigLoading] = useState(false);\n\n // 加载配置(如果提供了 configId)\n useEffect(() => {\n const loadConfig = async () => {\n if (configId) {\n setConfigLoading(true);\n try {\n // 动态导入 ConfigService\n const { getDefaultConfigService } = await import('../server/ConfigService');\n const service = getDefaultConfigService();\n const savedConfig = await service.getConfig(configId);\n if (savedConfig) {\n setLoadedConfig(savedConfig.config);\n } else {\n console.warn(`配置 ${configId} 不存在,使用默认配置`);\n }\n } catch (error) {\n console.error('加载配置失败:', error);\n } finally {\n setConfigLoading(false);\n }\n }\n };\n\n loadConfig();\n }, [configId]);\n\n // 使用加载的配置或属性传入的配置\n const config = loadedConfig || propConfig || {\n gameTitle: '测测你是什么',\n gameDescription: '长按按钮,发现你的专属属性',\n results: DEFAULT_RESULTS,\n };\n\n const {\n gameTitle,\n gameDescription,\n buttonText = '长按开始测试',\n longPressDuration = 2000,\n results = DEFAULT_RESULTS,\n enableIPFetch = false,\n customSalt,\n resultStyle = 'card',\n } = config;\n\n const [status, setStatus] = useState<TestStatus>('idle');\n const [result, setResult] = useState<TestResult | null>(null);\n const [pressProgress, setPressProgress] = useState(0);\n const [ipWarning, setIpWarning] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n const pressTimerRef = useRef<NodeJS.Timeout | null>(null);\n const progressIntervalRef = useRef<NodeJS.Timeout | null>(null);\n const startTimeRef = useRef<number>(0);\n\n // 初始化:检查localStorage和获取IP\n useEffect(() => {\n const initializeTest = async () => {\n // 等待配置加载完成\n if (configLoading) {\n return;\n }\n\n // 使用不同的 storage key(如果有 configId)\n const storageKey = configId ? `${STORAGE_KEY}_${configId}` : STORAGE_KEY;\n \n // 检查localStorage中是否已有结果\n const savedResult = localStorage.getItem(storageKey);\n if (savedResult) {\n try {\n const parsed = JSON.parse(savedResult);\n setResult(parsed);\n setStatus('completed');\n setIsLoading(false);\n return;\n } catch (error) {\n console.error('解析保存的结果失败:', error);\n }\n }\n\n // 如果启用IP获取,尝试获取\n if (enableIPFetch) {\n const ip = await tryGetIPAddress();\n if (!ip) {\n setIpWarning('⚠️ 无法获取IP地址,将仅使用浏览器指纹生成结果');\n }\n }\n\n setIsLoading(false);\n };\n\n initializeTest();\n }, [enableIPFetch, configLoading, configId]);\n\n // 计算并保存结果\n const calculateResult = async (): Promise<TestResult> => {\n try {\n // 获取设备指纹\n const fingerprint: DeviceFingerprint = getDeviceFingerprint();\n\n // 如果启用IP,尝试获取\n if (enableIPFetch) {\n const ip = await tryGetIPAddress();\n if (ip) {\n fingerprint.ip = ip;\n }\n }\n\n // 使用实际结果数据(如果配置的results为空,使用默认数据)\n const actualResults = results.length > 0 ? results : DEFAULT_RESULTS;\n\n // 生成唯一哈希\n const hash = generateDeviceHash(fingerprint, customSalt);\n\n // 根据哈希选择结果\n const index = selectResultIndex(hash, actualResults.length);\n const selectedResult = actualResults[index];\n\n if (!selectedResult) {\n console.error('无法获取测试结果,index:', index, 'total:', actualResults.length);\n throw new Error('无法获取测试结果');\n }\n\n console.log('计算结果成功:', selectedResult);\n\n // 保存到localStorage(使用不同的 key)\n const storageKey = configId ? `${STORAGE_KEY}_${configId}` : STORAGE_KEY;\n localStorage.setItem(storageKey, JSON.stringify(selectedResult));\n\n return selectedResult;\n } catch (error) {\n console.error('计算结果失败:', error);\n throw error;\n }\n };\n\n // 处理按下\n const handlePressStart = (e: React.MouseEvent | React.TouchEvent) => {\n if (status !== 'idle') return;\n\n // 阻止默认行为(防止移动端长按出现选择菜单)\n e.preventDefault();\n\n setStatus('pressing');\n startTimeRef.current = Date.now();\n\n // 设置进度更新\n progressIntervalRef.current = setInterval(() => {\n const elapsed = Date.now() - startTimeRef.current;\n const progress = Math.min((elapsed / longPressDuration) * 100, 100);\n setPressProgress(progress);\n }, 16); // ~60fps\n\n // 设置完成定时器\n pressTimerRef.current = setTimeout(async () => {\n try {\n setPressProgress(100);\n \n // 清理进度定时器\n if (progressIntervalRef.current) {\n clearInterval(progressIntervalRef.current);\n progressIntervalRef.current = null;\n }\n \n console.log('开始计算结果...');\n \n // 计算结果\n const testResult = await calculateResult();\n \n console.log('结果计算完成,更新状态:', testResult);\n \n // 先更新结果,再更新状态\n setResult(testResult);\n \n // 使用setTimeout确保状态更新\n setTimeout(() => {\n setStatus('completed');\n console.log('状态已更新为 completed');\n }, 0);\n\n // 调用回调\n if (onResult) {\n onResult(testResult);\n }\n } catch (error) {\n console.error('测试失败:', error);\n // 重置状态\n setStatus('idle');\n setPressProgress(0);\n alert('测试失败,请重试');\n }\n }, longPressDuration);\n\n // 添加全局监听器(用于PC端)\n if ('button' in e && e.button === 0) {\n // 鼠标事件\n const handleGlobalMouseUp = () => {\n handlePressEnd();\n document.removeEventListener('mouseup', handleGlobalMouseUp);\n };\n document.addEventListener('mouseup', handleGlobalMouseUp);\n }\n };\n\n // 处理松开\n const handlePressEnd = () => {\n if (status !== 'pressing') return;\n\n // 清理定时器\n if (pressTimerRef.current) {\n clearTimeout(pressTimerRef.current);\n pressTimerRef.current = null;\n }\n if (progressIntervalRef.current) {\n clearInterval(progressIntervalRef.current);\n progressIntervalRef.current = null;\n }\n\n // 重置状态\n setStatus('idle');\n setPressProgress(0);\n };\n\n // 处理鼠标离开(仅用于提示,不取消长按)\n const handleMouseLeave = (e: React.MouseEvent) => {\n // PC端:不取消长按,让用户可以移出按钮区域\n // 只要保持鼠标按下就继续\n };\n\n // 处理触摸移动(移动端)\n const handleTouchMove = (e: React.TouchEvent) => {\n // 检查手指是否移出按钮区域\n const touch = e.touches[0];\n if (!touch) return;\n \n const target = e.currentTarget as HTMLElement;\n const rect = target.getBoundingClientRect();\n \n const isInside = \n touch.clientX >= rect.left &&\n touch.clientX <= rect.right &&\n touch.clientY >= rect.top &&\n touch.clientY <= rect.bottom;\n \n // 如果移出按钮,取消长按(移动端才取消)\n if (!isInside && status === 'pressing') {\n handlePressEnd();\n }\n };\n\n // 清理\n useEffect(() => {\n return () => {\n if (pressTimerRef.current) {\n clearTimeout(pressTimerRef.current);\n }\n if (progressIntervalRef.current) {\n clearInterval(progressIntervalRef.current);\n }\n };\n }, []);\n\n // 重新测试\n const handleReset = () => {\n const storageKey = configId ? `${STORAGE_KEY}_${configId}` : STORAGE_KEY;\n localStorage.removeItem(storageKey);\n setResult(null);\n setStatus('idle');\n setPressProgress(0);\n };\n\n // 背景容器样式\n const backgroundStyle: React.CSSProperties = {\n position: 'relative',\n minHeight: '100vh',\n overflow: 'hidden',\n background: 'linear-gradient(135deg, #f3e8ff 0%, #fce7f3 50%, #dbeafe 100%)',\n };\n\n // 装饰性光晕\n const DecorativeBackground = () => (\n <>\n <div style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '384px',\n height: '384px',\n background: 'radial-gradient(circle, rgba(192, 132, 252, 0.3) 0%, transparent 70%)',\n borderRadius: '50%',\n filter: 'blur(60px)',\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'none',\n }} />\n <div style={{\n position: 'absolute',\n top: '50%',\n right: 0,\n width: '384px',\n height: '384px',\n background: 'radial-gradient(circle, rgba(244, 114, 182, 0.3) 0%, transparent 70%)',\n borderRadius: '50%',\n filter: 'blur(60px)',\n transform: 'translateX(50%)',\n pointerEvents: 'none',\n }} />\n <div style={{\n position: 'absolute',\n bottom: 0,\n left: '50%',\n width: '384px',\n height: '384px',\n background: 'radial-gradient(circle, rgba(147, 197, 253, 0.3) 0%, transparent 70%)',\n borderRadius: '50%',\n filter: 'blur(60px)',\n transform: 'translate(-50%, 50%)',\n pointerEvents: 'none',\n }} />\n </>\n );\n\n if (isLoading) {\n return (\n <div className={className} style={backgroundStyle}>\n <DecorativeBackground />\n <div style={{\n position: 'relative',\n zIndex: 10,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n }}>\n <div style={{ textAlign: 'center' }}>\n <div style={{\n position: 'relative',\n width: '64px',\n height: '64px',\n margin: '0 auto 16px',\n }}>\n <div style={{\n position: 'absolute',\n inset: 0,\n border: '4px solid #e9d5ff',\n borderRadius: '50%',\n }} />\n <div style={{\n position: 'absolute',\n inset: 0,\n border: '4px solid transparent',\n borderTopColor: '#a855f7',\n borderRadius: '50%',\n animation: 'spin 1s linear infinite',\n }} />\n </div>\n <p style={{ fontSize: '14px', color: '#6b7280' }}>✨ 加载中</p>\n </div>\n </div>\n </div>\n );\n }\n\n // 结果展示\n if (status === 'completed' && result) {\n return (\n <div className={className} style={backgroundStyle}>\n <DecorativeBackground />\n <div style={{\n position: 'relative',\n zIndex: 10,\n minHeight: '100vh',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '24px',\n }}>\n <div style={{ maxWidth: '420px', width: '100%' }}>\n {/* 结果卡片 - 可爱风格 */}\n <div style={{\n position: 'relative',\n background: 'linear-gradient(135deg, #fdf2f8 0%, #faf5ff 50%, #eff6ff 100%)',\n borderRadius: '32px',\n boxShadow: '0 25px 50px -12px rgba(168, 85, 247, 0.25), 0 0 0 1px rgba(168, 85, 247, 0.1)',\n overflow: 'hidden',\n padding: '40px 32px',\n textAlign: 'center',\n }}>\n {/* 装饰性星星 */}\n <div style={{ position: 'absolute', top: '20px', left: '20px', fontSize: '24px', opacity: 0.6 }}>✨</div>\n <div style={{ position: 'absolute', top: '40px', right: '30px', fontSize: '20px', opacity: 0.5 }}>⭐</div>\n <div style={{ position: 'absolute', bottom: '30px', left: '40px', fontSize: '18px', opacity: 0.4 }}>💫</div>\n <div style={{ position: 'absolute', bottom: '50px', right: '25px', fontSize: '22px', opacity: 0.5 }}>🌟</div>\n \n {/* Emoji 展示 */}\n <div style={{ marginBottom: '24px' }}>\n <div style={{ \n display: 'inline-block',\n fontSize: '80px',\n animation: 'bounce-slow 2s ease-in-out infinite',\n filter: 'drop-shadow(0 10px 20px rgba(0,0,0,0.1))',\n }}>\n {result.imageType === 'emoji' ? result.image : '🎉'}\n </div>\n </div>\n\n {/* 标题 */}\n <h2 style={{\n fontSize: '32px',\n fontWeight: 800,\n background: 'linear-gradient(135deg, #9333ea 0%, #ec4899 100%)',\n WebkitBackgroundClip: 'text',\n WebkitTextFillColor: 'transparent',\n backgroundClip: 'text',\n marginBottom: '16px',\n lineHeight: 1.3,\n }}>\n {result.title}\n </h2>\n\n {/* 描述卡片 */}\n <div style={{\n background: 'rgba(255, 255, 255, 0.8)',\n borderRadius: '20px',\n padding: '20px 24px',\n marginBottom: '28px',\n boxShadow: '0 4px 15px rgba(168, 85, 247, 0.1)',\n border: '2px dashed rgba(168, 85, 247, 0.2)',\n }}>\n <p style={{\n fontSize: '16px',\n color: '#6b7280',\n lineHeight: 1.7,\n margin: 0,\n }}>\n {result.description}\n </p>\n </div>\n\n {/* 可爱装饰线 */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n marginBottom: '24px',\n }}>\n <span style={{ width: '40px', height: '3px', background: 'linear-gradient(to right, #a855f7, transparent)', borderRadius: '999px' }}></span>\n <span style={{ fontSize: '16px' }}>💕</span>\n <span style={{ width: '40px', height: '3px', background: 'linear-gradient(to left, #ec4899, transparent)', borderRadius: '999px' }}></span>\n </div>\n\n {/* 重新测试按钮 */}\n <button\n onClick={handleReset}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n padding: '14px 32px',\n fontSize: '16px',\n fontWeight: 600,\n color: 'white',\n background: 'linear-gradient(135deg, #a855f7 0%, #ec4899 100%)',\n border: 'none',\n borderRadius: '9999px',\n cursor: 'pointer',\n boxShadow: '0 10px 25px -5px rgba(168, 85, 247, 0.4)',\n transition: 'all 0.3s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = 'scale(1.05) translateY(-2px)';\n e.currentTarget.style.boxShadow = '0 15px 35px -5px rgba(168, 85, 247, 0.5)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'scale(1) translateY(0)';\n e.currentTarget.style.boxShadow = '0 10px 25px -5px rgba(168, 85, 247, 0.4)';\n }}\n >\n <span>🔄</span>\n <span>重新测试</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // 测试界面 - 时尚可爱设计\n return (\n <div className={className} style={backgroundStyle}>\n <DecorativeBackground />\n <div style={{\n position: 'relative',\n zIndex: 10,\n minHeight: '100vh',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '16px',\n }}>\n <div style={{ maxWidth: '512px', width: '100%', textAlign: 'center', userSelect: 'none' }}>\n {/* 标题区域 */}\n <div style={{ marginBottom: '48px' }}>\n <div style={{ \n display: 'inline-block', \n marginBottom: '16px',\n animation: 'bounce-slow 2s ease-in-out infinite',\n }}>\n <span style={{ fontSize: '56px' }}>🎲</span>\n </div>\n <h1 style={{\n fontSize: '48px',\n fontWeight: 900,\n marginBottom: '12px',\n background: 'linear-gradient(135deg, #9333ea 0%, #ec4899 50%, #3b82f6 100%)',\n WebkitBackgroundClip: 'text',\n WebkitTextFillColor: 'transparent',\n backgroundClip: 'text',\n lineHeight: 1.2,\n }}>\n {gameTitle}\n </h1>\n {gameDescription && (\n <p style={{ \n fontSize: '18px', \n color: '#6b7280', \n fontWeight: 500,\n }}>\n {gameDescription}\n </p>\n )}\n </div>\n\n {/* 长按按钮区域 */}\n <div style={{ marginBottom: '24px' }}>\n {/* 主按钮 */}\n <button\n onMouseDown={handlePressStart}\n onMouseLeave={handleMouseLeave}\n onTouchStart={handlePressStart}\n onTouchEnd={handlePressEnd}\n onTouchMove={handleTouchMove}\n onTouchCancel={handlePressEnd}\n onContextMenu={(e) => e.preventDefault()}\n onDragStart={(e) => e.preventDefault()}\n style={{\n display: 'block',\n margin: '0 auto',\n width: '200px',\n height: '200px',\n borderRadius: '50%',\n border: 'none',\n fontSize: '20px',\n fontWeight: 'bold',\n cursor: 'pointer',\n position: 'relative',\n overflow: 'hidden',\n userSelect: 'none',\n WebkitTouchCallout: 'none',\n WebkitUserSelect: 'none',\n touchAction: 'none',\n transition: 'transform 0.3s ease',\n transform: status === 'pressing' ? 'scale(0.95)' : 'scale(1)',\n background: status === 'pressing' \n ? `linear-gradient(to top, rgb(168, 85, 247) ${pressProgress}%, rgb(236, 72, 153) ${pressProgress}%)`\n : 'linear-gradient(135deg, #4f46e5 0%, #7c3aed 25%, #db2777 50%, #f97316 75%, #059669 100%)',\n boxShadow: status === 'pressing' \n ? 'inset 0 4px 12px rgba(0,0,0,0.3), 0 0 0 4px rgba(168, 85, 247, 0.5)'\n : '0 15px 35px -10px rgba(79, 70, 229, 0.6), 0 0 0 4px rgba(255,255,255,0.8)',\n }}\n >\n {/* 按钮内容 */}\n <div style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'white',\n pointerEvents: 'none',\n }}>\n {status === 'pressing' ? (\n <>\n <span style={{ fontSize: '36px', fontWeight: 900, marginBottom: '4px' }}>{Math.round(pressProgress)}%</span>\n <span style={{ fontSize: '14px', opacity: 0.8 }}>继续按住</span>\n </>\n ) : (\n <>\n <span style={{ fontSize: '32px', marginBottom: '8px' }}>👆</span>\n <span style={{ fontSize: '16px', fontWeight: 'bold', padding: '0 16px' }}>{buttonText}</span>\n </>\n )}\n </div>\n\n {/* 内部装饰圆环 */}\n {status === 'idle' && (\n <div style={{\n position: 'absolute',\n top: '16px',\n left: '16px',\n right: '16px',\n bottom: '16px',\n border: '2px solid rgba(255,255,255,0.3)',\n borderRadius: '50%',\n }}></div>\n )}\n </button>\n\n {/* 进度条 */}\n {status === 'pressing' && (\n <div style={{\n marginTop: '16px',\n marginLeft: 'auto',\n marginRight: 'auto',\n width: '192px',\n height: '8px',\n backgroundColor: '#e5e7eb',\n borderRadius: '9999px',\n overflow: 'hidden',\n }}>\n <div style={{\n height: '100%',\n width: `${pressProgress}%`,\n background: 'linear-gradient(to right, #a855f7, #ec4899)',\n transition: 'width 0.1s ease',\n }} />\n </div>\n )}\n </div>\n\n {/* 底部提示 - 简洁可爱 */}\n <div style={{ marginTop: '24px' }}>\n {status === 'pressing' ? (\n <p style={{ \n fontSize: '18px', \n fontWeight: 500, \n color: '#9333ea',\n animation: 'pulse 2s ease-in-out infinite',\n }}>\n ✨ 正在分析中...\n </p>\n ) : (\n <div style={{ \n display: 'flex', \n alignItems: 'center', \n justifyContent: 'center', \n gap: '8px',\n }}>\n <span style={{ \n display: 'inline-block', \n width: '6px', \n height: '6px', \n backgroundColor: '#a855f7', \n borderRadius: '50%',\n animation: 'bounce 1s infinite',\n }} />\n <span style={{ \n display: 'inline-block', \n width: '6px', \n height: '6px', \n backgroundColor: '#ec4899', \n borderRadius: '50%',\n animation: 'bounce 1s infinite 0.1s',\n }} />\n <span style={{ \n display: 'inline-block', \n width: '6px', \n height: '6px', \n backgroundColor: '#3b82f6', \n borderRadius: '50%',\n animation: 'bounce 1s infinite 0.2s',\n }} />\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n// 添加CSS样式来支持触摸优化和动画\nconst touchOptimizationStyles = `\n @keyframes bounce-slow {\n 0%, 100% {\n transform: translateY(0);\n }\n 50% {\n transform: translateY(-10px);\n }\n }\n \n @keyframes bounce {\n 0%, 100% {\n transform: translateY(0);\n }\n 50% {\n transform: translateY(-4px);\n }\n }\n \n @keyframes pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n }\n \n @keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n`;\n\n// 注入样式\nif (typeof document !== 'undefined' && !document.getElementById('test-yourself-styles')) {\n const style = document.createElement('style');\n style.id = 'test-yourself-styles';\n style.textContent = touchOptimizationStyles;\n document.head.appendChild(style);\n};\n\nexport default TestYourself;\n\n\n"]}
@@ -1,5 +1,5 @@
1
- import { DEFAULT_RESULTS } from '../chunk-5XUE72Y3.mjs';
2
- export { ConfigList, ConfigManager, DEFAULT_RESULTS } from '../chunk-5XUE72Y3.mjs';
1
+ import { DEFAULT_RESULTS } from '../chunk-6LEA37ZM.mjs';
2
+ export { ConfigList, ConfigManager, DEFAULT_RESULTS } from '../chunk-6LEA37ZM.mjs';
3
3
  export { DatabaseConfigAdapter, createDatabaseConfigAdapter, testYourselfConfigShares, testYourselfConfigUsage, testYourselfConfigs } from '../chunk-NEPD75MX.mjs';
4
4
  export { ConfigService, createConfigService, getDefaultConfigService } from '../chunk-TFQF2HDO.mjs';
5
5
  import '../chunk-BJTO5JO5.mjs';