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.
- package/dist/audioDetection/index.js.map +1 -1
- package/dist/audioDetection/index.mjs.map +1 -1
- package/dist/{chunk-5XUE72Y3.mjs → chunk-6LEA37ZM.mjs} +2 -2
- package/dist/{chunk-5XUE72Y3.mjs.map → chunk-6LEA37ZM.mjs.map} +1 -1
- package/dist/chunk-EBP7AE6F.js +167 -0
- package/dist/chunk-EBP7AE6F.js.map +1 -0
- package/dist/chunk-MBG4DBGP.mjs +154 -0
- package/dist/chunk-MBG4DBGP.mjs.map +1 -0
- package/dist/{chunk-DQVPZTVC.js → chunk-QKXKXAAV.js} +2 -2
- package/dist/{chunk-DQVPZTVC.js.map → chunk-QKXKXAAV.js.map} +1 -1
- package/dist/imageCrop/index.js.map +1 -1
- package/dist/imageCrop/index.mjs.map +1 -1
- package/dist/index-DtLpANUB.d.mts +70 -0
- package/dist/index-DtLpANUB.d.ts +70 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/mmd/admin/index.d.mts +1 -1
- package/dist/mmd/admin/index.d.ts +1 -1
- package/dist/mmd/index.d.mts +16 -2
- package/dist/mmd/index.d.ts +16 -2
- package/dist/mmd/index.js +280 -130
- package/dist/mmd/index.js.map +1 -1
- package/dist/mmd/index.mjs +280 -130
- package/dist/mmd/index.mjs.map +1 -1
- package/dist/mmd/server/index.d.mts +1 -1
- package/dist/mmd/server/index.d.ts +1 -1
- package/dist/music/index.d.mts +30 -0
- package/dist/music/index.d.ts +30 -0
- package/dist/music/index.js +458 -0
- package/dist/music/index.js.map +1 -0
- package/dist/music/index.mjs +427 -0
- package/dist/music/index.mjs.map +1 -0
- package/dist/music/server/index.d.mts +1 -0
- package/dist/music/server/index.d.ts +1 -0
- package/dist/music/server/index.js +29 -0
- package/dist/music/server/index.js.map +1 -0
- package/dist/music/server/index.mjs +4 -0
- package/dist/music/server/index.mjs.map +1 -0
- package/dist/testYourself/admin/index.js +3 -3
- package/dist/testYourself/admin/index.mjs +1 -1
- package/dist/testYourself/index.js +7 -7
- package/dist/testYourself/index.js.map +1 -1
- package/dist/testYourself/index.mjs +2 -2
- package/dist/testYourself/index.mjs.map +1 -1
- package/dist/{types-DxYJqqes.d.mts → types-B60F7EZZ.d.mts} +16 -1
- package/dist/{types-DxYJqqes.d.ts → types-B60F7EZZ.d.ts} +16 -1
- package/dist/universalFile/server/index.js +5 -5
- package/dist/universalFile/server/index.mjs +1 -1
- package/package.json +32 -19
- 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 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
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
|
|
10
|
+
get: function () { return chunkQKXKXAAV_js.ConfigList; }
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "ConfigManager", {
|
|
13
13
|
enumerable: true,
|
|
14
|
-
get: function () { return
|
|
14
|
+
get: function () { return chunkQKXKXAAV_js.ConfigManager; }
|
|
15
15
|
});
|
|
16
16
|
//# sourceMappingURL=index.js.map
|
|
17
17
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
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:
|
|
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 =
|
|
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 :
|
|
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
|
|
712
|
+
get: function () { return chunkQKXKXAAV_js.ConfigList; }
|
|
713
713
|
});
|
|
714
714
|
Object.defineProperty(exports, "ConfigManager", {
|
|
715
715
|
enumerable: true,
|
|
716
|
-
get: function () { return
|
|
716
|
+
get: function () { return chunkQKXKXAAV_js.ConfigManager; }
|
|
717
717
|
});
|
|
718
718
|
Object.defineProperty(exports, "DEFAULT_RESULTS", {
|
|
719
719
|
enumerable: true,
|
|
720
|
-
get: function () { return
|
|
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":";;;;;;;;;;;;;AAUA,SAAS,oBAAA,GAA+B;AACtC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,KAAK,OAAO,WAAA;AAEjB,IAAA,MAAA,CAAO,KAAA,GAAQ,GAAA;AACf,IAAA,MAAA,CAAO,MAAA,GAAS,EAAA;AAGhB,IAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AACnB,IAAA,GAAA,CAAI,IAAA,GAAO,YAAA;AACX,IAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,EAAE,CAAA;AAC1B,IAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,8BAAA,EAAyB,CAAA,EAAG,EAAE,CAAA;AAG3C,IAAA,OAAO,OAAO,SAAA,EAAU;AAAA,EAC1B,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,cAAA;AAAA,EACT;AACF;AAKA,SAAS,mBAAA,GAA8B;AACrC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAM,KAAK,MAAA,CAAO,UAAA,CAAW,OAAO,CAAA,IAAK,MAAA,CAAO,WAAW,oBAAoB,CAAA;AAC/E,IAAA,IAAI,CAAC,IAAI,OAAO,UAAA;AAEhB,IAAA,MAAM,SAAA,GAAY,EAAA;AAClB,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,YAAA,CAAa,2BAA2B,CAAA;AAEpE,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,MAAA,GAAS,SAAA,CAAU,YAAA,CAAa,SAAA,CAAU,qBAAqB,CAAA;AACrE,MAAA,MAAM,QAAA,GAAW,SAAA,CAAU,YAAA,CAAa,SAAA,CAAU,uBAAuB,CAAA;AACzE,MAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,gBAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,aAAA;AAAA,EACT;AACF;AAKA,SAAS,iBAAA,GAA4B;AACnC,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,OAAA;AAAA,IAAS,SAAA;AAAA,IAAW,aAAA;AAAA,IAAe,SAAA;AAAA,IAAW,iBAAA;AAAA,IAC9C,eAAA;AAAA,IAAiB,cAAA;AAAA,IAAgB,aAAA;AAAA,IAAe,QAAA;AAAA,IAChD,SAAA;AAAA,IAAW,WAAA;AAAA,IAAa,QAAA;AAAA,IAAU,UAAA;AAAA,IAAY;AAAA,GAChD;AAEA,EAAA,MAAM,iBAA2B,EAAC;AAClC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAElC,EAAA,IAAI,CAAC,KAAK,OAAO,UAAA;AAEjB,EAAA,MAAM,SAAA,GAAY,CAAC,WAAA,EAAa,YAAA,EAAc,OAAO,CAAA;AACrD,EAAA,MAAM,UAAA,GAAa,eAAA;AACnB,EAAA,MAAM,aAAwC,EAAC;AAG/C,EAAA,SAAA,CAAU,QAAQ,CAAA,IAAA,KAAQ;AACxB,IAAA,GAAA,CAAI,IAAA,GAAO,QAAQ,IAAI,CAAA,CAAA;AACvB,IAAA,UAAA,CAAW,IAAI,CAAA,GAAI,GAAA,CAAI,WAAA,CAAY,UAAU,CAAA,CAAE,KAAA;AAAA,EACjD,CAAC,CAAA;AAGD,EAAA,SAAA,CAAU,QAAQ,CAAA,IAAA,KAAQ;AACxB,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,SAAA,CAAU,QAAQ,CAAA,QAAA,KAAY;AAC5B,MAAA,GAAA,CAAI,IAAA,GAAO,CAAA,KAAA,EAAQ,IAAI,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA;AACpC,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,WAAA,CAAY,UAAU,CAAA,CAAE,KAAA;AAC1C,MAAA,IAAI,KAAA,KAAU,UAAA,CAAW,QAAQ,CAAA,EAAG;AAClC,QAAA,QAAA,GAAW,IAAA;AAAA,MACb;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,cAAA,CAAe,KAAK,IAAI,CAAA;AAAA,IAC1B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA,IAAK,iBAAA;AACrC;AAKO,SAAS,oBAAA,GAA0C;AACxD,EAAA,MAAM,WAAA,GAAiC;AAAA;AAAA,IAErC,WAAW,SAAA,CAAU,SAAA;AAAA,IACrB,gBAAA,EAAkB,GAAG,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,MAAM,CAAA,CAAA;AAAA,IAChE,QAAA,EAAU,IAAA,CAAK,cAAA,EAAe,CAAE,iBAAgB,CAAE,QAAA;AAAA,IAClD,UAAU,SAAA,CAAU,QAAA;AAAA,IACpB,UAAU,SAAA,CAAU,QAAA;AAAA;AAAA,IAGpB,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,IAC1B,kBAAkB,MAAA,CAAO,gBAAA;AAAA;AAAA,IAGzB,mBAAA,EAAqB,UAAU,mBAAA,IAAuB,CAAA;AAAA,IACtD,cAAA,EAAgB,UAAU,cAAA,IAAkB,CAAA;AAAA;AAAA,IAG5C,mBAAmB,oBAAA,EAAqB;AAAA,IACxC,kBAAkB,mBAAA,EAAoB;AAAA;AAAA,IAGtC,OAAO,iBAAA,EAAkB;AAAA;AAAA,IAGzB,eAAe,SAAA,CAAU,aAAA;AAAA,IACzB,sBAAsB,MAAM;AAC1B,MAAA,IAAI;AACF,QAAA,OAAO,OAAO,YAAA,KAAiB,WAAA;AAAA,MACjC,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,CAAA,GAAG;AAAA,IACH,wBAAwB,MAAM;AAC5B,MAAA,IAAI;AACF,QAAA,OAAO,OAAO,cAAA,KAAmB,WAAA;AAAA,MACnC,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,CAAA,GAAG;AAAA,IACH,mBAAmB,MAAM;AACvB,MAAA,IAAI;AACF,QAAA,OAAO,OAAO,SAAA,KAAc,WAAA;AAAA,MAC9B,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAG,GACL;AAEA,EAAA,OAAO,WAAA;AACT;AAMA,eAAsB,eAAA,GAA0C;AAC9D,EAAA,IAAI;AAGF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,mCAAA,EAAqC;AAAA,MAChE,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,OAAO,KAAK,EAAA,IAAM,IAAA;AAAA,IACpB;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,2CAAa,KAAK,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,IAAA,GAAA,CAAS,IAAA,IAAQ,CAAA,IAAK,IAAA,GAAQ,GAAA,CAAI,WAAW,CAAC,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,IAAA,CAAK,IAAI,IAAI,CAAA;AACtB;AAQO,SAAS,kBAAA,CACd,WAAA,EACA,IAAA,GAAe,yBAAA,EACP;AAER,EAAA,MAAM,UAAA,GAAa;AAAA;AAAA,IAEjB,WAAA,CAAY,SAAA;AAAA,IACZ,YAAY,EAAA,IAAM,OAAA;AAAA,IAClB,WAAA,CAAY,gBAAA;AAAA,IACZ,WAAA,CAAY,QAAA;AAAA,IACZ,WAAA,CAAY,QAAA;AAAA,IACZ,WAAA,CAAY,QAAA;AAAA;AAAA,IAGZ,WAAA,CAAY,UAAA,EAAY,QAAA,EAAS,IAAK,GAAA;AAAA,IACtC,WAAA,CAAY,gBAAA,EAAkB,QAAA,EAAS,IAAK,GAAA;AAAA;AAAA,IAG5C,WAAA,CAAY,mBAAA,EAAqB,QAAA,EAAS,IAAK,GAAA;AAAA,IAC/C,WAAA,CAAY,cAAA,EAAgB,QAAA,EAAS,IAAK,GAAA;AAAA;AAAA,IAG1C,YAAY,iBAAA,IAAqB,WAAA;AAAA,IACjC,YAAY,gBAAA,IAAoB,UAAA;AAAA;AAAA,IAGhC,YAAY,KAAA,IAAS,UAAA;AAAA;AAAA,IAGrB,WAAA,CAAY,gBAAgB,GAAA,GAAM,GAAA;AAAA,IAClC,WAAA,CAAY,sBAAsB,GAAA,GAAM,GAAA;AAAA,IACxC,WAAA,CAAY,wBAAwB,GAAA,GAAM,GAAA;AAAA,IAC1C,WAAA,CAAY,mBAAmB,GAAA,GAAM,GAAA;AAAA;AAAA,IAGrC;AAAA,GACF;AAGA,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AACpC,EAAA,MAAM,IAAA,GAAO,WAAW,QAAQ,CAAA;AAEhC,EAAA,OAAO,IAAA,CAAK,SAAS,EAAE,CAAA;AACzB;AAQO,SAAS,iBAAA,CAAkB,MAAc,YAAA,EAA8B;AAC5E,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA;AACjC,EAAA,OAAO,OAAA,GAAU,YAAA;AACnB;;;AC5OA,IAAM,WAAA,GAAc,sBAAA;AAEb,IAAM,eAA4C,CAAC;AAAA,EACxD,MAAA,EAAQ,UAAA;AAAA,EACR,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAA4B,IAAI,CAAA;AACxE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAGxD,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,aAAa,YAAY;AAC7B,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,QAAA,IAAI;AAEF,UAAA,MAAM,EAAE,uBAAA,EAAAC,wBAAAA,EAAwB,GAAI,MAAM,OAAO,8BAAyB,CAAA;AAC1E,UAAA,MAAM,UAAUA,wBAAAA,EAAwB;AACxC,UAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,SAAA,CAAU,QAAQ,CAAA;AACpD,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,eAAA,CAAgB,YAAY,MAAM,CAAA;AAAA,UACpC,CAAA,MAAO;AACL,YAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,aAAA,EAAM,QAAQ,CAAA,6DAAA,CAAa,CAAA;AAAA,UAC1C;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,yCAAW,KAAK,CAAA;AAAA,QAChC,CAAA,SAAE;AACA,UAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,QACxB;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,UAAA,EAAW;AAAA,EACb,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,MAAM,MAAA,GAAS,gBAAgB,UAAA,IAAc;AAAA,IAC3C,SAAA,EAAW,sCAAA;AAAA,IACX,eAAA,EAAiB,gFAAA;AAAA,IACjB,OAAA,EAASC;AAAA,GACX;AAEA,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,eAAA;AAAA,IACA,UAAA,GAAa,sCAAA;AAAA,IACb,iBAAA,GAAoB,GAAA;AAAA,IACpB,OAAA,GAAUA,gCAAA;AAAA,IACV,aAAA,GAAgB,KAAA;AAAA,IAChB,UAAA;AAAA,IACA,WAAA,GAAc;AAAA,GAChB,GAAI,MAAA;AAEJ,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIH,eAAqB,MAAM,CAAA;AACvD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAA4B,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAS,CAAC,CAAA;AACpD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,IAAI,CAAA;AAE/C,EAAA,MAAM,aAAA,GAAgBI,aAA8B,IAAI,CAAA;AACxD,EAAA,MAAM,mBAAA,GAAsBA,aAA8B,IAAI,CAAA;AAC9D,EAAA,MAAM,YAAA,GAAeA,aAAe,CAAC,CAAA;AAGrC,EAAAH,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,iBAAiB,YAAY;AAEjC,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,aAAa,QAAA,GAAW,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,WAAA;AAG7D,MAAA,MAAM,WAAA,GAAc,YAAA,CAAa,OAAA,CAAQ,UAAU,CAAA;AACnD,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AACrC,UAAA,SAAA,CAAU,MAAM,CAAA;AAChB,UAAA,SAAA,CAAU,WAAW,CAAA;AACrB,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,2DAAc,KAAK,CAAA;AAAA,QACnC;AAAA,MACF;AAGA,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,MAAM,EAAA,GAAK,MAAM,eAAA,EAAgB;AACjC,QAAA,IAAI,CAAC,EAAA,EAAI;AACP,UAAA,YAAA,CAAa,yIAA2B,CAAA;AAAA,QAC1C;AAAA,MACF;AAEA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AAEA,IAAA,cAAA,EAAe;AAAA,EACjB,CAAA,EAAG,CAAC,aAAA,EAAe,aAAA,EAAe,QAAQ,CAAC,CAAA;AAG3C,EAAA,MAAM,kBAAkB,YAAiC;AACvD,IAAA,IAAI;AAEF,MAAA,MAAM,cAAiC,oBAAA,EAAqB;AAG5D,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,MAAM,EAAA,GAAK,MAAM,eAAA,EAAgB;AACjC,QAAA,IAAI,EAAA,EAAI;AACN,UAAA,WAAA,CAAY,EAAA,GAAK,EAAA;AAAA,QACnB;AAAA,MACF;AAGA,MAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAUE,gCAAA;AAGrD,MAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,WAAA,EAAa,UAAU,CAAA;AAGvD,MAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,IAAA,EAAM,aAAA,CAAc,MAAM,CAAA;AAC1D,MAAA,MAAM,cAAA,GAAiB,cAAc,KAAK,CAAA;AAE1C,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,OAAA,CAAQ,KAAA,CAAM,8DAAA,EAAmB,KAAA,EAAO,QAAA,EAAU,cAAc,MAAM,CAAA;AACtE,QAAA,MAAM,IAAI,MAAM,kDAAU,CAAA;AAAA,MAC5B;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,yCAAW,cAAc,CAAA;AAGrC,MAAA,MAAM,aAAa,QAAA,GAAW,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,WAAA;AAC7D,MAAA,YAAA,CAAa,OAAA,CAAQ,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,cAAc,CAAC,CAAA;AAE/D,MAAA,OAAO,cAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yCAAW,KAAK,CAAA;AAC9B,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,KAA2C;AACnE,IAAA,IAAI,WAAW,MAAA,EAAQ;AAGvB,IAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,IAAA,SAAA,CAAU,UAAU,CAAA;AACpB,IAAA,YAAA,CAAa,OAAA,GAAU,KAAK,GAAA,EAAI;AAGhC,IAAA,mBAAA,CAAoB,OAAA,GAAU,YAAY,MAAM;AAC9C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,YAAA,CAAa,OAAA;AAC1C,MAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAK,OAAA,GAAU,iBAAA,GAAqB,KAAK,GAAG,CAAA;AAClE,MAAA,gBAAA,CAAiB,QAAQ,CAAA;AAAA,IAC3B,GAAG,EAAE,CAAA;AAGL,IAAA,aAAA,CAAc,OAAA,GAAU,WAAW,YAAY;AAC7C,MAAA,IAAI;AACF,QAAA,gBAAA,CAAiB,GAAG,CAAA;AAGpB,QAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,UAAA,aAAA,CAAc,oBAAoB,OAAO,CAAA;AACzC,UAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAAA,QAChC;AAEA,QAAA,OAAA,CAAQ,IAAI,yCAAW,CAAA;AAGvB,QAAA,MAAM,UAAA,GAAa,MAAM,eAAA,EAAgB;AAEzC,QAAA,OAAA,CAAQ,GAAA,CAAI,uEAAgB,UAAU,CAAA;AAGtC,QAAA,SAAA,CAAU,UAAU,CAAA;AAGpB,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,SAAA,CAAU,WAAW,CAAA;AACrB,UAAA,OAAA,CAAQ,IAAI,gDAAkB,CAAA;AAAA,QAChC,GAAG,CAAC,CAAA;AAGJ,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,QAAA,CAAS,UAAU,CAAA;AAAA,QACrB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,6BAAS,KAAK,CAAA;AAE5B,QAAA,SAAA,CAAU,MAAM,CAAA;AAChB,QAAA,gBAAA,CAAiB,CAAC,CAAA;AAClB,QAAA,KAAA,CAAM,kDAAU,CAAA;AAAA,MAClB;AAAA,IACF,GAAG,iBAAiB,CAAA;AAGpB,IAAA,IAAI,QAAA,IAAY,CAAA,IAAK,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AAEnC,MAAA,MAAM,sBAAsB,MAAM;AAChC,QAAA,cAAA,EAAe;AACf,QAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,mBAAmB,CAAA;AAAA,MAC7D,CAAA;AACA,MAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,mBAAmB,CAAA;AAAA,IAC1D;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,WAAW,UAAA,EAAY;AAG3B,IAAA,IAAI,cAAc,OAAA,EAAS;AACzB,MAAA,YAAA,CAAa,cAAc,OAAO,CAAA;AAClC,MAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAAA,IAC1B;AACA,IAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,MAAA,aAAA,CAAc,oBAAoB,OAAO,CAAA;AACzC,MAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAAA,IAChC;AAGA,IAAA,SAAA,CAAU,MAAM,CAAA;AAChB,IAAA,gBAAA,CAAiB,CAAC,CAAA;AAAA,EACpB,CAAA;AAGA,EAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,KAAwB;AAAA,EAGlD,CAAA;AAGA,EAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAwB;AAE/C,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AACzB,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,SAAS,CAAA,CAAE,aAAA;AACjB,IAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAE1C,IAAA,MAAM,QAAA,GACJ,KAAA,CAAM,OAAA,IAAW,IAAA,CAAK,QACtB,KAAA,CAAM,OAAA,IAAW,IAAA,CAAK,KAAA,IACtB,MAAM,OAAA,IAAW,IAAA,CAAK,GAAA,IACtB,KAAA,CAAM,WAAW,IAAA,CAAK,MAAA;AAGxB,IAAA,IAAI,CAAC,QAAA,IAAY,MAAA,KAAW,UAAA,EAAY;AACtC,MAAA,cAAA,EAAe;AAAA,IACjB;AAAA,EACF,CAAA;AAGA,EAAAF,eAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,cAAc,OAAA,EAAS;AACzB,QAAA,YAAA,CAAa,cAAc,OAAO,CAAA;AAAA,MACpC;AACA,MAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,QAAA,aAAA,CAAc,oBAAoB,OAAO,CAAA;AAAA,MAC3C;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,MAAM,aAAa,QAAA,GAAW,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,WAAA;AAC7D,IAAA,YAAA,CAAa,WAAW,UAAU,CAAA;AAClC,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,SAAA,CAAU,MAAM,CAAA;AAChB,IAAA,gBAAA,CAAiB,CAAC,CAAA;AAAA,EACpB,CAAA;AAGA,EAAA,MAAM,eAAA,GAAuC;AAAA,IAC3C,QAAA,EAAU,UAAA;AAAA,IACV,SAAA,EAAW,OAAA;AAAA,IACX,QAAA,EAAU,QAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACd;AAGA,EAAA,MAAM,oBAAA,GAAuB,sBAC3BI,sBAAA,CAAA,aAAA,CAAAA,sBAAA,CAAA,QAAA,EAAA,IAAA,kBACEA,sBAAA,CAAA,aAAA,CAAC,SAAI,KAAA,EAAO;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,GAAA,EAAK,CAAA;AAAA,IACL,IAAA,EAAM,CAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,OAAA;AAAA,IACR,UAAA,EAAY,uEAAA;AAAA,IACZ,YAAA,EAAc,KAAA;AAAA,IACd,MAAA,EAAQ,YAAA;AAAA,IACR,SAAA,EAAW,uBAAA;AAAA,IACX,aAAA,EAAe;AAAA,GACjB,EAAG,CAAA,kBACHA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,GAAA,EAAK,KAAA;AAAA,IACL,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,OAAA;AAAA,IACR,UAAA,EAAY,uEAAA;AAAA,IACZ,YAAA,EAAc,KAAA;AAAA,IACd,MAAA,EAAQ,YAAA;AAAA,IACR,SAAA,EAAW,iBAAA;AAAA,IACX,aAAA,EAAe;AAAA,GACjB,EAAG,CAAA,kBACHA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ,CAAA;AAAA,IACR,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,OAAA;AAAA,IACR,UAAA,EAAY,uEAAA;AAAA,IACZ,YAAA,EAAc,KAAA;AAAA,IACd,MAAA,EAAQ,YAAA;AAAA,IACR,SAAA,EAAW,sBAAA;AAAA,IACX,aAAA,EAAe;AAAA,KACd,CACL,CAAA;AAGF,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBACEA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,eAAA,EAAA,uDAC/B,oBAAA,EAAA,IAAqB,CAAA,kBACtBA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO;AAAA,MACV,QAAA,EAAU,UAAA;AAAA,MACV,MAAA,EAAQ,EAAA;AAAA,MACR,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,QAAA;AAAA,MAChB,SAAA,EAAW;AAAA,KACb,EAAA,kBACEA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,WAAW,QAAA,EAAS,EAAA,kBAChCA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO;AAAA,MACV,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,MAAA;AAAA,MACR,MAAA,EAAQ;AAAA,KACV,EAAA,kBACEA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO;AAAA,MACV,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,mBAAA;AAAA,MACR,YAAA,EAAc;AAAA,KAChB,EAAG,CAAA,kBACHA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO;AAAA,MACV,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,uBAAA;AAAA,MACR,cAAA,EAAgB,SAAA;AAAA,MAChB,YAAA,EAAc,KAAA;AAAA,MACd,SAAA,EAAW;AAAA,KACb,EAAG,CACL,CAAA,kBACAA,sBAAA,CAAA,aAAA,CAAC,OAAE,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,OAAO,SAAA,EAAU,EAAA,EAAG,2BAAK,CACzD,CACF,CACF,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,MAAA,KAAW,eAAe,MAAA,EAAQ;AACpC,IAAA,uBACEA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,eAAA,EAAA,uDAC/B,oBAAA,EAAA,IAAqB,CAAA,kBACtBA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO;AAAA,MACV,QAAA,EAAU,UAAA;AAAA,MACV,MAAA,EAAQ,EAAA;AAAA,MACR,SAAA,EAAW,OAAA;AAAA,MACX,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,QAAA;AAAA,MAChB,OAAA,EAAS;AAAA,KACX,EAAA,kBACAA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO,MAAA,EAAO,EAAA,kBAE7CA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO;AAAA,MACV,QAAA,EAAU,UAAA;AAAA,MACV,UAAA,EAAY,gEAAA;AAAA,MACZ,YAAA,EAAc,MAAA;AAAA,MACd,SAAA,EAAW,+EAAA;AAAA,MACX,QAAA,EAAU,QAAA;AAAA,MACV,OAAA,EAAS,WAAA;AAAA,MACT,SAAA,EAAW;AAAA,yBAGXA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,UAAU,UAAA,EAAY,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,QAAQ,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,GAAA,MAAO,QAAC,CAAA,kBAClGA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,QAAA,EAAU,UAAA,EAAY,GAAA,EAAK,QAAQ,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,SAAS,GAAA,EAAI,EAAA,EAAG,QAAC,CAAA,kBACnGA,sBAAA,CAAA,aAAA,CAAC,SAAI,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,QAAQ,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,QAAQ,OAAA,EAAS,GAAA,EAAI,EAAA,EAAG,WAAE,mBACtGA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,UAAU,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,QAAQ,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,GAAA,MAAO,WAAE,CAAA,kBAGvGA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,YAAA,EAAc,QAAO,EAAA,kBACjCA,sBAAA,CAAA,aAAA,CAAC,SAAI,KAAA,EAAO;AAAA,MACV,OAAA,EAAS,cAAA;AAAA,MACT,QAAA,EAAU,MAAA;AAAA,MACV,SAAA,EAAW,qCAAA;AAAA,MACX,MAAA,EAAQ;AAAA,KACV,EAAA,EACG,MAAA,CAAO,SAAA,KAAc,OAAA,GAAU,MAAA,CAAO,KAAA,GAAQ,WACjD,CACF,CAAA,kBAGAA,sBAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO;AAAA,MACT,QAAA,EAAU,MAAA;AAAA,MACV,UAAA,EAAY,GAAA;AAAA,MACZ,UAAA,EAAY,mDAAA;AAAA,MACZ,oBAAA,EAAsB,MAAA;AAAA,MACtB,mBAAA,EAAqB,aAAA;AAAA,MACrB,cAAA,EAAgB,MAAA;AAAA,MAChB,YAAA,EAAc,MAAA;AAAA,MACd,UAAA,EAAY;AAAA,SAEX,MAAA,CAAO,KACV,CAAA,kBAGAA,sBAAA,CAAA,aAAA,CAAC,SAAI,KAAA,EAAO;AAAA,MACV,UAAA,EAAY,0BAAA;AAAA,MACZ,YAAA,EAAc,MAAA;AAAA,MACd,OAAA,EAAS,WAAA;AAAA,MACT,YAAA,EAAc,MAAA;AAAA,MACd,SAAA,EAAW,oCAAA;AAAA,MACX,MAAA,EAAQ;AAAA,KACV,EAAA,kBACEA,sBAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO;AAAA,MACR,QAAA,EAAU,MAAA;AAAA,MACV,KAAA,EAAO,SAAA;AAAA,MACP,UAAA,EAAY,GAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,SAEP,MAAA,CAAO,WACV,CACF,CAAA,kBAGAA,sBAAA,CAAA,aAAA,CAAC,SAAI,KAAA,EAAO;AAAA,MACV,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,QAAA;AAAA,MAChB,GAAA,EAAK,KAAA;AAAA,MACL,YAAA,EAAc;AAAA,yBAEdA,sBAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAO,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAY,mDAAmD,YAAA,EAAc,OAAA,IAAW,CAAA,kBACrIA,sBAAA,CAAA,aAAA,CAAC,UAAK,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,MAAU,WAAE,CAAA,kBACrCA,sBAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,OAAO,UAAA,EAAY,gDAAA,EAAkD,cAAc,OAAA,EAAQ,EAAG,CACtI,CAAA,kBAGAA,sBAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,WAAA;AAAA,QACT,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,aAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,GAAA,EAAK,KAAA;AAAA,UACL,OAAA,EAAS,WAAA;AAAA,UACT,QAAA,EAAU,MAAA;AAAA,UACV,UAAA,EAAY,GAAA;AAAA,UACZ,KAAA,EAAO,OAAA;AAAA,UACP,UAAA,EAAY,mDAAA;AAAA,UACZ,MAAA,EAAQ,MAAA;AAAA,UACR,YAAA,EAAc,QAAA;AAAA,UACd,MAAA,EAAQ,SAAA;AAAA,UACR,SAAA,EAAW,0CAAA;AAAA,UACX,UAAA,EAAY;AAAA,SACd;AAAA,QACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,UAAA,CAAA,CAAE,aAAA,CAAc,MAAM,SAAA,GAAY,8BAAA;AAClC,UAAA,CAAA,CAAE,aAAA,CAAc,MAAM,SAAA,GAAY,0CAAA;AAAA,QACpC,CAAA;AAAA,QACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,UAAA,CAAA,CAAE,aAAA,CAAc,MAAM,SAAA,GAAY,wBAAA;AAClC,UAAA,CAAA,CAAE,aAAA,CAAc,MAAM,SAAA,GAAY,0CAAA;AAAA,QACpC;AAAA,OAAA;AAAA,sBAEAA,sBAAA,CAAA,aAAA,CAAC,cAAK,WAAE,CAAA;AAAA,sBACRA,sBAAA,CAAA,aAAA,CAAC,cAAK,0BAAI;AAAA,KAEd,CACF,CACA,CACF,CAAA;AAAA,EAEJ;AAGA,EAAA,uBACEA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,eAAA,EAAA,uDAC/B,oBAAA,EAAA,IAAqB,CAAA,kBACtBA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ,EAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,OAAA,EAAS;AAAA,GACX,EAAA,uDACC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,YAAY,MAAA,EAAO,EAAA,kBAEtFA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,cAAc,MAAA,EAAO,EAAA,kBACjCA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO;AAAA,IACV,OAAA,EAAS,cAAA;AAAA,IACT,YAAA,EAAc,MAAA;AAAA,IACd,SAAA,EAAW;AAAA,GACb,EAAA,kBACEA,sBAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAO,EAAA,EAAG,WAAE,CACvC,CAAA,kBACAA,sBAAA,CAAA,aAAA,CAAC,QAAG,KAAA,EAAO;AAAA,IACT,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,YAAA,EAAc,MAAA;AAAA,IACd,UAAA,EAAY,gEAAA;AAAA,IACZ,oBAAA,EAAsB,MAAA;AAAA,IACtB,mBAAA,EAAqB,aAAA;AAAA,IACrB,cAAA,EAAgB,MAAA;AAAA,IAChB,UAAA,EAAY;AAAA,OAEX,SACH,CAAA,EACC,eAAA,oBACCA,sBAAA,CAAA,aAAA,CAAC,OAAE,KAAA,EAAO;AAAA,IACR,QAAA,EAAU,MAAA;AAAA,IACV,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY;AAAA,GACd,EAAA,EACG,eACH,CAEJ,CAAA,kBAGAA,sBAAA,CAAA,aAAA,CAAC,SAAI,KAAA,EAAO,EAAE,YAAA,EAAc,MAAA,EAAO,EAAA,kBAEjCA,sBAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAa,gBAAA;AAAA,MACb,YAAA,EAAc,gBAAA;AAAA,MACd,YAAA,EAAc,gBAAA;AAAA,MACd,UAAA,EAAY,cAAA;AAAA,MACZ,WAAA,EAAa,eAAA;AAAA,MACb,aAAA,EAAe,cAAA;AAAA,MACf,aAAA,EAAe,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAe;AAAA,MACvC,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAe;AAAA,MACrC,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,OAAA;AAAA,QACT,MAAA,EAAQ,QAAA;AAAA,QACR,KAAA,EAAO,OAAA;AAAA,QACP,MAAA,EAAQ,OAAA;AAAA,QACR,YAAA,EAAc,KAAA;AAAA,QACd,MAAA,EAAQ,MAAA;AAAA,QACR,QAAA,EAAU,MAAA;AAAA,QACV,UAAA,EAAY,MAAA;AAAA,QACZ,MAAA,EAAQ,SAAA;AAAA,QACR,QAAA,EAAU,UAAA;AAAA,QACV,QAAA,EAAU,QAAA;AAAA,QACV,UAAA,EAAY,MAAA;AAAA,QACZ,kBAAA,EAAoB,MAAA;AAAA,QACpB,gBAAA,EAAkB,MAAA;AAAA,QAClB,WAAA,EAAa,MAAA;AAAA,QACb,UAAA,EAAY,qBAAA;AAAA,QACZ,SAAA,EAAW,MAAA,KAAW,UAAA,GAAa,aAAA,GAAgB,UAAA;AAAA,QACnD,YAAY,MAAA,KAAW,UAAA,GACnB,6CAA6C,aAAa,CAAA,qBAAA,EAAwB,aAAa,CAAA,EAAA,CAAA,GAC/F,0FAAA;AAAA,QACJ,SAAA,EAAW,MAAA,KAAW,UAAA,GAClB,qEAAA,GACA;AAAA;AACN,KAAA;AAAA,oBAGAA,sBAAA,CAAA,aAAA,CAAC,SAAI,KAAA,EAAO;AAAA,MACV,QAAA,EAAU,UAAA;AAAA,MACV,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM,CAAA;AAAA,MACN,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,QAAA;AAAA,MACf,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,QAAA;AAAA,MAChB,KAAA,EAAO,OAAA;AAAA,MACP,aAAA,EAAe;AAAA,KACjB,EAAA,EACG,MAAA,KAAW,UAAA,mBACVA,sBAAA,CAAA,aAAA,CAAAA,sBAAA,CAAA,QAAA,EAAA,IAAA,kBACEA,sBAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,GAAA,EAAK,YAAA,EAAc,KAAA,EAAM,EAAA,EAAI,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA,EAAE,GAAC,CAAA,kBACrGA,sBAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,GAAA,MAAO,0BAAI,CACvD,CAAA,mBAEAA,sBAAA,CAAA,aAAA,CAAAA,sBAAA,CAAA,QAAA,EAAA,IAAA,kBACEA,sBAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,YAAA,EAAc,KAAA,EAAM,EAAA,EAAG,WAAE,CAAA,kBAC1DA,sBAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAS,EAAA,EAAI,UAAW,CACxF,CAEJ,CAAA;AAAA,IAGC,MAAA,KAAW,MAAA,oBACVA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO;AAAA,MACV,QAAA,EAAU,UAAA;AAAA,MACV,GAAA,EAAK,MAAA;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,MAAA;AAAA,MACR,MAAA,EAAQ,iCAAA;AAAA,MACR,YAAA,EAAc;AAAA,KAChB,EAAG;AAAA,GAEP,EAGC,MAAA,KAAW,UAAA,oBACVA,sBAAA,CAAA,aAAA,CAAC,SAAI,KAAA,EAAO;AAAA,IACV,SAAA,EAAW,MAAA;AAAA,IACX,UAAA,EAAY,MAAA;AAAA,IACZ,WAAA,EAAa,MAAA;AAAA,IACb,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,KAAA;AAAA,IACR,eAAA,EAAiB,SAAA;AAAA,IACjB,YAAA,EAAc,QAAA;AAAA,IACd,QAAA,EAAU;AAAA,GACZ,EAAA,kBACEA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO;AAAA,IACV,MAAA,EAAQ,MAAA;AAAA,IACR,KAAA,EAAO,GAAG,aAAa,CAAA,CAAA,CAAA;AAAA,IACvB,UAAA,EAAY,6CAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd,EAAG,CACL,CAEJ,CAAA,uDAGC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EAAW,QAAO,EAAA,EAC7B,MAAA,KAAW,UAAA,mBACVA,sBAAA,CAAA,aAAA,CAAC,OAAE,KAAA,EAAO;AAAA,IACR,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,KAAA,EAAO,SAAA;AAAA,IACP,SAAA,EAAW;AAAA,GACb,EAAA,EAAG,0CAEH,CAAA,mBAEAA,sBAAA,CAAA,aAAA,CAAC,SAAI,KAAA,EAAO;AAAA,IACV,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,GAAA,EAAK;AAAA,GACP,EAAA,kBACEA,sBAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO;AAAA,IACX,OAAA,EAAS,cAAA;AAAA,IACT,KAAA,EAAO,KAAA;AAAA,IACP,MAAA,EAAQ,KAAA;AAAA,IACR,eAAA,EAAiB,SAAA;AAAA,IACjB,YAAA,EAAc,KAAA;AAAA,IACd,SAAA,EAAW;AAAA,GACb,EAAG,CAAA,kBACHA,sBAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO;AAAA,IACX,OAAA,EAAS,cAAA;AAAA,IACT,KAAA,EAAO,KAAA;AAAA,IACP,MAAA,EAAQ,KAAA;AAAA,IACR,eAAA,EAAiB,SAAA;AAAA,IACjB,YAAA,EAAc,KAAA;AAAA,IACd,SAAA,EAAW;AAAA,GACb,EAAG,CAAA,kBACHA,sBAAA,CAAA,aAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO;AAAA,IACX,OAAA,EAAS,cAAA;AAAA,IACT,KAAA,EAAO,KAAA;AAAA,IACP,MAAA,EAAQ,KAAA;AAAA,IACR,eAAA,EAAiB,SAAA;AAAA,IACjB,YAAA,EAAc,KAAA;AAAA,IACd,SAAA,EAAW;AAAA,GACb,EAAG,CACL,CAEJ,CACF,CACA,CACF,CAAA;AAEJ;AAGA,IAAM,uBAAA,GAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAuChC,IAAI,OAAO,QAAA,KAAa,WAAA,IAAe,CAAC,QAAA,CAAS,cAAA,CAAe,sBAAsB,CAAA,EAAG;AACvF,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,EAAA,GAAK,sBAAA;AACX,EAAA,KAAA,CAAM,WAAA,GAAc,uBAAA;AACpB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AACjC","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-
|
|
2
|
-
export { ConfigList, ConfigManager, DEFAULT_RESULTS } from '../chunk-
|
|
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';
|