/* ===== SCHEDULE — Bastion-styled grid ===== */ function SchedulePage({ navigate, openSignup }) { const [hovered, setHovered] = useState(null); const days = ["MON", "TUE", "WED", "THU", "FRI"]; const dayCh = ["星期一", "星期二", "星期三", "星期四", "星期五"]; const slots = ["7:00–8:20", "8:40–10:00", "17:20–18:40", "19:00–20:20", "20:40–22:00"]; const grid = [ ["base", "roll1", "ftp", "vo2", null], ["vo2", "roll2", "base", "ftp", null], ["vo2", "roll1", "base", "ftp", "vo2"], ["base", "heat", "vo2", "open", "ftp"], ["roll2", "open", "ftp", "base", "base"], ]; const COURSES = { base: { name: "ENDURANCE", ch: "基礎有氧", desc: "Zone 2 穩定騎乘,建立有氧基礎與脂肪代謝。" }, vo2: { name: "VO2 MAX", ch: "無氧間歇", desc: "Zone 5–6 HIIT,提升最大攝氧量與爆發力。" }, ftp: { name: "THRESHOLD", ch: "閾值訓練", desc: "88–94% FTP 甜蜜點訓練,提升乳酸閾。" }, roll1: { name: "ROLLER 01", ch: "初階滾筒", desc: "踩踏平順度、車感與核心平衡入門。" }, roll2: { name: "ROLLER 02", ch: "中階滾筒", desc: "放手騎乘、單腳踩踏、神經反應訓練。" }, heat: { name: "HEAT-ADAPT", ch: "熱適應", desc: "CORE 感測,熱壓力下優化排汗。" }, open: { name: "PRIVATE", ch: "包班預約", desc: "整個時段開放團體包班預約。" }, }; return ( <>
{/* Header */}
TIME / DAY
{days.map((d, i) => (
{d}
{dayCh[i]}
))}
{/* Rows */} {slots.map((slot, sIdx) => (
{slot.split("–")[0]} {slot.split("–")[1]}
{grid[sIdx].map((courseKey, dIdx) => { const course = courseKey ? COURSES[courseKey] : null; const isHovered = hovered && hovered.s === sIdx && hovered.d === dIdx; return (
course && setHovered({ s: sIdx, d: dIdx })} onMouseLeave={() => setHovered(null)} onClick={() => course && courseKey !== "open" && openSignup()}> {course ? ( <>
{course.name}
{course.ch}
{isHovered &&
{course.desc}
} ) : (
休館
)}
); })}
))}
{/* Notes */}
// NOTES
功率課程 4 人開班 / 上限 10 人  ·  滾筒課程 2 人開班 / 上限 4 人  ·  熱適應 2 人開班 / 上限 3 人
上課以預約學員優先  ·  團體包班、自主練習請私訊粉專  ·  亦提供場租方案
); } const schedStyles = { headCell: { padding: "20px 16px", borderRight: "1px solid var(--hairline-soft)", borderBottom: "1px solid var(--hairline)", display: "flex", flexDirection: "column", gap: 4 }, timeCell: { padding: "20px 16px", borderRight: "1px solid var(--hairline-soft)", display: "flex", flexDirection: "column", justifyContent: "center" }, cell: { padding: "20px 16px", minHeight: 110, transition: "background 0.2s, color 0.2s", position: "relative" }, }; window.SchedulePage = SchedulePage;