feat:添加黄炎培成长之路页面内容;学业选择框和思想选择框
This commit is contained in:
1 parent
ae0c050010
commit
66f460633a
5 files changed
+450
-24
No files matched your search
@@ -1,30 +1,32 @@
|
|||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { Title, Image, Cursor, ExhibitOverlay } from "@/components";
|
import { Title, Image, Cursor } from "@/components";
|
||||||
import { getBackgroundImage, getStaticImage } from "@/lib/utils";
|
import { getBackgroundImage, getStaticImage } from "@/lib/utils";
|
||||||
import { useNavigate, useParams } from "react-router-dom";
|
import { useNavigate, useParams } from "react-router-dom";
|
||||||
|
import ChoiceDialog1 from "./scene2/ChoiceDialog1";
|
||||||
|
import ChoiceDialog2 from "./scene2/ChoiceDialog2";
|
||||||
|
|
||||||
const starName = "huangyanpei";
|
const starName = "huangyanpei";
|
||||||
|
|
||||||
const exhibitSrcMap: Record<1, string> = {
|
|
||||||
// 预留展品图片路径:请在 images 中放置对应资源
|
|
||||||
1: "huangyanpei/reflection/scene2/10_002",
|
|
||||||
};
|
|
||||||
|
|
||||||
const HuangyanpeiReflectionScene2 = () => {
|
const HuangyanpeiReflectionScene2 = () => {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const { moduleName } = useParams<{
|
const { moduleName } = useParams<{
|
||||||
moduleName: string;
|
moduleName: string;
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
const [activeExhibitId, setActiveExhibitId] = useState<1 | null>(null);
|
const [showDialog1, setShowDialog1] = useState(false);
|
||||||
|
const [showDialog2, setShowDialog2] = useState(false);
|
||||||
const [visited, setVisited] = useState<Set<number>>(new Set());
|
const [visited, setVisited] = useState<Set<number>>(new Set());
|
||||||
|
const [choice1, setChoice1] = useState<
|
||||||
|
"读书" | "没出息" | "女子不能上学" | null
|
||||||
|
>(null);
|
||||||
|
const [choice2, setChoice2] = useState<"铁工科" | "商科" | null>(null);
|
||||||
|
|
||||||
if (!moduleName) {
|
if (!moduleName) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const progressCount = visited.size;
|
const progressCount = visited.size;
|
||||||
const total = 1;
|
const total = 2;
|
||||||
const completed = progressCount >= total;
|
const completed = progressCount >= total;
|
||||||
const subtitle = completed
|
const subtitle = completed
|
||||||
? "探索浦东中学·成长之阶(已完成)"
|
? "探索浦东中学·成长之阶(已完成)"
|
||||||
@@ -58,36 +60,68 @@ const HuangyanpeiReflectionScene2 = () => {
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{/* 互动展品光标:后续可替换为拖拽/选择类互动 */}
|
{choice2 && (
|
||||||
|
<img
|
||||||
|
className="absolute right-[234px] bottom-12.5"
|
||||||
|
src={getStaticImage("huangyanpei/reflection/scene2/10_003")}
|
||||||
|
alt="已解锁指示牌盖板"
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* 互动展品光标1:显示第一个选择弹窗 */}
|
||||||
<Cursor
|
<Cursor
|
||||||
className="absolute left-80 top-96"
|
className="absolute left-118 bottom-105"
|
||||||
onClick={() => setActiveExhibitId(1)}
|
onClick={() => setShowDialog1(true)}
|
||||||
read={visited.has(1)}
|
read={choice1 !== null}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{/* 展品遮罩:当前使用单张图片,占位为后续互动内容 */}
|
{/* 互动展品光标2:显示第二个选择弹窗 */}
|
||||||
<ExhibitOverlay
|
<Cursor
|
||||||
visible={activeExhibitId !== null}
|
className="absolute right-74 bottom-68"
|
||||||
src={activeExhibitId ? exhibitSrcMap[activeExhibitId] : ""}
|
onClick={() => setShowDialog2(true)}
|
||||||
onClose={() => {
|
read={choice2 !== null}
|
||||||
if (activeExhibitId !== null) {
|
/>
|
||||||
|
|
||||||
|
{/* 第一个选择弹窗 */}
|
||||||
|
<ChoiceDialog1
|
||||||
|
visible={showDialog1}
|
||||||
|
onClose={() => setShowDialog1(false)}
|
||||||
|
onSelect={(choice) => {
|
||||||
|
setChoice1(choice);
|
||||||
setVisited((prev) => {
|
setVisited((prev) => {
|
||||||
const next = new Set(prev);
|
const next = new Set(prev);
|
||||||
next.add(activeExhibitId);
|
next.add(1);
|
||||||
return next;
|
return next;
|
||||||
});
|
});
|
||||||
}
|
|
||||||
setActiveExhibitId(null);
|
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{completed && (
|
{/* 第二个选择弹窗 */}
|
||||||
|
<ChoiceDialog2
|
||||||
|
visible={showDialog2}
|
||||||
|
onClose={() => setShowDialog2(false)}
|
||||||
|
onSelect={(choice) => {
|
||||||
|
setChoice2(choice);
|
||||||
|
setVisited((prev) => {
|
||||||
|
const next = new Set(prev);
|
||||||
|
next.add(2);
|
||||||
|
return next;
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{completed && choice2 && (
|
||||||
<Image
|
<Image
|
||||||
className="absolute bottom-0 right-4"
|
className="absolute bottom-0 right-4"
|
||||||
src={getStaticImage("components/place/继续前进")}
|
src={getStaticImage("components/place/继续前进")}
|
||||||
button
|
button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
// 根据选择决定导航目标
|
||||||
|
if (choice2 === "铁工科") {
|
||||||
navigate(`/${moduleName}/${starName}/reflection3`);
|
navigate(`/${moduleName}/${starName}/reflection3`);
|
||||||
|
} else if (choice2 === "商科") {
|
||||||
|
navigate(`/${moduleName}/${starName}/reflection4`);
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -0,0 +1,201 @@
|
|||||||
|
import { useState, useEffect, useMemo, useCallback } from "react";
|
||||||
|
import { createPortal } from "react-dom";
|
||||||
|
import { AnimatePresence, motion } from "framer-motion";
|
||||||
|
import { cn, getStaticImage } from "@/lib/utils";
|
||||||
|
import { Image } from "@/components";
|
||||||
|
import { useScale } from "@/contexts/ScaleContext";
|
||||||
|
|
||||||
|
export interface ChoiceDialog1Props {
|
||||||
|
/** 是否可见 */
|
||||||
|
visible?: boolean;
|
||||||
|
/** 关闭回调 */
|
||||||
|
onClose?: () => void;
|
||||||
|
/** 选择回调 */
|
||||||
|
onSelect?: (choice: "读书" | "没出息" | "女子不能上学") => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 第一个选择弹窗:人物和三个选择
|
||||||
|
* - 使用蒙版遮罩作为背景
|
||||||
|
* - 显示人物10_004和三个选择选项
|
||||||
|
*/
|
||||||
|
const ChoiceDialog1 = ({
|
||||||
|
visible = true,
|
||||||
|
onClose,
|
||||||
|
onSelect,
|
||||||
|
}: ChoiceDialog1Props) => {
|
||||||
|
const maskSrc = getStaticImage("components/蒙版遮罩");
|
||||||
|
const backSrc = getStaticImage("components/关闭");
|
||||||
|
const characterSrc = getStaticImage("huangyanpei/reflection/scene2/10_004");
|
||||||
|
const choice1Src = getStaticImage("huangyanpei/reflection/scene2/10_005");
|
||||||
|
const choice2Src = getStaticImage("huangyanpei/reflection/scene2/10_006");
|
||||||
|
const choice3Src = getStaticImage("huangyanpei/reflection/scene2/10_007");
|
||||||
|
|
||||||
|
const { scale, offsetX, offsetY, DESIGN_WIDTH, DESIGN_HEIGHT } = useScale();
|
||||||
|
const [mounted, setMounted] = useState(false);
|
||||||
|
|
||||||
|
// SSR 兼容
|
||||||
|
useEffect(() => {
|
||||||
|
setMounted(true);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const handleClose = useCallback(
|
||||||
|
(e: React.MouseEvent<HTMLImageElement>) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
onClose?.();
|
||||||
|
},
|
||||||
|
[onClose]
|
||||||
|
);
|
||||||
|
|
||||||
|
const handleChoiceClick = useCallback(
|
||||||
|
(choice: "读书" | "没出息" | "女子不能上学") => {
|
||||||
|
onSelect?.(choice);
|
||||||
|
onClose?.();
|
||||||
|
},
|
||||||
|
[onSelect, onClose]
|
||||||
|
);
|
||||||
|
|
||||||
|
// 样式
|
||||||
|
const overlayStyle = useMemo<React.CSSProperties>(
|
||||||
|
() => ({
|
||||||
|
position: "fixed",
|
||||||
|
inset: 0,
|
||||||
|
zIndex: 9999,
|
||||||
|
pointerEvents: "none",
|
||||||
|
}),
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
|
||||||
|
const scaledContainerStyle = useMemo<React.CSSProperties>(
|
||||||
|
() => ({
|
||||||
|
position: "absolute",
|
||||||
|
width: `${DESIGN_WIDTH}px`,
|
||||||
|
height: `${DESIGN_HEIGHT}px`,
|
||||||
|
left: `${offsetX}px`,
|
||||||
|
top: `${offsetY}px`,
|
||||||
|
transform: `scale(${scale})`,
|
||||||
|
transformOrigin: "top left",
|
||||||
|
overflow: "hidden",
|
||||||
|
}),
|
||||||
|
[scale, offsetX, offsetY, DESIGN_WIDTH, DESIGN_HEIGHT]
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!mounted) return null;
|
||||||
|
|
||||||
|
const content = (
|
||||||
|
<AnimatePresence>
|
||||||
|
{visible && (
|
||||||
|
<motion.div
|
||||||
|
key="choice-dialog-1"
|
||||||
|
style={overlayStyle}
|
||||||
|
initial={{ opacity: 0 }}
|
||||||
|
animate={{ opacity: 1 }}
|
||||||
|
exit={{ opacity: 0 }}
|
||||||
|
transition={{ duration: 0.3, ease: "easeInOut" }}
|
||||||
|
>
|
||||||
|
<div style={scaledContainerStyle}>
|
||||||
|
<div
|
||||||
|
className={cn(
|
||||||
|
"absolute inset-0 flex flex-col items-center justify-center",
|
||||||
|
"bg-black/70"
|
||||||
|
)}
|
||||||
|
style={{ pointerEvents: "auto" }}
|
||||||
|
>
|
||||||
|
{/* 背景蒙版 */}
|
||||||
|
{maskSrc && (
|
||||||
|
<Image
|
||||||
|
src={maskSrc}
|
||||||
|
className="absolute inset-0 w-full h-full object-cover select-none pointer-events-none"
|
||||||
|
aria-hidden
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* 返回按钮 */}
|
||||||
|
{onClose && (
|
||||||
|
<Image
|
||||||
|
src={backSrc}
|
||||||
|
onClick={handleClose}
|
||||||
|
alt="返回"
|
||||||
|
className="absolute top-5 right-5 z-20"
|
||||||
|
button
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* 内容区域 */}
|
||||||
|
<div className="relative z-10 w-full h-full flex items-center justify-between px-20">
|
||||||
|
{/* 人物 - 左侧 */}
|
||||||
|
<div className="flex-shrink-0">
|
||||||
|
<img src={characterSrc} alt="人物" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 三个选择选项 - 右侧水平排列 */}
|
||||||
|
<div className="flex items-center justify-center gap-16 flex-1">
|
||||||
|
{/* 选择A:读书 */}
|
||||||
|
<div
|
||||||
|
className="flex flex-col items-center cursor-pointer transition-transform duration-200 hover:scale-105 active:scale-95"
|
||||||
|
onClick={() => handleChoiceClick("读书")}
|
||||||
|
>
|
||||||
|
{/* 标签A */}
|
||||||
|
<div className="text-7xl font-bold text-[#ffa500] mb-3 [text-shadow:_3px_3px_0_#fff,_-3px_-3px_0_#fff,_3px_-3px_0_#fff,_-3px_3px_0_#fff]">
|
||||||
|
A
|
||||||
|
</div>
|
||||||
|
{/* 图标 */}
|
||||||
|
<img src={choice1Src} alt="读书" className="mb-3" />
|
||||||
|
{/* 文字说明 */}
|
||||||
|
<div className="text-black text-4xl text-center leading-relaxed font-bold">
|
||||||
|
读书只为
|
||||||
|
<br />
|
||||||
|
升官发财
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 选择B:没出息 */}
|
||||||
|
<div
|
||||||
|
className="flex flex-col items-center cursor-pointer transition-transform duration-200 hover:scale-105 active:scale-95"
|
||||||
|
onClick={() => handleChoiceClick("没出息")}
|
||||||
|
>
|
||||||
|
{/* 标签B */}
|
||||||
|
<div className="text-7xl font-bold text-[#ffa500] mb-3 [text-shadow:_3px_3px_0_#fff,_-3px_-3px_0_#fff,_3px_-3px_0_#fff,_-3px_3px_0_#fff]">
|
||||||
|
B
|
||||||
|
</div>
|
||||||
|
{/* 图标 */}
|
||||||
|
<img src={choice2Src} alt="没出息" className="mb-3" />
|
||||||
|
{/* 文字说明 */}
|
||||||
|
<div className="text-black text-4xl text-center leading-relaxed font-bold">
|
||||||
|
手工劳作
|
||||||
|
<br />
|
||||||
|
没出息
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 选择C:女子不能上学 */}
|
||||||
|
<div
|
||||||
|
className="flex flex-col items-center cursor-pointer transition-transform duration-200 hover:scale-105 active:scale-95"
|
||||||
|
onClick={() => handleChoiceClick("女子不能上学")}
|
||||||
|
>
|
||||||
|
{/* 标签C */}
|
||||||
|
<div className="text-7xl font-bold text-[#ffa500] mb-3 [text-shadow:_3px_3px_0_#fff,_-3px_-3px_0_#fff,_3px_-3px_0_#fff,_-3px_3px_0_#fff]">
|
||||||
|
C
|
||||||
|
</div>
|
||||||
|
{/* 图标 */}
|
||||||
|
<img src={choice3Src} alt="女子不能上学" className="mb-3" />
|
||||||
|
{/* 文字说明 */}
|
||||||
|
<div className="text-black text-4xl text-center leading-relaxed font-bold">
|
||||||
|
女子
|
||||||
|
<br />
|
||||||
|
不能上学
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</motion.div>
|
||||||
|
)}
|
||||||
|
</AnimatePresence>
|
||||||
|
);
|
||||||
|
|
||||||
|
return createPortal(content, document.body);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ChoiceDialog1;
|
||||||
@@ -0,0 +1,191 @@
|
|||||||
|
import { useState, useEffect, useMemo, useCallback } from "react";
|
||||||
|
import { createPortal } from "react-dom";
|
||||||
|
import { AnimatePresence, motion } from "framer-motion";
|
||||||
|
import { cn, getStaticImage } from "@/lib/utils";
|
||||||
|
import { Image } from "@/components";
|
||||||
|
import { useScale } from "@/contexts/ScaleContext";
|
||||||
|
|
||||||
|
export interface ChoiceDialog2Props {
|
||||||
|
/** 是否可见 */
|
||||||
|
visible?: boolean;
|
||||||
|
/** 关闭回调 */
|
||||||
|
onClose?: () => void;
|
||||||
|
/** 选择回调 */
|
||||||
|
onSelect?: (choice: "铁工科" | "商科") => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 第二个选择弹窗:背景图选择
|
||||||
|
* - 使用蒙版遮罩作为背景
|
||||||
|
* - 显示两个选择:10_008(箭头指向右边)和旋转后的背景图
|
||||||
|
*/
|
||||||
|
const ChoiceDialog2 = ({
|
||||||
|
visible = true,
|
||||||
|
onClose,
|
||||||
|
onSelect,
|
||||||
|
}: ChoiceDialog2Props) => {
|
||||||
|
const maskSrc = getStaticImage("components/蒙版遮罩");
|
||||||
|
const backSrc = getStaticImage("components/关闭");
|
||||||
|
const choiceSrc = getStaticImage("huangyanpei/reflection/scene2/10_008");
|
||||||
|
|
||||||
|
const { scale, offsetX, offsetY, DESIGN_WIDTH, DESIGN_HEIGHT } = useScale();
|
||||||
|
const [mounted, setMounted] = useState(false);
|
||||||
|
|
||||||
|
// SSR 兼容
|
||||||
|
useEffect(() => {
|
||||||
|
setMounted(true);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const handleClose = useCallback(
|
||||||
|
(e: React.MouseEvent<HTMLImageElement>) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
onClose?.();
|
||||||
|
},
|
||||||
|
[onClose]
|
||||||
|
);
|
||||||
|
|
||||||
|
const handleChoiceClick = useCallback(
|
||||||
|
(choice: "铁工科" | "商科") => {
|
||||||
|
onSelect?.(choice);
|
||||||
|
onClose?.();
|
||||||
|
},
|
||||||
|
[onSelect, onClose]
|
||||||
|
);
|
||||||
|
|
||||||
|
// 样式
|
||||||
|
const overlayStyle = useMemo<React.CSSProperties>(
|
||||||
|
() => ({
|
||||||
|
position: "fixed",
|
||||||
|
inset: 0,
|
||||||
|
zIndex: 9999,
|
||||||
|
pointerEvents: "none",
|
||||||
|
}),
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
|
||||||
|
const scaledContainerStyle = useMemo<React.CSSProperties>(
|
||||||
|
() => ({
|
||||||
|
position: "absolute",
|
||||||
|
width: `${DESIGN_WIDTH}px`,
|
||||||
|
height: `${DESIGN_HEIGHT}px`,
|
||||||
|
left: `${offsetX}px`,
|
||||||
|
top: `${offsetY}px`,
|
||||||
|
transform: `scale(${scale})`,
|
||||||
|
transformOrigin: "top left",
|
||||||
|
overflow: "hidden",
|
||||||
|
}),
|
||||||
|
[scale, offsetX, offsetY, DESIGN_WIDTH, DESIGN_HEIGHT]
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!mounted) return null;
|
||||||
|
|
||||||
|
const content = (
|
||||||
|
<AnimatePresence>
|
||||||
|
{visible && (
|
||||||
|
<motion.div
|
||||||
|
key="choice-dialog-2"
|
||||||
|
style={overlayStyle}
|
||||||
|
initial={{ opacity: 0 }}
|
||||||
|
animate={{ opacity: 1 }}
|
||||||
|
exit={{ opacity: 0 }}
|
||||||
|
transition={{ duration: 0.3, ease: "easeInOut" }}
|
||||||
|
>
|
||||||
|
<div style={scaledContainerStyle}>
|
||||||
|
<div
|
||||||
|
className={cn(
|
||||||
|
"absolute inset-0 flex flex-col items-center justify-center",
|
||||||
|
"bg-black/70"
|
||||||
|
)}
|
||||||
|
style={{ pointerEvents: "auto" }}
|
||||||
|
>
|
||||||
|
{/* 背景蒙版 */}
|
||||||
|
{maskSrc && (
|
||||||
|
<Image
|
||||||
|
src={maskSrc}
|
||||||
|
className="absolute inset-0 w-full h-full object-cover select-none pointer-events-none"
|
||||||
|
aria-hidden
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* 返回按钮 */}
|
||||||
|
{onClose && (
|
||||||
|
<Image
|
||||||
|
src={backSrc}
|
||||||
|
onClick={handleClose}
|
||||||
|
alt="返回"
|
||||||
|
className="absolute top-5 right-5 z-20"
|
||||||
|
button
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{/* 内容区域 */}
|
||||||
|
<div className="relative z-10 w-full h-full flex items-center justify-center">
|
||||||
|
<div className="flex flex-col items-center gap-12">
|
||||||
|
{/* 选择A:铁工科(箭头指向左边) */}
|
||||||
|
<div
|
||||||
|
className="flex items-center gap-6 cursor-pointer transition-transform duration-200 hover:scale-105 active:scale-95"
|
||||||
|
onClick={() => handleChoiceClick("铁工科")}
|
||||||
|
>
|
||||||
|
{/* 标签A */}
|
||||||
|
<div className="text-7xl font-bold text-[#ffa500] [text-shadow:_3px_3px_0_#fff,_-3px_-3px_0_#fff,_3px_-3px_0_#fff,_-3px_3px_0_#fff]">
|
||||||
|
A
|
||||||
|
</div>
|
||||||
|
{/* 箭头按钮 - 需要旋转180度使其指向左边 */}
|
||||||
|
<div
|
||||||
|
className="relative"
|
||||||
|
style={{ transform: "rotate(180deg)" }}
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
src={choiceSrc}
|
||||||
|
alt="铁工科"
|
||||||
|
className="max-w-[800px] object-contain"
|
||||||
|
/>
|
||||||
|
{/* 文字覆盖层 */}
|
||||||
|
<div className="absolute inset-0 flex items-center justify-center">
|
||||||
|
<div
|
||||||
|
className="text-white text-7xl font-bold"
|
||||||
|
style={{ transform: "rotate(180deg)" }}
|
||||||
|
>
|
||||||
|
铁工科
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 选择B:商科(箭头指向右边) */}
|
||||||
|
<div
|
||||||
|
className="flex items-center gap-6 cursor-pointer transition-transform duration-200 hover:scale-105 active:scale-95"
|
||||||
|
onClick={() => handleChoiceClick("商科")}
|
||||||
|
>
|
||||||
|
{/* 标签B */}
|
||||||
|
<div className="text-7xl font-bold text-[#ffa500] [text-shadow:_3px_3px_0_#fff,_-3px_-3px_0_#fff,_3px_-3px_0_#fff,_-3px_3px_0_#fff]">
|
||||||
|
B
|
||||||
|
</div>
|
||||||
|
{/* 箭头按钮 */}
|
||||||
|
<div className="relative">
|
||||||
|
<img
|
||||||
|
src={choiceSrc}
|
||||||
|
alt="商科"
|
||||||
|
className="max-w-[800px] object-contain"
|
||||||
|
/>
|
||||||
|
{/* 文字覆盖层 */}
|
||||||
|
<div className="absolute inset-0 flex items-center justify-center">
|
||||||
|
<div className="text-white text-7xl font-bold">
|
||||||
|
商科
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</motion.div>
|
||||||
|
)}
|
||||||
|
</AnimatePresence>
|
||||||
|
);
|
||||||
|
|
||||||
|
return createPortal(content, document.body);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ChoiceDialog2;
|
||||||
@@ -38,7 +38,7 @@ const HuangyanpeiReflectionScene3 = () => {
|
|||||||
className="w-full h-full bg-cover bg-center bg-no-repeat"
|
className="w-full h-full bg-cover bg-center bg-no-repeat"
|
||||||
style={{
|
style={{
|
||||||
backgroundImage: getBackgroundImage(
|
backgroundImage: getBackgroundImage(
|
||||||
`huangyanpei/reflection/scene3_001`
|
`huangyanpei/reflection/scene3/11_001`
|
||||||
),
|
),
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ const HuangyanpeiReflectionScene4 = () => {
|
|||||||
className="w-full h-full bg-cover bg-center bg-no-repeat"
|
className="w-full h-full bg-cover bg-center bg-no-repeat"
|
||||||
style={{
|
style={{
|
||||||
backgroundImage: getBackgroundImage(
|
backgroundImage: getBackgroundImage(
|
||||||
`huangyanpei/reflection/scene4_001`
|
`huangyanpei/reflection/scene4/12_001`
|
||||||
),
|
),
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
|||||||
Reference in new issue
Block a user