import { useState, useEffect, useRef } from "react"; // ── Data ───────────────────────────────────────────────────────────────────── const SLIDES = [ { id: 0, type: "cover", title: "الماء", sub: "أصغر جزيئة تحمل سر الحياة", grade: "كيمياء | الثاني متوسط", accent: "#38bdf8", }, { id: 1, type: "wonder", q: "لو لم يطفُ الجليد...", body: "كانت البحيرات ستتجمّد من القاع إلى السطح، وتنقرض كل الأسماك، ويختل المناخ كله.", punchline: "خاصية واحدة في الماء أنقذت الحياة على الأرض.", accent: "#818cf8", }, { id: 2, type: "molecule", title: "تركيب H₂O", facts: [ { label: "ذرات هيدروجين", val: "٢", color: "#38bdf8" }, { label: "ذرة أكسجين", val: "١", color: "#f87171" }, { label: "زاوية الرابطة", val: "104.5°", color: "#a78bfa" }, ], note: "الزاوية غير المنتظمة هي سبب كل خصائص الماء العجيبة", accent: "#38bdf8", }, { id: 3, type: "polarity", title: "الجزيئة القطبية", body: "الأكسجين يشدّ الإلكترونات نحوه أكثر من الهيدروجين، فتنشأ شحنة سالبة عند الأكسجين وموجبة عند الهيدروجين.", effect: "هذا يجعل الماء مذيباً خارقاً — يُذيب السكر والملح والأحماض والقواعد.", accent: "#f59e0b", }, { id: 4, type: "states", title: "الحالات الثلاث", states: [ { name: "صلب — جليد", temp: "< 0°م", desc: "ذرات مرتّبة في شبكة بلّورية، كثافته أقل من السائل", icon: "🧊", color: "#7dd3fc" }, { name: "سائل — ماء", temp: "0° — 100°م", desc: "ذرات تتحرك بحرية، يأخذ شكل إنائه", icon: "💧", color: "#38bdf8" }, { name: "غازي — بخار", temp: "> 100°م", desc: "ذرات تتفرق وتملأ الفراغ، لا شكل ثابت", icon: "🌫️", color: "#94a3b8" }, ], accent: "#0ea5e9", }, { id: 5, type: "cycle", title: "دورة الماء في الطبيعة", steps: [ { icon: "☀️", label: "تبخّر", desc: "الشمس تسخّن الماء فيتحول لبخار" }, { icon: "☁️", label: "تكاثف", desc: "البخار يبرد ويتحول لقطرات في السحاب" }, { icon: "🌧️", label: "تساقط", desc: "المطر والثلج يعودان للأرض" }, { icon: "🏔️", label: "جريان", desc: "الماء يجري في الأنهار ويتسرب للأرض" }, ], accent: "#34d399", }, { id: 6, type: "properties", title: "خصائص لا مثيل لها", props: [ { icon: "🧊", title: "الجليد أخف من الماء", body: "الشبكة البلّورية للجليد أكثر تباعداً، لذا كثافته أقل ويطفو" }, { icon: "🫧", title: "توتر سطحي عالٍ", body: "جزيئات الماء تتجاذب مع بعضها فتكوّن سطحاً كالغشاء — لذا البعوض يمشي فوقه!" }, { icon: "🌡️", title: "سعة حرارية عالية", body: "يحتاج وقتاً طويلاً ليسخن ويبرد، لذا البحار تلطّف المناخ" }, { icon: "⚡", title: "الماء النقي عازل", body: "الكهرباء تنتقل عبر الأملاح المذابة لا الماء نفسه" }, ], accent: "#f97316", }, { id: 7, type: "quiz", title: "تحدّ سريع!", qs: [ { q: "لماذا الجليد يطفو فوق الماء؟", opts: ["لأنه بارد", "كثافته أقل من الماء السائل", "لأنه صلب", "لأن الماء ثقيل"], ans: 1 }, { q: "ما زاوية الرابطة في جزيئة الماء؟", opts: ["90°", "180°", "104.5°", "120°"], ans: 2 }, { q: "الماء النقي موصل للكهرباء؟", opts: ["نعم دائماً", "لا، هو عازل", "أحياناً", "فقط عند 0°م"], ans: 1 }, ], accent: "#a855f7", }, { id: 8, type: "summary", title: "خلاصة", points: [ "H₂O: ذرتا هيدروجين + ذرة أكسجين بزاوية 104.5°", "القطبية تجعله مذيباً خارقاً", "ثلاث حالات: صلبة، سائلة، غازية", "الجليد يطفو لأن كثافته أقل من الماء السائل", "سعته الحرارية العالية تُنظّم مناخ الأرض", ], accent: "#38bdf8", }, ]; // ── Animated Molecule ───────────────────────────────────────────────────────── function WaterMolecule({ size = 200 }) { const [angle, setAngle] = useState(0); useEffect(() => { let raf; const tick = () => { setAngle(a => a + 0.4); raf = requestAnimationFrame(tick); }; raf = requestAnimationFrame(tick); return () => cancelAnimationFrame(raf); }, []); const cx = size / 2, cy = size / 2; const r = size * 0.22; const bondLen = size * 0.28; const rad = (104.5 / 2) * (Math.PI / 180); const h1x = cx + bondLen * Math.cos(Math.PI / 2 + rad); const h1y = cy - bondLen * Math.sin(Math.PI / 2 + rad); const h2x = cx + bondLen * Math.cos(Math.PI / 2 - rad); const h2y = cy - bondLen * Math.sin(Math.PI / 2 - rad); const pulse = 1 + 0.03 * Math.sin(angle * 0.05); return ( {/* bonds */} {/* O */} O {/* H1 */} H {/* H2 */} H {/* angle arc */} ); } // ── Wave background ─────────────────────────────────────────────────────────── function Waves({ color }) { const [t, setT] = useState(0); useEffect(() => { let raf; const tick = () => { setT(p => p + 0.015); raf = requestAnimationFrame(tick); }; raf = requestAnimationFrame(tick); return () => cancelAnimationFrame(raf); }, []); const W = 400, H = 80; const wave = (offset, amp) => { let d = `M0,${H}`; for (let x = 0; x <= W; x += 8) { const y = H / 2 + amp * Math.sin((x / W) * 4 * Math.PI + t + offset); d += ` L${x},${y}`; } return d + ` L${W},${H} Z`; }; return ( ); } // ── Main Component ──────────────────────────────────────────────────────────── export default function WaterLesson() { const [cur, setCur] = useState(0); const [visible, setVisible] = useState(true); const [quizState, setQuizState] = useState({ idx: 0, selected: null, score: 0, done: false }); const slide = SLIDES[cur]; const go = (dir) => { const next = cur + dir; if (next < 0 || next >= SLIDES.length) return; setVisible(false); setTimeout(() => { setCur(next); setVisible(true); setQuizState({ idx: 0, selected: null, score: 0, done: false }); }, 220); }; const pickAnswer = (i) => { if (quizState.selected !== null) return; const correct = i === SLIDES[cur].qs[quizState.idx].ans; const newScore = quizState.score + (correct ? 1 : 0); setQuizState(s => ({ ...s, selected: i, score: newScore })); setTimeout(() => { const nextIdx = quizState.idx + 1; if (nextIdx >= SLIDES[cur].qs.length) { setQuizState(s => ({ ...s, done: true, score: newScore })); } else { setQuizState(s => ({ ...s, idx: nextIdx, selected: null })); } }, 900); }; return (
{/* Progress bar */}
{/* Top bar */}
{cur + 1} / {SLIDES.length} كيمياء | ثاني متوسط
{/* Slide */}
{/* COVER */} {slide.type === "cover" && (
{slide.grade}

{slide.title}

{slide.sub}

{["تركيب H₂O", "الحالات الثلاث", "القطبية", "دورة الماء", "الخصائص"].map(t => ( {t} ))}
)} {/* WONDER */} {slide.type === "wonder" && (
🤔

{slide.q}

{slide.body}

💡 {slide.punchline}
)} {/* MOLECULE */} {slide.type === "molecule" && (

{slide.title}

{slide.facts.map((f, i) => (
{f.val}
{f.label}
))}

{slide.note}

)} {/* POLARITY */} {slide.type === "polarity" && (
🔋

{slide.title}

{/* polarity diagram */}
H
δ⁺
O
δ⁻
H
δ⁺

{slide.body}

✨ {slide.effect}
)} {/* STATES */} {slide.type === "states" && (

{slide.title}

{slide.states.map((s, i) => (
{s.icon}
{s.name}
{s.temp}
{s.desc}
))}
)} {/* CYCLE */} {slide.type === "cycle" && (

{slide.title}

{slide.steps.map((s, i) => (
{s.icon}
{i < slide.steps.length - 1 &&
}
{s.label}
{s.desc}
))}
)} {/* PROPERTIES */} {slide.type === "properties" && (

{slide.title}

{slide.props.map((p, i) => (
{p.icon}
{p.title}
{p.body}
))}
)} {/* QUIZ */} {slide.type === "quiz" && (
🏆

{slide.title}

{!quizState.done ? ( <>
سؤال {quizState.idx + 1} من {slide.qs.length}

{slide.qs[quizState.idx].q}

{slide.qs[quizState.idx].opts.map((opt, i) => { const isAns = i === slide.qs[quizState.idx].ans; const isPicked = quizState.selected === i; let bg = "#0f172a", border = "#1e293b", color = "#94a3b8"; if (quizState.selected !== null) { if (isAns) { bg = "#052e16"; border = "#16a34a"; color = "#4ade80"; } else if (isPicked) { bg = "#1c0a0a"; border = "#dc2626"; color = "#f87171"; } } return ( ); })}
) : (
{quizState.score === slide.qs.length ? "🥇" : quizState.score >= 2 ? "🥈" : "💪"}
{quizState.score} / {slide.qs.length}
{quizState.score === slide.qs.length ? "ممتاز! إجابات كلها صح 🎉" : quizState.score >= 2 ? "جيد جداً، قريب من المثالية!" : "راجع الدرس وحاول مرة ثانية!"}
)}
)} {/* SUMMARY */} {slide.type === "summary" && (
📚

{slide.title}

{slide.points.map((p, i) => (
{i + 1}
{p}
))}
💧 الماء = الحياة
)}
{/* Wave decoration */} {/* Navigation */}
{SLIDES.map((_, i) => (
); }