feat(lessons): add lessons from client db
This commit is contained in:
871
src/pages/student/lessons/AreaVolumeLesson.tsx
Normal file
871
src/pages/student/lessons/AreaVolumeLesson.tsx
Normal file
@ -0,0 +1,871 @@
|
||||
import React, { useState } from "react";
|
||||
import {
|
||||
Square,
|
||||
Circle,
|
||||
Box,
|
||||
Layers,
|
||||
Ruler,
|
||||
BookOpen,
|
||||
ChevronDown,
|
||||
} from "lucide-react";
|
||||
import LessonShell, {
|
||||
ConceptCard,
|
||||
FormulaBox,
|
||||
ExampleCard,
|
||||
TipCard,
|
||||
PracticeFromDataset,
|
||||
} from "../../../components/lessons/LessonShell";
|
||||
import { Frac } from "../../../components/Math";
|
||||
import CompositeAreaWidget from "../../../components/lessons/CompositeAreaWidget";
|
||||
import InteractiveSectorWidget from "../../../components/lessons/InteractiveSectorWidget";
|
||||
import CompositeSolidsWidget from "../../../components/lessons/CompositeSolidsWidget";
|
||||
import ScaleFactorWidget from "../../../components/lessons/ScaleFactorWidget";
|
||||
import { AREA_VOL_EASY, AREA_VOL_MEDIUM } from "../../../data/math/area-volume";
|
||||
|
||||
/* ─── Clickable formula card with shape diagram + example ─── */
|
||||
function FormulaCard({
|
||||
formula,
|
||||
diagram,
|
||||
example,
|
||||
}: {
|
||||
formula: React.ReactNode;
|
||||
diagram: React.ReactNode;
|
||||
example: React.ReactNode;
|
||||
}) {
|
||||
const [open, setOpen] = useState(false);
|
||||
return (
|
||||
<button
|
||||
onClick={() => setOpen(!open)}
|
||||
className={`w-full text-left glass-formula rounded-xl border transition-all duration-300 overflow-hidden ${open ? "border-emerald-300 shadow-md" : "border-emerald-100 hover:border-emerald-200"}`}
|
||||
>
|
||||
<div className="flex items-center justify-between py-3 px-5">
|
||||
<span className="font-mono text-base font-bold text-slate-800">
|
||||
{formula}
|
||||
</span>
|
||||
<ChevronDown
|
||||
className={`w-4 h-4 text-emerald-400 shrink-0 transition-transform duration-300 ${open ? "rotate-180" : ""}`}
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
className={`transition-all duration-300 ease-in-out ${open ? "max-h-[400px] opacity-100" : "max-h-0 opacity-0"}`}
|
||||
>
|
||||
<div className="border-t border-emerald-100 px-5 py-4 flex flex-col sm:flex-row items-center gap-5 bg-gradient-to-br from-emerald-50/50 to-white/80">
|
||||
<div className="shrink-0">{diagram}</div>
|
||||
<div className="text-sm text-slate-600 space-y-1 font-mono">
|
||||
{example}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
||||
/* ─── Shape SVG diagrams ─── */
|
||||
const RectSvg = () => (
|
||||
<svg width="140" height="95" viewBox="-5 -5 130 90" overflow="visible">
|
||||
<rect
|
||||
x="10"
|
||||
y="10"
|
||||
width="100"
|
||||
height="60"
|
||||
fill="#d1fae5"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
rx="2"
|
||||
/>
|
||||
<text
|
||||
x="60"
|
||||
y="82"
|
||||
textAnchor="middle"
|
||||
className="text-[13px] font-bold fill-emerald-700"
|
||||
>
|
||||
l = 8
|
||||
</text>
|
||||
<text
|
||||
x="2"
|
||||
y="44"
|
||||
textAnchor="end"
|
||||
className="text-[13px] font-bold fill-emerald-700"
|
||||
transform="rotate(-90 2 44)"
|
||||
>
|
||||
w = 5
|
||||
</text>
|
||||
</svg>
|
||||
);
|
||||
const TriSvg = () => (
|
||||
<svg width="140" height="105" viewBox="-5 -5 130 105" overflow="visible">
|
||||
<polygon
|
||||
points="60,10 10,80 110,80"
|
||||
fill="#d1fae5"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<line
|
||||
x1="60"
|
||||
y1="10"
|
||||
x2="60"
|
||||
y2="80"
|
||||
stroke="#059669"
|
||||
strokeWidth="1.5"
|
||||
strokeDasharray="4"
|
||||
/>
|
||||
<text
|
||||
x="60"
|
||||
y="96"
|
||||
textAnchor="middle"
|
||||
className="text-[13px] font-bold fill-emerald-700"
|
||||
>
|
||||
b = 10
|
||||
</text>
|
||||
<text x="68" y="50" className="text-[13px] font-bold fill-emerald-600">
|
||||
h = 6
|
||||
</text>
|
||||
</svg>
|
||||
);
|
||||
const ParaSvg = () => (
|
||||
<svg width="150" height="95" viewBox="-5 -5 140 90" overflow="visible">
|
||||
<polygon
|
||||
points="30,10 120,10 100,70 10,70"
|
||||
fill="#d1fae5"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<line
|
||||
x1="30"
|
||||
y1="10"
|
||||
x2="30"
|
||||
y2="70"
|
||||
stroke="#059669"
|
||||
strokeWidth="1.5"
|
||||
strokeDasharray="4"
|
||||
/>
|
||||
<text
|
||||
x="60"
|
||||
y="84"
|
||||
textAnchor="middle"
|
||||
className="text-[13px] font-bold fill-emerald-700"
|
||||
>
|
||||
b = 9
|
||||
</text>
|
||||
<text x="20" y="44" className="text-[13px] font-bold fill-emerald-600">
|
||||
h = 4
|
||||
</text>
|
||||
</svg>
|
||||
);
|
||||
const TrapSvg = () => (
|
||||
<svg width="150" height="105" viewBox="-5 -5 140 105" overflow="visible">
|
||||
<polygon
|
||||
points="35,18 95,18 115,75 15,75"
|
||||
fill="#d1fae5"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<line
|
||||
x1="35"
|
||||
y1="18"
|
||||
x2="35"
|
||||
y2="75"
|
||||
stroke="#059669"
|
||||
strokeWidth="1.5"
|
||||
strokeDasharray="4"
|
||||
/>
|
||||
<text
|
||||
x="65"
|
||||
y="14"
|
||||
textAnchor="middle"
|
||||
className="text-[13px] font-bold fill-emerald-700"
|
||||
>
|
||||
b₁ = 6
|
||||
</text>
|
||||
<text
|
||||
x="65"
|
||||
y="92"
|
||||
textAnchor="middle"
|
||||
className="text-[13px] font-bold fill-emerald-700"
|
||||
>
|
||||
b₂ = 10
|
||||
</text>
|
||||
<text x="25" y="52" className="text-[13px] font-bold fill-emerald-600">
|
||||
h = 4
|
||||
</text>
|
||||
</svg>
|
||||
);
|
||||
const CircAreaSvg = () => (
|
||||
<svg width="120" height="110" viewBox="-5 -5 110 110" overflow="visible">
|
||||
<circle
|
||||
cx="50"
|
||||
cy="50"
|
||||
r="40"
|
||||
fill="#d1fae5"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<line x1="50" y1="50" x2="90" y2="50" stroke="#059669" strokeWidth="2" />
|
||||
<circle cx="50" cy="50" r="2.5" fill="#059669" />
|
||||
<text x="70" y="44" className="text-[13px] font-bold fill-emerald-700">
|
||||
r = 5
|
||||
</text>
|
||||
</svg>
|
||||
);
|
||||
const CircCircSvg = () => (
|
||||
<svg width="120" height="110" viewBox="-5 -5 110 110" overflow="visible">
|
||||
<circle
|
||||
cx="50"
|
||||
cy="50"
|
||||
r="40"
|
||||
fill="none"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<line x1="10" y1="50" x2="90" y2="50" stroke="#059669" strokeWidth="2" />
|
||||
<text
|
||||
x="50"
|
||||
y="44"
|
||||
textAnchor="middle"
|
||||
className="text-[13px] font-bold fill-emerald-700"
|
||||
>
|
||||
d = 10
|
||||
</text>
|
||||
</svg>
|
||||
);
|
||||
const PrismSASvg = () => (
|
||||
<svg width="140" height="115" viewBox="-5 -5 130 115" overflow="visible">
|
||||
<polygon
|
||||
points="20,40 70,40 70,90 20,90"
|
||||
fill="#d1fae5"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<polygon
|
||||
points="20,40 45,20 95,20 70,40"
|
||||
fill="#a7f3d0"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<polygon
|
||||
points="70,40 95,20 95,70 70,90"
|
||||
fill="#6ee7b7"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<text
|
||||
x="45"
|
||||
y="105"
|
||||
textAnchor="middle"
|
||||
className="text-[13px] font-bold fill-emerald-700"
|
||||
>
|
||||
l = 4
|
||||
</text>
|
||||
<text x="10" y="68" className="text-[13px] font-bold fill-emerald-600">
|
||||
h = 2
|
||||
</text>
|
||||
<text x="88" y="48" className="text-[13px] font-bold fill-emerald-700">
|
||||
w = 3
|
||||
</text>
|
||||
</svg>
|
||||
);
|
||||
const CylSASvg = () => (
|
||||
<svg width="120" height="120" viewBox="-5 -5 115 120" overflow="visible">
|
||||
<ellipse
|
||||
cx="50"
|
||||
cy="25"
|
||||
rx="35"
|
||||
ry="12"
|
||||
fill="#a7f3d0"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<rect x="15" y="25" width="70" height="60" fill="#d1fae5" />
|
||||
<line x1="15" y1="25" x2="15" y2="85" stroke="#059669" strokeWidth="2" />
|
||||
<line x1="85" y1="25" x2="85" y2="85" stroke="#059669" strokeWidth="2" />
|
||||
<ellipse
|
||||
cx="50"
|
||||
cy="85"
|
||||
rx="35"
|
||||
ry="12"
|
||||
fill="#d1fae5"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<line
|
||||
x1="50"
|
||||
y1="25"
|
||||
x2="85"
|
||||
y2="25"
|
||||
stroke="#059669"
|
||||
strokeWidth="1.5"
|
||||
strokeDasharray="3"
|
||||
/>
|
||||
<text x="67" y="19" className="text-[13px] font-bold fill-emerald-700">
|
||||
r = 3
|
||||
</text>
|
||||
<text x="92" y="58" className="text-[13px] font-bold fill-emerald-600">
|
||||
h = 5
|
||||
</text>
|
||||
</svg>
|
||||
);
|
||||
const SphereSvg = () => (
|
||||
<svg width="120" height="110" viewBox="-5 -5 110 110" overflow="visible">
|
||||
<circle
|
||||
cx="50"
|
||||
cy="50"
|
||||
r="40"
|
||||
fill="#d1fae5"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<ellipse
|
||||
cx="50"
|
||||
cy="50"
|
||||
rx="40"
|
||||
ry="14"
|
||||
fill="none"
|
||||
stroke="#059669"
|
||||
strokeWidth="1"
|
||||
strokeDasharray="4"
|
||||
/>
|
||||
<line x1="50" y1="50" x2="90" y2="50" stroke="#059669" strokeWidth="2" />
|
||||
<circle cx="50" cy="50" r="2.5" fill="#059669" />
|
||||
<text x="70" y="44" className="text-[13px] font-bold fill-emerald-700">
|
||||
r = 4
|
||||
</text>
|
||||
</svg>
|
||||
);
|
||||
const PrismVolSvg = () => (
|
||||
<svg width="140" height="115" viewBox="-5 -5 130 115" overflow="visible">
|
||||
<polygon
|
||||
points="20,40 70,40 70,90 20,90"
|
||||
fill="#d1fae5"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<polygon
|
||||
points="20,40 45,20 95,20 70,40"
|
||||
fill="#a7f3d0"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<polygon
|
||||
points="70,40 95,20 95,70 70,90"
|
||||
fill="#6ee7b7"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<text
|
||||
x="45"
|
||||
y="105"
|
||||
textAnchor="middle"
|
||||
className="text-[13px] font-bold fill-emerald-700"
|
||||
>
|
||||
l = 6
|
||||
</text>
|
||||
<text x="10" y="68" className="text-[13px] font-bold fill-emerald-600">
|
||||
h = 4
|
||||
</text>
|
||||
<text x="88" y="48" className="text-[13px] font-bold fill-emerald-700">
|
||||
w = 3
|
||||
</text>
|
||||
</svg>
|
||||
);
|
||||
const CylVolSvg = () => (
|
||||
<svg width="120" height="120" viewBox="-5 -5 115 120" overflow="visible">
|
||||
<ellipse
|
||||
cx="50"
|
||||
cy="25"
|
||||
rx="35"
|
||||
ry="12"
|
||||
fill="#a7f3d0"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<rect x="15" y="25" width="70" height="60" fill="#d1fae5" />
|
||||
<line x1="15" y1="25" x2="15" y2="85" stroke="#059669" strokeWidth="2" />
|
||||
<line x1="85" y1="25" x2="85" y2="85" stroke="#059669" strokeWidth="2" />
|
||||
<ellipse
|
||||
cx="50"
|
||||
cy="85"
|
||||
rx="35"
|
||||
ry="12"
|
||||
fill="#d1fae5"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<text x="67" y="19" className="text-[13px] font-bold fill-emerald-700">
|
||||
r = 5
|
||||
</text>
|
||||
<text x="92" y="58" className="text-[13px] font-bold fill-emerald-600">
|
||||
h = 8
|
||||
</text>
|
||||
</svg>
|
||||
);
|
||||
const ConeSvg = () => (
|
||||
<svg width="120" height="120" viewBox="-5 -5 115 120" overflow="visible">
|
||||
<polygon
|
||||
points="50,10 15,90 85,90"
|
||||
fill="#d1fae5"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<ellipse
|
||||
cx="50"
|
||||
cy="90"
|
||||
rx="35"
|
||||
ry="12"
|
||||
fill="#d1fae5"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<line
|
||||
x1="50"
|
||||
y1="10"
|
||||
x2="50"
|
||||
y2="90"
|
||||
stroke="#059669"
|
||||
strokeWidth="1.5"
|
||||
strokeDasharray="4"
|
||||
/>
|
||||
<text x="55" y="56" className="text-[13px] font-bold fill-emerald-600">
|
||||
h = 9
|
||||
</text>
|
||||
<text x="67" y="96" className="text-[13px] font-bold fill-emerald-700">
|
||||
r = 4
|
||||
</text>
|
||||
</svg>
|
||||
);
|
||||
const SphereVolSvg = () => (
|
||||
<svg width="120" height="110" viewBox="-5 -5 110 110" overflow="visible">
|
||||
<circle
|
||||
cx="50"
|
||||
cy="50"
|
||||
r="40"
|
||||
fill="#d1fae5"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<ellipse
|
||||
cx="50"
|
||||
cy="50"
|
||||
rx="40"
|
||||
ry="14"
|
||||
fill="none"
|
||||
stroke="#059669"
|
||||
strokeWidth="1"
|
||||
strokeDasharray="4"
|
||||
/>
|
||||
<line x1="50" y1="50" x2="90" y2="50" stroke="#059669" strokeWidth="2" />
|
||||
<circle cx="50" cy="50" r="2.5" fill="#059669" />
|
||||
<text x="70" y="44" className="text-[13px] font-bold fill-emerald-700">
|
||||
r = 6
|
||||
</text>
|
||||
</svg>
|
||||
);
|
||||
const PyramidSvg = () => (
|
||||
<svg width="130" height="125" viewBox="-5 -5 120 125" overflow="visible">
|
||||
<polygon
|
||||
points="55,10 10,90 100,90"
|
||||
fill="#d1fae5"
|
||||
stroke="#059669"
|
||||
strokeWidth="2"
|
||||
/>
|
||||
<polygon
|
||||
points="55,10 100,90 80,100 35,100 10,90"
|
||||
fill="#d1fae5"
|
||||
stroke="#059669"
|
||||
strokeWidth="1.5"
|
||||
/>
|
||||
<line
|
||||
x1="55"
|
||||
y1="10"
|
||||
x2="55"
|
||||
y2="90"
|
||||
stroke="#059669"
|
||||
strokeWidth="1.5"
|
||||
strokeDasharray="4"
|
||||
/>
|
||||
<text x="62" y="56" className="text-[13px] font-bold fill-emerald-600">
|
||||
h = 12
|
||||
</text>
|
||||
<text
|
||||
x="55"
|
||||
y="114"
|
||||
textAnchor="middle"
|
||||
className="text-[13px] font-bold fill-emerald-700"
|
||||
>
|
||||
B = 25
|
||||
</text>
|
||||
</svg>
|
||||
);
|
||||
|
||||
interface LessonProps {
|
||||
onFinish?: () => void;
|
||||
}
|
||||
const SECTIONS = [
|
||||
{ title: "Area Formulas", icon: Square },
|
||||
{ title: "Composite Shapes", icon: Layers },
|
||||
{ title: "Arc Length & Sector Area", icon: Circle },
|
||||
{ title: "Surface Area", icon: Box },
|
||||
{ title: "Volume", icon: Ruler },
|
||||
{ title: "Practice & Quiz", icon: BookOpen },
|
||||
];
|
||||
|
||||
export default function AreaVolumeLesson({ onFinish }: LessonProps) {
|
||||
return (
|
||||
<LessonShell
|
||||
title="Area & Volume"
|
||||
sections={SECTIONS}
|
||||
color="emerald"
|
||||
onFinish={onFinish}
|
||||
>
|
||||
{/* Section 1: Area Formulas */}
|
||||
<div>
|
||||
<h2 className="text-3xl font-extrabold text-slate-900 mb-6">
|
||||
Area Formulas
|
||||
</h2>
|
||||
<ConceptCard color="emerald">
|
||||
<p className="text-slate-700 leading-relaxed">
|
||||
All area formulas are on the SAT reference sheet, but knowing them
|
||||
saves time. <strong>Tap any formula</strong> to see a diagram and
|
||||
worked example.
|
||||
</p>
|
||||
<div className="grid md:grid-cols-2 gap-3 mt-4">
|
||||
<FormulaCard
|
||||
formula="Rectangle: A = l × w"
|
||||
diagram={<RectSvg />}
|
||||
example={
|
||||
<>
|
||||
<p>l = 8, w = 5</p>
|
||||
<p>
|
||||
A = 8 × 5 = <strong className="text-emerald-700">40</strong>
|
||||
</p>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
<FormulaCard
|
||||
formula={
|
||||
<>
|
||||
Triangle: A = <Frac n="1" d="2" /> × b × h
|
||||
</>
|
||||
}
|
||||
diagram={<TriSvg />}
|
||||
example={
|
||||
<>
|
||||
<p>b = 10, h = 6</p>
|
||||
<p>
|
||||
A = ½ × 10 × 6 ={" "}
|
||||
<strong className="text-emerald-700">30</strong>
|
||||
</p>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
<FormulaCard
|
||||
formula="Parallelogram: A = b × h"
|
||||
diagram={<ParaSvg />}
|
||||
example={
|
||||
<>
|
||||
<p>b = 9, h = 4</p>
|
||||
<p>
|
||||
A = 9 × 4 = <strong className="text-emerald-700">36</strong>
|
||||
</p>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
<FormulaCard
|
||||
formula={
|
||||
<>
|
||||
Trapezoid: A = <Frac n="1" d="2" />
|
||||
(b₁ + b₂) × h
|
||||
</>
|
||||
}
|
||||
diagram={<TrapSvg />}
|
||||
example={
|
||||
<>
|
||||
<p>b₁ = 6, b₂ = 10, h = 4</p>
|
||||
<p>
|
||||
A = ½(6+10) × 4 ={" "}
|
||||
<strong className="text-emerald-700">32</strong>
|
||||
</p>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
<FormulaCard
|
||||
formula="Circle: A = πr²"
|
||||
diagram={<CircAreaSvg />}
|
||||
example={
|
||||
<>
|
||||
<p>r = 5</p>
|
||||
<p>
|
||||
A = π(25) ={" "}
|
||||
<strong className="text-emerald-700">25π ≈ 78.5</strong>
|
||||
</p>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
<FormulaCard
|
||||
formula="Circumference: C = 2πr = πd"
|
||||
diagram={<CircCircSvg />}
|
||||
example={
|
||||
<>
|
||||
<p>d = 10 (r = 5)</p>
|
||||
<p>
|
||||
C = 2π(5) ={" "}
|
||||
<strong className="text-emerald-700">10π ≈ 31.4</strong>
|
||||
</p>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
</ConceptCard>
|
||||
<div className="mt-4">
|
||||
<TipCard type="warning">
|
||||
<p className="text-slate-700">
|
||||
The height of a triangle is ALWAYS perpendicular to the base —
|
||||
it's NOT the side length (unless it's a right triangle).
|
||||
</p>
|
||||
</TipCard>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Section 2: Composite Shapes */}
|
||||
<div>
|
||||
<h2 className="text-3xl font-extrabold text-slate-900 mb-6">
|
||||
Composite Shapes
|
||||
</h2>
|
||||
<ConceptCard color="emerald">
|
||||
<p className="text-slate-700 leading-relaxed">
|
||||
Break complex shapes into simpler pieces. <strong>Add</strong> areas
|
||||
for combined shapes. <strong>Subtract</strong> for cut-out regions.
|
||||
</p>
|
||||
</ConceptCard>
|
||||
<ExampleCard title="Example: L-Shape" color="emerald">
|
||||
<p>10 × 8 rectangle with a 4 × 3 piece cut out</p>
|
||||
<p className="text-slate-500">
|
||||
80 − 12 ={" "}
|
||||
<strong className="text-emerald-700">68 square units</strong>
|
||||
</p>
|
||||
</ExampleCard>
|
||||
<div className="mt-4">
|
||||
<ExampleCard title="Example: Shaded Region" color="emerald">
|
||||
<p>Square with side 10 and inscribed circle (r = 5)</p>
|
||||
<p className="text-slate-500">
|
||||
Shaded area = 100 − 25π ≈{" "}
|
||||
<strong className="text-emerald-700">21.5 square units</strong>
|
||||
</p>
|
||||
</ExampleCard>
|
||||
</div>
|
||||
<div className="mt-6">
|
||||
<CompositeAreaWidget />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Section 3: Arc Length & Sector Area */}
|
||||
<div>
|
||||
<h2 className="text-3xl font-extrabold text-slate-900 mb-6">
|
||||
Arc Length & Sector Area
|
||||
</h2>
|
||||
<ConceptCard color="emerald">
|
||||
<p className="text-slate-700 leading-relaxed">
|
||||
A sector is a "pizza slice" of a circle. The fraction of the circle
|
||||
used = central angle ÷ 360°.
|
||||
</p>
|
||||
<div className="space-y-3 mt-4">
|
||||
<FormulaBox>Arc Length = (θ ÷ 360) × 2πr</FormulaBox>
|
||||
<FormulaBox>Sector Area = (θ ÷ 360) × πr²</FormulaBox>
|
||||
</div>
|
||||
</ConceptCard>
|
||||
<ExampleCard title="Example" color="emerald">
|
||||
<p>Circle with r = 6, central angle = 60°</p>
|
||||
<p className="text-slate-500">
|
||||
Arc = (60 ÷ 360) × 2π(6) = <Frac n="1" d="6" /> × 12π = 2π
|
||||
</p>
|
||||
<p className="text-slate-500">
|
||||
Sector = (60 ÷ 360) × π(36) ={" "}
|
||||
<strong className="text-emerald-700">6π</strong>
|
||||
</p>
|
||||
</ExampleCard>
|
||||
<div className="mt-6">
|
||||
<InteractiveSectorWidget />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Section 4: Surface Area */}
|
||||
<div>
|
||||
<h2 className="text-3xl font-extrabold text-slate-900 mb-6">
|
||||
Surface Area
|
||||
</h2>
|
||||
<ConceptCard color="emerald">
|
||||
<p className="text-slate-700 leading-relaxed">
|
||||
Surface area is the total area of all faces or surfaces of a 3D
|
||||
shape. <strong>Tap any formula</strong> to see the shape and a
|
||||
worked example.
|
||||
</p>
|
||||
<div className="space-y-3 mt-4">
|
||||
<FormulaCard
|
||||
formula="Rectangular Prism: SA = 2(lw + lh + wh)"
|
||||
diagram={<PrismSASvg />}
|
||||
example={
|
||||
<>
|
||||
<p>l = 4, w = 3, h = 2</p>
|
||||
<p>SA = 2(12 + 8 + 6)</p>
|
||||
<p>
|
||||
SA = 2(26) ={" "}
|
||||
<strong className="text-emerald-700">52</strong>
|
||||
</p>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
<FormulaCard
|
||||
formula="Cylinder: SA = 2πr² + 2πrh"
|
||||
diagram={<CylSASvg />}
|
||||
example={
|
||||
<>
|
||||
<p>r = 3, h = 5</p>
|
||||
<p>SA = 2π(9) + 2π(15)</p>
|
||||
<p>
|
||||
SA = 18π + 30π ={" "}
|
||||
<strong className="text-emerald-700">48π ≈ 150.8</strong>
|
||||
</p>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
<FormulaCard
|
||||
formula="Sphere: SA = 4πr²"
|
||||
diagram={<SphereSvg />}
|
||||
example={
|
||||
<>
|
||||
<p>r = 4</p>
|
||||
<p>
|
||||
SA = 4π(16) ={" "}
|
||||
<strong className="text-emerald-700">64π ≈ 201.1</strong>
|
||||
</p>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
</ConceptCard>
|
||||
</div>
|
||||
|
||||
{/* Section 5: Volume */}
|
||||
<div>
|
||||
<h2 className="text-3xl font-extrabold text-slate-900 mb-6">Volume</h2>
|
||||
<ConceptCard color="emerald">
|
||||
<p className="text-slate-700 leading-relaxed">
|
||||
Volume formulas are provided on the SAT reference sheet.{" "}
|
||||
<strong>Tap any formula</strong> to explore.
|
||||
</p>
|
||||
<div className="space-y-3 mt-4">
|
||||
<FormulaCard
|
||||
formula="Rectangular Prism: V = lwh"
|
||||
diagram={<PrismVolSvg />}
|
||||
example={
|
||||
<>
|
||||
<p>l = 6, w = 3, h = 4</p>
|
||||
<p>
|
||||
V = 6 × 3 × 4 ={" "}
|
||||
<strong className="text-emerald-700">72</strong>
|
||||
</p>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
<FormulaCard
|
||||
formula="Cylinder: V = πr²h"
|
||||
diagram={<CylVolSvg />}
|
||||
example={
|
||||
<>
|
||||
<p>r = 5, h = 8</p>
|
||||
<p>
|
||||
V = π(25)(8) ={" "}
|
||||
<strong className="text-emerald-700">200π ≈ 628.3</strong>
|
||||
</p>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
<FormulaCard
|
||||
formula={
|
||||
<>
|
||||
Cone: V = <Frac n="1" d="3" />
|
||||
πr²h
|
||||
</>
|
||||
}
|
||||
diagram={<ConeSvg />}
|
||||
example={
|
||||
<>
|
||||
<p>r = 4, h = 9</p>
|
||||
<p>V = ⅓ × π(16)(9)</p>
|
||||
<p>
|
||||
V ={" "}
|
||||
<strong className="text-emerald-700">48π ≈ 150.8</strong>
|
||||
</p>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
<FormulaCard
|
||||
formula={
|
||||
<>
|
||||
Sphere: V = <Frac n="4" d="3" />
|
||||
πr³
|
||||
</>
|
||||
}
|
||||
diagram={<SphereVolSvg />}
|
||||
example={
|
||||
<>
|
||||
<p>r = 6</p>
|
||||
<p>V = ⁴⁄₃ × π(216)</p>
|
||||
<p>
|
||||
V ={" "}
|
||||
<strong className="text-emerald-700">288π ≈ 904.8</strong>
|
||||
</p>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
<FormulaCard
|
||||
formula={
|
||||
<>
|
||||
Pyramid: V = <Frac n="1" d="3" />
|
||||
Bh
|
||||
</>
|
||||
}
|
||||
diagram={<PyramidSvg />}
|
||||
example={
|
||||
<>
|
||||
<p>B = 25 (5×5 base), h = 12</p>
|
||||
<p>
|
||||
V = ⅓ × 25 × 12 ={" "}
|
||||
<strong className="text-emerald-700">100</strong>
|
||||
</p>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
</ConceptCard>
|
||||
<div className="mt-6">
|
||||
<CompositeSolidsWidget />
|
||||
</div>
|
||||
<div className="mt-6">
|
||||
<ScaleFactorWidget />
|
||||
</div>
|
||||
<div className="mt-4">
|
||||
<TipCard type="remember">
|
||||
<p className="text-slate-700">
|
||||
A cone is <Frac n="1" d="3" /> of a cylinder with the same base
|
||||
and height. A pyramid is <Frac n="1" d="3" /> of a prism with the
|
||||
same base and height.
|
||||
</p>
|
||||
</TipCard>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Section 6: Practice */}
|
||||
<div>
|
||||
<h2 className="text-3xl font-extrabold text-slate-900 mb-6">
|
||||
Practice
|
||||
</h2>
|
||||
{AREA_VOL_EASY.slice(0, 2).map((q) => (
|
||||
<PracticeFromDataset key={q.id} question={q} color="emerald" />
|
||||
))}
|
||||
{AREA_VOL_MEDIUM.slice(0, 1).map((q) => (
|
||||
<PracticeFromDataset key={q.id} question={q} color="emerald" />
|
||||
))}
|
||||
</div>
|
||||
</LessonShell>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user