fix: 修复开发/测试包模拟进度被易班同步覆盖的问题
进度模拟面板写入 puzzleStore 后,App 启动时易班同步会将其覆盖; 现在在同步完成后按 sessionStorage 中保存的模式重放模拟进度, 确保测试包的"到达某故居/全流程完成"调试入口生效。 同时纳入近期未提交的页面、组件、资源与环境变量改动。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
6d40e19346
commit
49ecabbf3a
155 files changed
+1956
-724
No files matched your search
+65
-2
@@ -1,14 +1,37 @@
|
||||
import { getBackgroundImage, getStaticImage } from '@/lib/utils'
|
||||
import { Image } from '@/components'
|
||||
import { useState } from 'react'
|
||||
import { AnimatePresence, motion } from 'framer-motion'
|
||||
import { getBackgroundImage, getPublicPath, getStaticImage } from '@/lib/utils'
|
||||
import { Image, Video } from '@/components'
|
||||
import { useNavigate } from 'react-router-dom'
|
||||
|
||||
const Home = () => {
|
||||
const navigate = useNavigate()
|
||||
const [showIntroVideo, setShowIntroVideo] = useState(false)
|
||||
|
||||
return (
|
||||
<div
|
||||
className="w-full h-full bg-cover bg-center bg-no-repeat"
|
||||
style={{ backgroundImage: getBackgroundImage('home/首页底图') }}
|
||||
>
|
||||
{/* 课程简介 */}
|
||||
<AnimatePresence>
|
||||
{!showIntroVideo && (
|
||||
<motion.div
|
||||
className="absolute right-0 top-0"
|
||||
initial={{ opacity: 0, scale: 0.92, x: 24 }}
|
||||
animate={{ opacity: 1, scale: 1, x: 0 }}
|
||||
exit={{ opacity: 0, scale: 0.92, x: 24 }}
|
||||
transition={{ duration: 0.22, ease: 'easeOut' }}
|
||||
>
|
||||
<Image
|
||||
src={getStaticImage('home/课程简介')}
|
||||
button
|
||||
onClick={() => setShowIntroVideo(true)}
|
||||
/>
|
||||
</motion.div>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
|
||||
<Image
|
||||
onClick={() => {
|
||||
navigate('/menu')
|
||||
@@ -17,6 +40,46 @@ const Home = () => {
|
||||
button
|
||||
src={getStaticImage('home/首页-进入')}
|
||||
/>
|
||||
|
||||
<AnimatePresence>
|
||||
{showIntroVideo && (
|
||||
<motion.div
|
||||
className="absolute inset-0 z-50 flex items-center justify-center bg-black/65"
|
||||
initial={{ opacity: 0 }}
|
||||
animate={{ opacity: 1 }}
|
||||
exit={{ opacity: 0 }}
|
||||
transition={{ duration: 0.28, ease: 'easeInOut' }}
|
||||
>
|
||||
<motion.div
|
||||
className="relative w-full h-full overflow-hidden bg-black"
|
||||
initial={{ opacity: 0, scale: 1.04 }}
|
||||
animate={{ opacity: 1, scale: 1 }}
|
||||
exit={{ opacity: 0, scale: 1.02 }}
|
||||
transition={{ duration: 0.32, ease: [0.25, 0.46, 0.45, 0.94] }}
|
||||
>
|
||||
<Video
|
||||
className="w-full h-full"
|
||||
src={getPublicPath('video/intro.mp4')}
|
||||
autoPlay
|
||||
controls
|
||||
/>
|
||||
<motion.div
|
||||
className="absolute right-0 top-0 z-10"
|
||||
initial={{ opacity: 0, scale: 0.92, x: 24 }}
|
||||
animate={{ opacity: 1, scale: 1, x: 0 }}
|
||||
exit={{ opacity: 0, scale: 0.92, x: 24 }}
|
||||
transition={{ duration: 0.22, ease: 'easeOut', delay: 0.08 }}
|
||||
>
|
||||
<Image
|
||||
src={getStaticImage('home/点击关闭')}
|
||||
button
|
||||
onClick={() => setShowIntroVideo(false)}
|
||||
/>
|
||||
</motion.div>
|
||||
</motion.div>
|
||||
</motion.div>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user