diff --git a/src/App.tsx b/src/App.tsx index a47710f..29746d1 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -59,6 +59,7 @@ const FractionPizza = lazy(() => import('./routes/arcade/FractionPizza').then((m const ChessPuzzle = lazy(() => import('./routes/arcade/ChessPuzzle').then((m) => ({ default: m.ChessPuzzle }))); const ChineseCheckers = lazy(() => import('./routes/arcade/ChineseCheckers').then((m) => ({ default: m.ChineseCheckers }))); const GreedyCrawler = lazy(() => import('./routes/arcade/GreedyCrawler').then((m) => ({ default: m.GreedyCrawler }))); +const CritterCottage = lazy(() => import('./routes/arcade/CritterCottage').then((m) => ({ default: m.CritterCottage }))); const NotFound = lazy(() => import('./routes/NotFound').then((m) => ({ default: m.NotFound }))); // Warm-up gate wraps every arcade game with a short adaptive quiz. @@ -122,7 +123,7 @@ export default function App() { } /> } /> } /> - } /> + } /> } /> } /> } /> @@ -132,6 +133,7 @@ export default function App() { } /> } /> } /> + } /> } /> } /> } /> diff --git a/src/components/Explanation.tsx b/src/components/Explanation.tsx index 215438b..f877cd3 100644 --- a/src/components/Explanation.tsx +++ b/src/components/Explanation.tsx @@ -1,7 +1,6 @@ -import { useEffect, useState } from 'react'; +import { useState } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { MathText } from './MathText'; -import { useProgress } from '../state/progress'; interface AltExplanation { title: string; @@ -13,68 +12,11 @@ interface Props { alternatives?: AltExplanation[]; } -// Think-time cover: hides the worked solution for a configurable delay so the -// student tries the problem first, then auto-reveals. Delay is set by the -// grown-ups in Settings (arcadeConfig.answerRevealSeconds; 0 = instant). -function ThinkTimeCover({ total, left }: { total: number; left: number }) { - const pct = total > 0 ? Math.max(0, Math.min(1, left / total)) : 0; - return ( - -
🧠
-
- Give it a try first! -
-

- Work it out yourself — the step-by-step answer appears in a moment. -

-
- - {left}s - -
-
- -
-
- ); -} - +// Explanations are always available — kids can read the "how & why" at any time. +// The configurable think-time pause lives on the ANSWER reveal instead (see Hint), +// so the worked steps here never sit behind a countdown. export function Explanation({ steps, alternatives }: Props) { const [openAlt, setOpenAlt] = useState(null); - const delay = useProgress((s) => s.arcadeConfig.answerRevealSeconds) ?? 15; - const [revealed, setRevealed] = useState(delay <= 0); - const [left, setLeft] = useState(delay); - - useEffect(() => { - if (delay <= 0) { - setRevealed(true); - return; - } - setRevealed(false); - setLeft(delay); - const start = Date.now(); - const id = window.setInterval(() => { - const rem = Math.max(0, delay - Math.round((Date.now() - start) / 1000)); - setLeft(rem); - if (rem <= 0) { - window.clearInterval(id); - setRevealed(true); - } - }, 250); - return () => window.clearInterval(id); - }, [delay]); - - if (!revealed) { - return ; - } return ( = { export function Hint({ tiers, onReveal, onExplain }: Props) { const [revealed, setRevealed] = useState(0); + // Think-time pause applies to the ANSWER reveal only: before the final "Reveal" + // tier unlocks, a short countdown nudges the student to try first. Set by the + // grown-ups in Settings (arcadeConfig.answerRevealSeconds; 0 = instant). + const delay = useProgress((s) => s.arcadeConfig.answerRevealSeconds) ?? 15; + const [left, setLeft] = useState(0); + + const nextTier = tiers[revealed]; // the tier the button would reveal next + const gateNext = !!nextTier && nextTier.level === 'reveal' && delay > 0; + + // run the think-time countdown while the next tier to reveal is the answer + useEffect(() => { + if (!gateNext) { setLeft(0); return; } + setLeft(delay); + const start = Date.now(); + const id = window.setInterval(() => { + const rem = Math.max(0, delay - Math.round((Date.now() - start) / 1000)); + setLeft(rem); + if (rem <= 0) window.clearInterval(id); + }, 250); + return () => window.clearInterval(id); + }, [gateNext, delay, revealed]); if (tiers.length === 0) return null; + const locked = gateNext && left > 0; // answer reveal held during think-time + const reveal = () => { if (revealed >= tiers.length) return; const next = revealed + 1; @@ -40,19 +64,20 @@ export function Hint({ tiers, onReveal, onExplain }: Props) { }; const more = revealed < tiers.length; - const buttonLabel = - revealed === 0 - ? 'Show hint' - : more - ? 'Need another hint?' - : 'Hide hints'; + const buttonLabel = !more + ? 'Hide hints' + : locked + ? `🧠 Think first… answer in ${left}s` + : nextTier?.level === 'reveal' + ? 'Reveal the answer' + : revealed === 0 + ? 'Show hint' + : 'Need another hint?'; const handleClick = () => { - if (more) { - reveal(); - } else { - setRevealed(0); - } + if (!more) { setRevealed(0); return; } + if (locked) return; + reveal(); }; return ( @@ -60,9 +85,12 @@ export function Hint({ tiers, onReveal, onExplain }: Props) { diff --git a/src/components/LessonCard.tsx b/src/components/LessonCard.tsx index b469a3f..6ea82f1 100644 --- a/src/components/LessonCard.tsx +++ b/src/components/LessonCard.tsx @@ -5,6 +5,7 @@ import { lessonKey, lessonAnswerMatches, type Lesson, + type LessonSlide, type WorkedExample, type PracticeQuestion, } from '../data/lessons'; @@ -26,16 +27,35 @@ type Page = | { kind: 'intro' } | { kind: 'video'; idx: number } | { kind: 'concept' } + | { kind: 'slide'; idx: number } | { kind: 'example'; idx: number } | { kind: 'practice'; idx: number } | { kind: 'watchout' }; -// Video slots are positional: videos[0] = the idea (after intro), -// videos[1] = worked examples (after the example pages), -// videos[2+] = avoid-the-trap (right before the wrap-up). +// Story-style deck: ONE video (the "idea" Manim animation) after the objective, +// then the authored slides (concepts → examples → pro tips), then interactive +// practice, then the trap/summary slides + watch-out. Lessons without an +// authored `slides` deck fall back to the legacy page set (all videos). function buildPages(lesson: Lesson): Page[] { const vids = lesson.videos ?? []; + const slides = lesson.slides ?? []; const pages: Page[] = [{ kind: 'intro' }]; + + if (slides.length > 0) { + const idxOf = (s: LessonSlide) => slides.indexOf(s); + const objectives = slides.filter((s) => s.kind === 'objective'); + const middle = slides.filter((s) => s.kind === 'concept' || s.kind === 'example' || s.kind === 'protip'); + const tail = slides.filter((s) => s.kind === 'trap' || s.kind === 'summary'); + objectives.forEach((s) => pages.push({ kind: 'slide', idx: idxOf(s) })); + if (vids.length > 0) pages.push({ kind: 'video', idx: 0 }); // the one lesson video + middle.forEach((s) => pages.push({ kind: 'slide', idx: idxOf(s) })); + lesson.practice.forEach((_, i) => pages.push({ kind: 'practice', idx: i })); + tail.forEach((s) => pages.push({ kind: 'slide', idx: idxOf(s) })); + pages.push({ kind: 'watchout' }); + return pages; + } + + // legacy layout (no slide deck authored) if (vids.length > 0) pages.push({ kind: 'video', idx: 0 }); pages.push({ kind: 'concept' }); lesson.examples.forEach((_, i) => pages.push({ kind: 'example', idx: i })); @@ -50,19 +70,45 @@ function buildPages(lesson: Lesson): Page[] { const SECTION_ORDER = ['Intro', 'Key idea', 'Examples', 'Try it', 'Wrap-up'] as const; type SectionName = (typeof SECTION_ORDER)[number]; -function sectionOf(page: Page): SectionName { - if (page.kind === 'intro') return 'Intro'; - if (page.kind === 'concept') return 'Key idea'; - // Video pages roll into the section they support so the breadcrumb - // structure stays at 5 fixed sections. - if (page.kind === 'video') { - if (page.idx === 0) return 'Key idea'; - if (page.idx === 1) return 'Examples'; +function sectionOfSlide(kind: LessonSlide['kind']): SectionName { + if (kind === 'objective') return 'Intro'; + if (kind === 'concept') return 'Key idea'; + if (kind === 'example' || kind === 'protip') return 'Examples'; + return 'Wrap-up'; // trap | summary +} + +function makeSectionOf(lesson: Lesson): (page: Page) => SectionName { + const slides = lesson.slides ?? []; + return (page: Page): SectionName => { + if (page.kind === 'intro') return 'Intro'; + if (page.kind === 'concept') return 'Key idea'; + if (page.kind === 'slide') return sectionOfSlide(slides[page.idx]?.kind ?? 'concept'); + // Video pages roll into the section they support so the breadcrumb + // structure stays at 5 fixed sections. + if (page.kind === 'video') { + if (page.idx === 0) return 'Key idea'; + if (page.idx === 1) return 'Examples'; + return 'Wrap-up'; + } + if (page.kind === 'example') return 'Examples'; + if (page.kind === 'practice') return 'Try it'; return 'Wrap-up'; + }; +} + +// Minimum read time per page kind (seconds) before Next unlocks. The deck +// still ONLY advances on a button press — this just stops click-through. +// Scaled by the admin's lessonScreenSeconds (default 6 = 1×; 0 disables). +function baseSecsFor(page: Page, lesson: Lesson): number { + if (page.kind === 'slide') { + const k = (lesson.slides ?? [])[page.idx]?.kind; + if (k === 'example') return 8; + if (k === 'concept') return 5; + return 3; // objective | protip | trap | summary } - if (page.kind === 'example') return 'Examples'; - if (page.kind === 'practice') return 'Try it'; - return 'Wrap-up'; + if (page.kind === 'example' || page.kind === 'practice') return 8; + if (page.kind === 'concept') return 5; + return 3; // intro | video | watchout } interface PracticeState { @@ -84,21 +130,23 @@ export function LessonCard({ lesson, onClose, onStart }: Props) { const [exampleOpen, setExampleOpen] = useState>({}); const [practiceState, setPracticeState] = useState>({}); - // Per-screen minimum read time (anti-click-through). Default 6s, set by the - // parent/admin controls. The primary Next/Finish button is disabled until the - // countdown for the current page elapses. 0 = off (instant advance). + // Per-slide minimum read time (anti-click-through): 8s example slides, 5s + // concept/explanation slides, 3s short slides. The admin's lessonScreenSeconds + // scales the pacing (6 = 1×; 0 = off). The deck still advances only on press. const screenSecs = useProgress((s) => s.arcadeConfig.lessonScreenSeconds ?? 6); - const [remain, setRemain] = useState(screenSecs); + const [remain, setRemain] = useState(0); useEffect(() => { if (phase !== 'learn' || screenSecs <= 0) { setRemain(0); return; } - setRemain(screenSecs); + const secs = Math.max(1, Math.round(baseSecsFor(pages[pageIndex], lesson) * (screenSecs / 6))); + setRemain(secs); const id = setInterval(() => { setRemain((r) => (r <= 1 ? 0 : r - 1)); }, 1000); return () => clearInterval(id); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [pageIndex, screenSecs, phase]); const finish = () => { @@ -127,6 +175,7 @@ export function LessonCard({ lesson, onClose, onStart }: Props) { const goBack = () => setPageIndex((i) => Math.max(0, i - 1)); const current = pages[pageIndex]; + const sectionOf = makeSectionOf(lesson); return ( @@ -161,6 +210,7 @@ export function LessonCard({ lesson, onClose, onStart }: Props) { setPageIndex(idx)} /> @@ -181,6 +231,9 @@ export function LessonCard({ lesson, onClose, onStart }: Props) { /> )} {current.kind === 'concept' && } + {current.kind === 'slide' && lesson.slides?.[current.idx] && ( + + )} {current.kind === 'example' && ( SectionName; onJump: (idx: number) => void; }) { const activeSection = sectionOf(pages[pageIndex]); @@ -384,6 +439,35 @@ function ConceptPage({ lesson }: { lesson: Lesson }) { ); } +// One story-style slide: a kind badge, a big headline, and ~3 readable +// sentences. Renders lesson `slides` decks (the math-stories format). +const SLIDE_STYLE: Record = { + objective: { badge: "Today's goal", emoji: '🎯', card: 'bg-sky-50 border-sky-200', badgeCls: 'bg-sky-200 text-sky-900' }, + concept: { badge: 'How it works', emoji: '💡', card: 'bg-blue-50 border-blue-200', badgeCls: 'bg-blue-200 text-blue-900' }, + example: { badge: 'Worked example', emoji: '✏️', card: 'bg-emerald-50 border-emerald-200', badgeCls: 'bg-emerald-200 text-emerald-900' }, + protip: { badge: 'Pro tip', emoji: '⭐', card: 'bg-violet-50 border-violet-200', badgeCls: 'bg-violet-200 text-violet-900' }, + trap: { badge: 'Trap to avoid', emoji: '⚠️', card: 'bg-amber-50 border-amber-200', badgeCls: 'bg-amber-200 text-amber-900' }, + summary: { badge: 'Summary', emoji: '🏁', card: 'bg-green-50 border-green-200', badgeCls: 'bg-green-200 text-green-900' }, +}; + +function SlidePage({ slide }: { slide: LessonSlide }) { + const st = SLIDE_STYLE[slide.kind]; + return ( +
+
+ + {st.badge} + + +
+
+

{slide.head}

+

{slide.body}

+
+
+ ); +} + function ExamplePage({ ex, index, diff --git a/src/components/MathematicianDeck.tsx b/src/components/MathematicianDeck.tsx new file mode 100644 index 0000000..68f041d --- /dev/null +++ b/src/components/MathematicianDeck.tsx @@ -0,0 +1,150 @@ +import { useEffect, useState } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { useProgress } from '../state/progress'; +import type { MathematicianDeck as Deck } from '../data/mathematicianDecks'; + +// Full-screen slide player for a mathematician's story — the same look and +// controls as the Math Stories player (StorySlide): big readable narration on +// the left, a LARGE emoji-scene illustration on the right, Continue ▶ / Back +// pills, keyboard arrows, and swipe. Advances ONLY on a button press; each +// slide has a short minimum-read gate (scaled by the admin's +// lessonScreenSeconds; 0 disables) so kids actually read before continuing. +export function MathematicianDeckPlayer({ deck, onClose }: { deck: Deck; onClose: () => void }) { + const [idx, setIdx] = useState(0); // 0 = title slide; 1..n = deck.slides + const total = deck.slides.length + 1; + const isLast = idx >= total - 1; + + // min-read gate: 4s per slide at the default setting (6 = 1×; 0 = off) + const screenSecs = useProgress((s) => s.arcadeConfig.lessonScreenSeconds ?? 6); + const [remain, setRemain] = useState(0); + useEffect(() => { + if (screenSecs <= 0) { setRemain(0); return; } + const secs = Math.max(1, Math.round(4 * (screenSecs / 6))); + setRemain(secs); + const id = window.setInterval(() => setRemain((r) => (r <= 1 ? 0 : r - 1)), 1000); + return () => window.clearInterval(id); + }, [idx, screenSecs]); + + const next = () => { if (remain > 0) return; if (isLast) onClose(); else setIdx((i) => i + 1); }; + const back = () => setIdx((i) => Math.max(0, i - 1)); + + // keyboard + useEffect(() => { + const onKey = (e: KeyboardEvent) => { + if (e.key === 'ArrowRight' || e.key === ' ' || e.key === 'Enter') next(); + else if (e.key === 'ArrowLeft') back(); + else if (e.key === 'Escape') onClose(); + }; + window.addEventListener('keydown', onKey); + return () => window.removeEventListener('keydown', onKey); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [idx, remain]); + + // swipe + const [touchX, setTouchX] = useState(null); + const onTouchStart = (e: React.TouchEvent) => setTouchX(e.touches[0].clientX); + const onTouchEnd = (e: React.TouchEvent) => { + if (touchX == null) return; + const dx = e.changedTouches[0].clientX - touchX; + if (dx < -60) next(); + else if (dx > 60) back(); + setTouchX(null); + }; + + const slide = idx === 0 ? null : deck.slides[idx - 1]; + const visual = slide?.visual ?? deck.emoji; + + return ( +
+ {/* header */} +
+
+
+ 🧑‍🔬 Famous Mathematician · {deck.era} +
+

+ {deck.emoji} {deck.name} +

+
+ +
+ + {/* progress */} +
+
+
+ + {/* stage: narration left, big emoji-scene illustration right (stacks on phones) */} +
+
+ + + {slide ? ( + <> +
+ {slide.head} +
+

+ {slide.body} +

+ + ) : ( + <> +

+ {deck.name} +

+

{deck.era}

+
+ 📘 Connects to: {deck.tieIn} +
+ + )} +
+
+
+ + {/* illustration pane — the emoji scene, drawn HUGE */} +
+ + + +
+
+ + {/* nav */} +
+ +
+ {idx + 1} / {total} +
+ +
+
+ ); +} diff --git a/src/components/StorySlide.tsx b/src/components/StorySlide.tsx index 6362f30..4d17638 100644 --- a/src/components/StorySlide.tsx +++ b/src/components/StorySlide.tsx @@ -120,14 +120,17 @@ export function StorySlide({ story, onClose }: Props) { }; }, [chaptersUrl]); - // Map a slide index to its [start, end] in the underlying video. + // Map a slide index to its [start, end] in the underlying video. Beats past + // the video's rendered segments (stories now have MORE beats than the video + // has chapters) clamp to the final segment, freezing on the last frame. const segmentFor = (slideIdx: number): { start: number; end: number } => { const beat = slides[slideIdx].beatIdx; const ch = chaptersRef.current; if (!ch) return { start: 0, end: Infinity }; if (beat < 0) return { start: 0, end: ch.checkpoints[0] ?? ch.total }; - const start = ch.checkpoints[beat] ?? 0; - const end = ch.checkpoints[beat + 1] ?? ch.total; + const b = Math.min(beat, Math.max(0, ch.checkpoints.length - 1)); + const start = ch.checkpoints[b] ?? 0; + const end = ch.checkpoints[b + 1] ?? ch.total; return { start, end }; }; diff --git a/src/data/lessonSlides/ee.ts b/src/data/lessonSlides/ee.ts new file mode 100644 index 0000000..0e41f96 --- /dev/null +++ b/src/data/lessonSlides/ee.ts @@ -0,0 +1,158 @@ +import type { SlideBank } from './types'; + +// 6.EE — Expressions & Equations. 12–14 slides per lesson, ~3 short sentences +// each, written for a 10–12-year-old: objective → concepts → simplest-to-fuller +// examples → pro tip → trap(s) → summary. +export const EE_SLIDES: SlideBank = { + '6.EE-1': [ + { kind: 'objective', head: 'Powers: multiplication on repeat', body: 'Today you will read and evaluate exponents like 2³ and 5². An exponent is just a shortcut for multiplying the same number over and over. Once you crack the code, powers are quick and fun.' }, + { kind: 'concept', head: 'The exponent counts the copies', body: 'In 2³, the little 3 tells you how many copies of 2 to multiply. So 2³ = 2 × 2 × 2. The big number is called the BASE, and the little one is the EXPONENT.' }, + { kind: 'concept', head: 'Multiply the base — never add', body: 'The base gets MULTIPLIED by itself, not added to the exponent. 2³ means 2 × 2 × 2 = 8, not 2 × 3 = 6. Write out the copies if you\'re ever unsure.' }, + { kind: 'concept', head: 'Special powers to know', body: 'Any number to the 1st power is just itself: 7¹ = 7. "Squared" means the power 2, like 5² = 5 × 5. "Cubed" means the power 3, like 4³ = 4 × 4 × 4.' }, + { kind: 'example', head: 'Start simple: 5²', body: '5² means two copies of 5 multiplied.\n5 × 5 = 25.\nAnswer: 25 — that\'s why we say "5 squared".' }, + { kind: 'example', head: 'Three copies: 3³', body: '3³ means 3 × 3 × 3.\nFirst pair: 3 × 3 = 9. Then 9 × 3 = 27.\nAnswer: 27.' }, + { kind: 'example', head: 'Four copies: 2⁴', body: '2⁴ means 2 × 2 × 2 × 2.\nGo step by step: 2 × 2 = 4, then 4 × 2 = 8, then 8 × 2 = 16.\nAnswer: 16.' }, + { kind: 'example', head: 'Tens are the friendliest: 10³', body: '10³ means 10 × 10 × 10.\n10 × 10 = 100, then 100 × 10 = 1,000.\nAnswer: 1,000 — with base 10, the exponent counts the zeros!' }, + { kind: 'example', head: 'A bigger one: 4³', body: '4³ means 4 × 4 × 4.\nFirst: 4 × 4 = 16. Then: 16 × 4 = 64 (because 16 × 4 = 10 × 4 + 6 × 4 = 40 + 24).\nAnswer: 64.' }, + { kind: 'protip', head: 'Unroll it, then multiply in steps', body: 'When a power looks scary, unroll it into a multiplication chain first: 2⁴ → 2 × 2 × 2 × 2. Then multiply two numbers at a time, left to right. Small steps beat one big leap every time.' }, + { kind: 'trap', head: 'Trap: 2³ is NOT 6', body: 'The #1 exponent mistake is multiplying the base by the exponent: 2 × 3 = 6. Wrong! 2³ means 2 × 2 × 2 = 8. The exponent counts copies — it never joins the multiplication itself.' }, + { kind: 'trap', head: 'Trap: mixing up 2³ and 3²', body: 'Swapping the base and exponent changes the answer. 2³ = 2 × 2 × 2 = 8, but 3² = 3 × 3 = 9. The BIG number is what you multiply; the little number just counts.' }, + { kind: 'summary', head: 'You speak exponent now', body: 'An exponent counts how many copies of the base to multiply: 2³ = 2 × 2 × 2 = 8. Unroll the power, then multiply step by step. Never multiply the base by the exponent — that\'s the classic trap!' }, + ], + '6.EE-2': [ + { kind: 'objective', head: 'Turn words into math', body: 'Today you will write expressions from words and evaluate them. A letter like x is a variable — a mystery box holding a number. You\'ll learn to translate words into symbols and then plug in values.' }, + { kind: 'concept', head: 'A variable is a mystery box', body: 'A variable is a letter that stands for a number we don\'t know yet — or one that can change. In n + 6, the n could be 1, 10, or 100. The expression works for ALL of them.' }, + { kind: 'concept', head: 'Learn the translation dictionary', body: 'Certain words always mean the same operation. "More than" or "sum" means +. "Product" or "times" means ×, and "less than" means subtract — but it flips the order! "6 less than n" is n − 6.' }, + { kind: 'concept', head: '2x means 2 times x', body: 'When a number sits right next to a variable, it means MULTIPLY. 2x is 2 × x, and 5y is 5 × y. No symbol needed — being neighbors means multiplying.' }, + { kind: 'concept', head: 'Evaluate = substitute, then compute', body: 'To evaluate an expression, swap the variable for its value. Then follow the order of operations: parentheses first, then multiply and divide, then add and subtract. Multiplication ALWAYS beats addition.' }, + { kind: 'example', head: 'Write it: six more than n', body: '"More than" means add.\nSix more than a number n is n + 6.\nAnswer: n + 6.' }, + { kind: 'example', head: 'Write it: the product of 4 and x', body: '"Product" means multiply.\n4 times x is written by putting them side by side.\nAnswer: 4x.' }, + { kind: 'example', head: 'Evaluate: x + 9 when x = 6', body: 'Swap x for 6: 6 + 9.\nAdd: 6 + 9 = 15.\nAnswer: 15.' }, + { kind: 'example', head: 'Evaluate: 2x + 5 when x = 4', body: 'Substitute: 2 × 4 + 5.\nMultiply FIRST: 2 × 4 = 8.\nThen add: 8 + 5 = 13. Answer: 13.' }, + { kind: 'example', head: 'Evaluate: 3(a − 2) when a = 5', body: 'Substitute: 3(5 − 2).\nParentheses first: 5 − 2 = 3.\nThen multiply: 3 × 3 = 9. Answer: 9.' }, + { kind: 'example', head: 'Evaluate: 5y − 3 when y = 2', body: 'Substitute: 5 × 2 − 3.\nMultiply first: 5 × 2 = 10.\nThen subtract: 10 − 3 = 7. Answer: 7.' }, + { kind: 'protip', head: 'Wrap the value in parentheses', body: 'When you substitute, write the value inside parentheses: 2x becomes 2(4). It reminds you that the number and variable are MULTIPLIED, and it keeps your work tidy. This tiny habit prevents tons of mistakes.' }, + { kind: 'trap', head: 'Trap: adding before multiplying', body: 'In 2x + 5 with x = 4, kids sometimes add 4 + 5 first. Wrong order! 2x means 2 TIMES x, so multiply first: 2 × 4 = 8, then add 5 to get 13.' }, + { kind: 'summary', head: 'Translate, substitute, compute', body: 'Variables are letters standing for numbers, and 2x means 2 times x. Translate words with the dictionary: "more than" = +, "product" = ×, "less than" flips the order. To evaluate, substitute the value and multiply before you add.' }, + ], + '6.EE-3': [ + { kind: 'objective', head: 'Same value, new outfit', body: 'Today you will rewrite expressions into equivalent ones — different looks, same value. Your two power tools: the distributive property and combining like terms. These moves make messy expressions clean.' }, + { kind: 'concept', head: 'Distribute: share with EVERY term', body: 'The distributive property says a(b + c) = ab + ac. The outside number multiplies EVERY term inside the parentheses. Think of it as handing out snacks — everyone inside gets one.' }, + { kind: 'concept', head: 'Like terms stick together', body: 'Like terms have the exact same variable part: 3x and 2x are like terms. To combine them, add the coefficients (the front numbers): 3x + 2x = 5x. Three x\'s plus two x\'s really is five x\'s!' }, + { kind: 'concept', head: 'Equivalent = equal for EVERY x', body: 'Two expressions are equivalent when they give the same answer no matter what x is. 3(x + 2) and 3x + 6 match at x = 1, x = 5, x = 100 — every value. Rewriting never changes the value, only the look.' }, + { kind: 'example', head: 'Combine: 4x + 5x', body: 'Same variable part, so add the front numbers.\n4 + 5 = 9.\nAnswer: 9x.' }, + { kind: 'example', head: 'Combine: 7a − 2a', body: 'Like terms again — subtract the coefficients.\n7 − 2 = 5.\nAnswer: 5a.' }, + { kind: 'example', head: 'Expand: 3(x + 2)', body: 'The 3 multiplies BOTH terms inside.\n3 × x = 3x, and 3 × 2 = 6.\nAnswer: 3x + 6.' }, + { kind: 'example', head: 'Expand: 5(y + 3)', body: 'Share the 5 with each term.\n5 × y = 5y, and 5 × 3 = 15.\nAnswer: 5y + 15.' }, + { kind: 'example', head: 'Simplify: 2x + 3 + x', body: 'Find the like terms: 2x and x (which is 1x).\n2x + 1x = 3x. The 3 has no partner, so it stays.\nAnswer: 3x + 3.' }, + { kind: 'example', head: 'Both moves: 2(x + 4) + 3x', body: 'Distribute first: 2 × x = 2x and 2 × 4 = 8, giving 2x + 8 + 3x.\nCombine like terms: 2x + 3x = 5x.\nAnswer: 5x + 8.' }, + { kind: 'protip', head: 'Draw arrows when you distribute', body: 'Draw an arrow from the outside number to EACH term inside the parentheses. Two terms inside means two arrows and two little multiplications. The arrows make it impossible to forget anyone.' }, + { kind: 'trap', head: 'Trap: distributing to only one term', body: 'Kids often write 3(x + 2) = 3x + 2, multiplying only the x. The 3 must hit EVERY term: 3x + 6. Check yourself: did the outside number visit everyone inside?' }, + { kind: 'summary', head: 'Two moves, endless rewrites', body: 'Distribute: the outside number multiplies every term inside, so a(b + c) = ab + ac. Combine like terms by adding their coefficients: 3x + 2x = 5x. Equivalent expressions look different but give the same value for every x.' }, + ], + '6.EE-4': [ + { kind: 'objective', head: 'Solve it in one move', body: 'Today you will solve one-step equations like x + 7 = 12 and 3x = 15. The trick is to UNDO whatever is being done to x. One smart move and the mystery number is revealed.' }, + { kind: 'concept', head: 'An equation is a balanced scale', body: 'The = sign says both sides weigh exactly the same. If you take 7 off one side, you MUST take 7 off the other, or the scale tips. Every solving move happens to both sides.' }, + { kind: 'concept', head: 'Undo with the opposite', body: 'Ask: what is being done to x? Then do the opposite. Adding 7? Subtract 7. Multiplied by 3? Divide by 3. Opposites cancel out and leave x standing alone.' }, + { kind: 'concept', head: 'The goal: x alone on one side', body: 'You win when the equation reads x = some number. Everything you do is aimed at getting x by itself. Once x is alone, the other side IS your answer.' }, + { kind: 'example', head: 'Undo adding: x + 7 = 12', body: 'x has 7 added to it, so subtract 7 from BOTH sides.\nx + 7 − 7 = 12 − 7.\nx = 5. Check: 5 + 7 = 12. ✓' }, + { kind: 'example', head: 'Undo subtracting: x − 4 = 10', body: 'x has 4 taken away, so add 4 to both sides.\nx = 10 + 4.\nx = 14. Check: 14 − 4 = 10. ✓' }, + { kind: 'example', head: 'Undo multiplying: 3x = 15', body: '3x means 3 times x, so divide both sides by 3.\nx = 15 ÷ 3.\nx = 5. Check: 3 × 5 = 15. ✓' }, + { kind: 'example', head: 'Undo dividing: x ÷ 2 = 8', body: 'x is being divided by 2, so multiply both sides by 2.\nx = 8 × 2.\nx = 16. Check: 16 ÷ 2 = 8. ✓' }, + { kind: 'example', head: 'Bigger numbers: x + 9 = 20', body: 'Subtract 9 from both sides.\nx = 20 − 9.\nx = 11. Check: 11 + 9 = 20. ✓' }, + { kind: 'example', head: 'One more: 4x = 28', body: 'Divide both sides by 4.\nx = 28 ÷ 4. Since 4 × 7 = 28, that\'s 7.\nx = 7. Check: 4 × 7 = 28. ✓' }, + { kind: 'protip', head: 'Always check by plugging back in', body: 'After solving, put your answer back into the ORIGINAL equation. Solved x + 7 = 12 and got x = 5? Check: 5 + 7 = 12. ✓ Ten seconds of checking catches almost every mistake.' }, + { kind: 'trap', head: 'Trap: changing only one side', body: 'If you subtract 7 from the left but not the right, the scale tips and the equation lies to you. Whatever you do to one side, do to the other — every single time. That\'s the golden rule of equations.' }, + { kind: 'summary', head: 'Balance, undo, check', body: 'An equation is a balanced scale — treat both sides the same. Undo what\'s done to x with the opposite operation until x stands alone. Then plug your answer back in to check it works.' }, + ], + '6.EE-5': [ + { kind: 'objective', head: 'Math with wiggle room', body: 'Today you will write and graph inequalities — statements like x > 3 that describe a whole RANGE of numbers. You\'ll learn the four symbols and how to draw them on a number line.' }, + { kind: 'concept', head: 'Four symbols to know', body: '< means less than, and > means greater than. ≤ means "at most" (less than OR equal), and ≥ means "at least" (greater than OR equal). The little line underneath means the number itself is included.' }, + { kind: 'concept', head: 'One inequality, infinitely many answers', body: 'x > 3 doesn\'t have one answer — it means EVERY number bigger than 3. So 4, 5, 3.1, and 100 all work. But 3 itself does not, because 3 is not bigger than 3.' }, + { kind: 'concept', head: 'Open circle or closed circle?', body: 'On a number line, use an OPEN circle for < or > — the number is the boundary but not included. Use a CLOSED (filled) circle for ≤ or ≥ — the number counts too. Then shade the arrow toward all the solutions.' }, + { kind: 'concept', head: 'Hungry mouth, pointy tail', body: 'The symbol opens like a mouth toward the BIGGER side and points at the smaller one. In x > 3, the mouth faces x, so x is bigger. Read it left to right: "x is greater than 3."' }, + { kind: 'example', head: 'Write it: n is greater than 7', body: '"Greater than" is the symbol >.\nThe mouth opens toward n, the bigger side.\nAnswer: n > 7.' }, + { kind: 'example', head: 'Write it: at most 10', body: '"At most 10" means 10 is the ceiling — you can hit it but not pass it.\nThat\'s less than or equal to.\nAnswer: x ≤ 10.' }, + { kind: 'example', head: 'Graph x ≥ 2: which circle?', body: '≥ includes the number itself, since 2 IS "at least 2".\nSo draw a CLOSED (filled) circle at 2.\nThen shade to the right, toward bigger numbers.' }, + { kind: 'example', head: 'Is x = 5 a solution to x < 5?', body: 'Test it: is 5 less than 5?\nNo — 5 equals 5, and < does not allow equal.\nAnswer: no, 5 is not a solution.' }, + { kind: 'example', head: 'Is x = 4 included in x ≤ 4?', body: '≤ means "at most," and equal is allowed.\n4 ≤ 4 is true because 4 equals 4.\nAnswer: yes, 4 is included — closed circle at 4.' }, + { kind: 'protip', head: 'Test a number to check your graph', body: 'After graphing, pick an easy number from your shaded side and test it. Graphed x > 3 and shaded right? Test 5: is 5 > 3? Yes — shading is correct. If the test fails, you shaded the wrong way.' }, + { kind: 'trap', head: 'Trap: forgetting who\'s included', body: '< and > do NOT include the boundary number, but ≤ and ≥ DO. So x = 4 fails x < 4 but passes x ≤ 4. Look for the little line under the symbol — it means "or equal to."' }, + { kind: 'summary', head: 'Symbols, circles, shading', body: 'Four symbols: < less than, > greater than, ≤ at most, ≥ at least. An inequality describes a whole range of numbers, not just one. Graph with an open circle for < or >, a closed circle for ≤ or ≥, then shade toward the solutions.' }, + ], + '6.EE-6': [ + { kind: 'objective', head: 'When one number drives another', body: 'Today you will connect variables that change together, like time and distance. One variable is the driver, the other responds. An equation like d = 50t is the rule connecting them.' }, + { kind: 'concept', head: 'The independent variable drives', body: 'The INDEPENDENT variable is the one you choose or control — like how many hours you drive. It goes first and doesn\'t depend on anything. Time is the classic example.' }, + { kind: 'concept', head: 'The dependent variable responds', body: 'The DEPENDENT variable is the result — it depends on the other one. Drive longer, travel farther: distance depends on time. In an equation it usually sits alone on one side, like d = 50t.' }, + { kind: 'concept', head: 'The equation is the rule', body: 'd = 50t says: whatever t is, multiply by 50 to get d. Plug in t = 1, 2, 3 and you get d = 50, 100, 150 — a whole table of matching pairs. One little equation holds them all.' }, + { kind: 'example', head: 'Plug in: y = 3x when x = 5', body: 'Substitute x = 5 into the rule.\ny = 3 × 5 = 15.\nAnswer: y = 15.' }, + { kind: 'example', head: 'Adding rule: y = x + 4 when x = 10', body: 'Substitute x = 10.\ny = 10 + 4 = 14.\nAnswer: y = 14.' }, + { kind: 'example', head: 'Road trip: d = 60t for 2 hours', body: 'The car goes 60 miles each hour, and t = 2.\nd = 60 × 2 = 120.\nAnswer: 120 miles in 2 hours.' }, + { kind: 'example', head: 'Ticket cost: c = 5n for 4 tickets', body: 'Each ticket costs $5, and n = 4 tickets.\nc = 5 × 4 = 20.\nAnswer: $20. The cost depends on the number of tickets.' }, + { kind: 'example', head: 'Build a table: y = 2x', body: 'Plug in x = 1, 2, 3 one at a time.\nx = 1 → y = 2. x = 2 → y = 4. x = 3 → y = 6.\nEvery time x grows by 1, y grows by 2 — that\'s the rule showing itself.' }, + { kind: 'protip', head: 'Ask: which one would I choose?', body: 'To spot the independent variable, ask: "Which one do I pick or control?" You choose how many hours to drive — you don\'t choose the distance, it just happens. The chosen one is independent; the result is dependent.' }, + { kind: 'trap', head: 'Trap: mixing up the two variables', body: 'Kids often call distance independent because it feels important. But distance RESPONDS to time — it\'s the dependent one. Hint: the dependent variable usually sits alone on one side, like the d in d = 50t.' }, + { kind: 'summary', head: 'Driver, responder, rule', body: 'The independent variable is the one you choose (like time); the dependent variable responds (like distance). The equation is the rule: plug in the independent value to get the dependent one. The lonely variable on one side is the dependent one.' }, + ], + '6.EE-7': [ + { kind: 'objective', head: 'Name the parts of an expression', body: 'Today you will learn expression anatomy: terms, coefficients, and constants. Knowing the parts by name makes every algebra move easier. It\'s like learning the positions on a soccer team.' }, + { kind: 'concept', head: 'Terms are the chunks', body: 'A TERM is one piece of an expression, separated by + or − signs. In 4x + 7, the terms are 4x and 7. Count the chunks between the plus and minus signs and you\'ve counted the terms.' }, + { kind: 'concept', head: 'The coefficient rides in front', body: 'A COEFFICIENT is the number multiplied by a variable — the number stuck to its front. In 4x, the coefficient is 4. If a variable stands alone, like x, its coefficient is a hidden 1.' }, + { kind: 'concept', head: 'The constant stands alone', body: 'A CONSTANT is a term with no variable attached — just a plain number. In 7 + 3x, the constant is 7. It never changes, no matter what x is — that\'s why it\'s called constant.' }, + { kind: 'concept', head: 'Simplify BEFORE you count', body: 'Expressions can hide parts in plain sight. 5x − 2 + 3 looks like three terms, but −2 and 3 combine into +1. Always merge like terms first — THEN name and count the parts.' }, + { kind: 'example', head: 'Coefficient of y in 4y', body: 'The coefficient is the number stuck to the variable.\nIn 4y, that number is 4.\nAnswer: 4.' }, + { kind: 'example', head: 'Constant in 7 + 3x', body: 'Look for the term with NO variable.\n3x has a variable, but 7 stands alone.\nAnswer: the constant is 7.' }, + { kind: 'example', head: 'Name every part of 5x + 8', body: 'Terms: 5x and 8 — two chunks split by the + sign.\nCoefficient: 5, the number in front of x.\nConstant: 8, the term with no variable.' }, + { kind: 'example', head: 'Hidden coefficient: x + 9', body: 'The x looks like it has no number — but x means 1x.\nSo the coefficient is 1, and the constant is 9.\nAnswer: coefficient 1, constant 9.' }, + { kind: 'example', head: 'Count the terms in 5x − 2 + 3', body: 'Simplify first! The constants −2 and 3 combine: −2 + 3 = 1.\nThat leaves 5x + 1.\nAnswer: 2 terms, not 3.' }, + { kind: 'protip', head: 'Underline each term first', body: 'Before answering any "parts" question, underline each chunk between the + and − signs. Then label each one: coefficient, variable, or constant. Labeling first makes every question about parts a quick read-off.' }, + { kind: 'trap', head: 'Trap: counting before simplifying', body: 'In 5x − 2 + 3, kids count three terms and move on. But −2 + 3 = 1, so it\'s really 5x + 1 — just two terms. Hidden like-terms can fool you: ALWAYS simplify before counting parts.' }, + { kind: 'summary', head: 'Terms, coefficients, constants', body: 'Terms are the chunks split by + and −. The coefficient is the number in front of a variable (a lone x means 1x). The constant is the plain number with no variable. Simplify first, then name the parts!' }, + ], + '6.EE-8': [ + { kind: 'objective', head: 'Test it like a detective', body: 'Today you will check whether two expressions are equivalent, and whether a value truly solves an equation. Your tool is substitution — plug in a number and see if the math agrees. No guessing, just evidence.' }, + { kind: 'concept', head: 'Equivalent means ALWAYS equal', body: 'Two expressions are EQUIVALENT if they give the same value for EVERY choice of the variable — not just one lucky match. 2(x + 3) and 2x + 6 agree at x = 1, 5, 100 … every value. That\'s true equivalence.' }, + { kind: 'concept', head: 'The quick substitution test', body: 'Pick an easy value like x = 2 or x = 10 and evaluate both expressions. Different answers? Definitely NOT equivalent — case closed. Same answers? Good sign, but use algebra (like distributing) to be sure.' }, + { kind: 'concept', head: 'A solution makes both sides equal', body: 'A value is a SOLUTION to an equation if plugging it in makes both sides match. For x + 5 = 9, try x = 4: does 4 + 5 equal 9? Yes — so 4 is a solution.' }, + { kind: 'example', head: 'Check a solution: x + 5 = 9, x = 4', body: 'Substitute: 4 + 5 = 9?\nCompute the left side: 4 + 5 = 9. Both sides say 9. ✓\nAnswer: yes, x = 4 is a solution.' }, + { kind: 'example', head: 'Catch a fake: 2x = 8, x = 3', body: 'Substitute: 2 × 3 = 8?\nLeft side: 2 × 3 = 6, but the right side says 8.\n6 ≠ 8, so no — x = 3 is NOT a solution.' }, + { kind: 'example', head: 'Check: x − 3 = 2, x = 5', body: 'Substitute: 5 − 3 = 2?\nLeft side: 5 − 3 = 2. Both sides match. ✓\nAnswer: yes, x = 5 is a solution.' }, + { kind: 'example', head: 'Equivalent? 2x + 6 vs 2(x + 3)', body: 'Distribute the 2: 2 × x = 2x, and 2 × 3 = 6.\nSo 2(x + 3) = 2x + 6 — the exact same expression.\nAnswer: yes, equivalent for every x.' }, + { kind: 'example', head: 'Equivalent? 3(x + 2) vs 3x + 6', body: 'Distribute: 3 × x = 3x, and 3 × 2 = 6, giving 3x + 6.\nQuick test at x = 2: 3(2 + 2) = 3 × 4 = 12, and 3(2) + 6 = 6 + 6 = 12. Match!\nAnswer: yes, equivalent.' }, + { kind: 'example', head: 'NOT equivalent: 2x vs x + 2', body: 'Test x = 2: 2 × 2 = 4, and 2 + 2 = 4 — they match! But test x = 5: 2 × 5 = 10, and 5 + 2 = 7.\n10 ≠ 7, so they disagree.\nAnswer: not equivalent — one match was just luck.' }, + { kind: 'protip', head: 'One mismatch settles it forever', body: 'To PROVE two expressions are not equivalent, you only need ONE value where they differ. But matching once proves nothing — 2x and x + 2 agree at x = 2 and nowhere else. Match once, then confirm with algebra.' }, + { kind: 'trap', head: 'Trap: one lucky match', body: 'Kids test one value, see a match, and declare "equivalent!" But 2x and x + 2 both give 4 at x = 2 — and then split apart everywhere else. Expressions can match at ONE value and still differ; use the algebra to be sure.' }, + { kind: 'summary', head: 'Substitute and verify', body: 'Equivalent expressions match for EVERY value, not just one — distribute or combine terms to prove it. A solution makes both sides of an equation equal when you plug it in. One mismatch proves "not equivalent"; one match proves nothing.' }, + ], + '6.EE-9': [ + { kind: 'objective', head: 'From story to equation to answer', body: 'Today you will turn word problems into equations and solve them. Three steps: name the unknown, translate the words, solve with opposites. Stories become math you already know how to crush.' }, + { kind: 'concept', head: 'Step 1: name the mystery', body: 'Find what the problem is asking for and give it a letter. "Let w = the number of weeks" or "let x = the number." Writing the "let" statement down keeps you from losing track of what x even means.' }, + { kind: 'concept', head: 'Step 2: translate phrase by phrase', body: 'Use the dictionary: "sum of" → +, "product of" → ×, and the word "is" or "equals" → =. "A number plus 6 is 14" becomes x + 6 = 14. Translate one phrase at a time, left to right.' }, + { kind: 'concept', head: 'Watch out for "less than"', body: '"Less than" flips the order of what you hear. "n less than 12" means start with 12 and take n away: 12 − n. The thing being subtracted comes FIRST in the words but SECOND in the math.' }, + { kind: 'concept', head: 'Step 3: solve with opposites', body: 'Once you have the equation, solve it like any one-step equation. Undo adding with subtracting, undo multiplying with dividing — always to BOTH sides. Then reread the story to make sure your answer makes sense.' }, + { kind: 'example', head: 'Write it: saving $25 a week', body: 'Marcos saves $25 per week for w weeks. Total saved?\nTotal = amount per week × number of weeks = 25 × w.\nAnswer: 25w dollars.' }, + { kind: 'example', head: 'Write it: n less than 12', body: '"Less than" flips the order — start with 12.\nTake n away from it.\nAnswer: 12 − n (NOT n − 12).' }, + { kind: 'example', head: 'Translate: a number plus 6 equals 14', body: 'Let the number be x.\n"Plus 6" → x + 6, and "equals 14" → = 14.\nAnswer: x + 6 = 14.' }, + { kind: 'example', head: 'Now solve it: x + 6 = 14', body: 'Undo the +6 by subtracting 6 from both sides.\nx = 14 − 6 = 8.\nAnswer: x = 8. Check: 8 + 6 = 14. ✓' }, + { kind: 'example', head: 'Full story: 3 packs, 21 cards', body: 'Three equal packs hold 21 cards total. Cards per pack?\nLet x = cards per pack, so 3x = 21. Divide both sides by 3: x = 21 ÷ 3 = 7.\nAnswer: 7 cards per pack. Check: 3 × 7 = 21. ✓' }, + { kind: 'protip', head: 'Reread with your answer inside', body: 'After solving, read the story again with your number plugged in: "Marcos saves $25 a week for 4 weeks — that\'s $100." If the sentence sounds right, your equation was right. If it sounds silly, recheck your translation.' }, + { kind: 'trap', head: 'Trap: "less than" in the wrong order', body: '"n less than 12" is 12 − n, NOT n − 12. Kids write the numbers in the order they hear them — but "less than" reverses that order. Slow down whenever you spot those two words.' }, + { kind: 'trap', head: 'Trap: solving without a "let" statement', body: 'Skipping "let x = …" is how answers get lost. You might solve perfectly and forget whether x was weeks, dollars, or cards. Write what x stands for FIRST, so your final answer means something.' }, + { kind: 'summary', head: 'Name it, translate it, solve it', body: 'Name the unknown with a "let" statement. Translate word by word: "sum" → +, "product" → ×, "is" → =, and remember "less than" flips the order. Solve with opposite operations, then reread the story to check your answer fits.' }, + ], + '6.EE-10': [ + { kind: 'objective', head: 'Tables that tell a story', body: 'Today you will use equations to fill in tables and spot the rule hiding in the numbers. Equations make tables, and tables reveal equations. It works in both directions!' }, + { kind: 'concept', head: 'One x in, one y out', body: 'An equation like y = 4x is a machine: feed in an x, get out exactly one y. Plug in x = 1, 2, 3 and the machine prints a table row for each. Every x has one matching y.' }, + { kind: 'concept', head: 'The rule shows in the steps', body: 'Read down a table and watch how y changes when x grows by 1. In y = 4x, every step adds 4 to y: 4, 8, 12, 16. A steady step size is the rule waving at you.' }, + { kind: 'concept', head: 'Finding the rule from pairs', body: 'Given pairs like (1, 5), (2, 10), (3, 15), ask: "What do I do to x to get y?" Here each y is exactly 5 times its x. Test your guess on EVERY pair before writing y = 5x.' }, + { kind: 'example', head: 'Plug in: y = 4x when x = 6', body: 'Substitute x = 6 into the machine.\ny = 4 × 6 = 24.\nAnswer: y = 24.' }, + { kind: 'example', head: 'Fill a table: y = x + 3', body: 'Plug in x = 1, 2, 3 one at a time.\nx = 1 → 1 + 3 = 4. x = 2 → 2 + 3 = 5. x = 3 → 3 + 3 = 6.\nAnswer: y = 4, 5, 6 — each row is just x plus 3.' }, + { kind: 'example', head: 'Find the rule: (1, 3), (2, 6), (3, 9)', body: 'Compare each y to its x: 3 = 3 × 1, 6 = 3 × 2, 9 = 3 × 3.\nEvery y is 3 times its x — the rule holds for all three pairs.\nAnswer: y = 3x.' }, + { kind: 'example', head: 'Find the rule: (1, 5), (2, 10), (3, 15)', body: 'Test "multiply by 5": 5 × 1 = 5 ✓, 5 × 2 = 10 ✓, 5 × 3 = 15 ✓.\nThe guess works on every pair.\nAnswer: y = 5x.' }, + { kind: 'example', head: 'Two-step rule: y = 2x + 1 at x = 4', body: 'Substitute: y = 2 × 4 + 1.\nMultiply first: 2 × 4 = 8. Then add: 8 + 1 = 9.\nAnswer: y = 9.' }, + { kind: 'example', head: 'Read a table: what is y when x = 3?', body: 'A table shows x: 1, 2, 3 with y: 6, 12, 18.\nFind x = 3 in the x column, then slide across to ITS row.\nAnswer: y = 18 (and the rule is y = 6x).' }, + { kind: 'protip', head: 'Try "multiply" first, then "add"', body: 'Hunting for a rule? First test whether y is x times some number — check if y ÷ x is the same for every pair. If not, test whether y is x plus some number. Those two checks crack most sixth-grade tables.' }, + { kind: 'trap', head: 'Trap: reading the wrong row', body: 'Each x belongs to the y in ITS OWN row — don\'t grab a neighbor\'s y or swap the columns. Slide your finger straight across from x to y every time. One row slip turns a right answer wrong.' }, + { kind: 'summary', head: 'Machines, tables, rules', body: 'An equation is a machine: plug in each x to fill the table with matching y values. Spot the rule by checking how y changes as x grows by 1, and test your rule on EVERY pair. Read straight across each row — x and y are partners.' }, + ], +}; diff --git a/src/data/lessonSlides/f5.ts b/src/data/lessonSlides/f5.ts new file mode 100644 index 0000000..58ebcc2 --- /dev/null +++ b/src/data/lessonSlides/f5.ts @@ -0,0 +1,93 @@ +import type { SlideBank } from './types'; + +// 5.F — Grade-5 Foundations. 12–14 slides per lesson, ~3 short sentences each, +// written for a 10–12-year-old: objective → concepts → simplest-to-fuller +// examples → pro tip → trap(s) → summary. +export const F5_SLIDES: SlideBank = { + '5.F-1': [ + { kind: 'objective', head: 'Big numbers, no fear', body: 'Today you will read place value like a pro. Then you will multiply and divide BIG numbers by breaking them into easy chunks. No calculator needed!' }, + { kind: 'concept', head: 'Every place is worth 10× more', body: 'In a number, each place is 10 times the place to its right. Ones, tens, hundreds, thousands — each step left multiplies by 10. So the 7 in 47,283 is not just 7 — it is 7 THOUSAND.' }, + { kind: 'concept', head: 'Multiplying big? Break it apart', body: 'You never have to multiply a big number all at once. Split one number into tens and ones: 38 × 27 becomes 38 × 20 plus 38 × 7. Do two easy multiplications, then add the pieces.' }, + { kind: 'concept', head: 'Dividing big? Peel off easy chunks', body: 'Division is just asking "how many fit?" Peel off friendly chunks: for 504 ÷ 8, first take 480 ÷ 8 = 60. Then the leftover 24 ÷ 8 = 3, so the answer is 63.' }, + { kind: 'example', head: 'Start simple: the value of a digit', body: 'What is the 5 worth in 4,562?\nCount the places from the right: 2 ones, 6 tens, 5 hundreds. The 5 sits in the hundreds place. So it is worth 5 × 100 = 500.' }, + { kind: 'example', head: 'One more digit: 28,514', body: 'What is the 8 worth in 28,514?\nPlaces from the right: 4 ones, 1 ten, 5 hundreds, 8 thousands. The 8 is in the thousands place. Its value is 8 × 1,000 = 8,000.' }, + { kind: 'example', head: 'Easy multiply: 60 × 40', body: 'Multiply the front digits first: 6 × 4 = 24. Now attach the zeros you set aside — one from 60 and one from 40. That gives 2,400. Zeros ride along for free!' }, + { kind: 'example', head: 'Bigger multiply: 24 × 13', body: 'Break 13 into 10 + 3. First: 24 × 10 = 240. Then: 24 × 3 = 72. Add the pieces: 240 + 72 = 312.' }, + { kind: 'example', head: 'Divide in chunks: 432 ÷ 6', body: 'Look for a friendly chunk: 6 × 70 = 420, which is close to 432. The leftover is 432 − 420 = 12, and 12 ÷ 6 = 2. Stack the chunks: 70 + 2 = 72.' }, + { kind: 'protip', head: 'Estimate first, always', body: 'Before you compute, round and guess: 24 × 13 is close to 24 × 10 = 240, so the real answer should be a bit more. If your final answer is wildly different from your estimate, you know to re-check. Great mathematicians estimate FIRST.' }, + { kind: 'trap', head: 'Trap: reading the digit alone', body: 'The 5 in 4,562 is NOT worth 5. A digit\'s value depends on its PLACE — that 5 is worth 500. Always ask "what place is it in?" before you answer.' }, + { kind: 'trap', head: 'Trap: forgetting a piece', body: 'When you split 24 × 13 into 24 × 10 and 24 × 3, you must ADD BOTH pieces. Stopping at 240 is the most common mistake. Break apart, multiply each piece, then add them all.' }, + { kind: 'summary', head: 'You\'ve got big numbers handled', body: 'Place value: each spot is worth 10× the one to its right. Multiply by breaking numbers into tens and ones, then adding the pieces. Divide by peeling off easy chunks. Estimate first to catch mistakes!' }, + ], + '5.F-2': [ + { kind: 'objective', head: 'Adding fractions that don\'t match', body: 'Today you will add and subtract fractions — even when the bottoms (denominators) are different. The whole secret is making the pieces the same size first.' }, + { kind: 'concept', head: 'Only same-size pieces combine', body: 'You can\'t add 1 slice of a pizza cut in halves to 1 slice cut in thirds — the pieces are different sizes! Fractions work the same way. You may only add or subtract when the denominators MATCH.' }, + { kind: 'concept', head: 'Make a common denominator', body: 'Rewrite each fraction so both have the same bottom number. Pick a number both denominators divide into — often their least common multiple. For 2 and 3, that number is 6.' }, + { kind: 'concept', head: 'Then add just the tops', body: 'Once the bottoms match, the pieces are the same size. Add or subtract ONLY the numerators — the denominator stays put. Finish by simplifying if you can.' }, + { kind: 'example', head: 'Warm-up: same bottoms already', body: '1/4 + 1/4 = ?\nThe pieces are already the same size (fourths). Add the tops: 1 + 1 = 2, so you get 2/4. Simplify: 2/4 = 1/2.' }, + { kind: 'example', head: 'Subtract with same bottoms', body: '5/8 − 1/8 = ?\nEighths minus eighths — same size, so just subtract tops: 5 − 1 = 4. That gives 4/8. Simplify by dividing top and bottom by 4: 1/2.' }, + { kind: 'example', head: 'Different bottoms: 1/2 + 1/3', body: 'Halves and thirds are different sizes, so rewrite both in sixths. 1/2 = 3/6 and 1/3 = 2/6. Now add the tops: 3/6 + 2/6 = 5/6.' }, + { kind: 'example', head: 'Subtract: 3/4 − 1/2', body: 'Rewrite 1/2 as fourths: 1/2 = 2/4. Now both are fourths: 3/4 − 2/4. Subtract tops: 3 − 2 = 1, so the answer is 1/4.' }, + { kind: 'example', head: 'Answer bigger than 1: 2/3 + 3/4', body: 'The common denominator of 3 and 4 is 12. Rewrite: 2/3 = 8/12 and 3/4 = 9/12. Add: 8/12 + 9/12 = 17/12, which is 1 whole and 5/12 — written 1 5/12.' }, + { kind: 'protip', head: 'Multiply the bottoms in a pinch', body: 'Can\'t spot the least common multiple? Just multiply the two denominators — it ALWAYS works as a common denominator. For 1/2 + 1/3 that gives sixths right away. You might simplify at the end, and that\'s fine.' }, + { kind: 'trap', head: 'Trap: adding the bottoms', body: '1/2 + 1/3 is NOT 2/5! Never add denominators — they tell you the SIZE of the pieces, not how many you have. Make the sizes match first, then add only the tops.' }, + { kind: 'summary', head: 'Same size, then combine', body: 'Fractions only add or subtract when the denominators match. Rewrite with a common denominator, combine the numerators, and simplify. That one habit makes every fraction problem doable.' }, + ], + '5.F-3': [ + { kind: 'objective', head: 'Multiply & divide fractions', body: 'Today you will multiply fractions straight across, use "of" as multiply, and divide by asking "how many fit?". These three moves unlock a huge amount of math.' }, + { kind: 'concept', head: 'Multiply straight across', body: 'To multiply two fractions, multiply the tops together and the bottoms together. 1/2 × 1/4: tops 1 × 1 = 1, bottoms 2 × 4 = 8. Then simplify if you can.' }, + { kind: 'concept', head: '"Of" means multiply', body: 'When a question says "3/5 OF 40", that word "of" means multiply: 3/5 × 40. Finding a fraction of something is always multiplication. This shows up in shopping, recipes, and games constantly.' }, + { kind: 'concept', head: 'Dividing asks "how many fit?"', body: '4 ÷ 1/3 asks: how many thirds fit inside 4 wholes? Each whole holds 3 thirds, so 4 wholes hold 4 × 3 = 12. Dividing by a fraction usually makes the answer BIGGER.' }, + { kind: 'example', head: 'Simplest multiply: 1/2 × 1/4', body: 'Tops: 1 × 1 = 1. Bottoms: 2 × 4 = 8. Answer: 1/8 — half of a quarter is an eighth, like cutting a quarter-slice of toast in half.' }, + { kind: 'example', head: 'Another: 1/3 × 1/2', body: 'Tops: 1 × 1 = 1. Bottoms: 3 × 2 = 6. So 1/3 × 1/2 = 1/6 — a third of a half is a sixth.' }, + { kind: 'example', head: 'Fraction of a number: 2/3 of 12', body: 'First find 1/3 of 12: that\'s 12 ÷ 3 = 4. You want TWO thirds, so double it: 2 × 4 = 8. Divide by the bottom, multiply by the top!' }, + { kind: 'example', head: 'Divide: 6 ÷ 1/2', body: 'How many halves fit inside 6 wholes? Each whole holds 2 halves. So 6 × 2 = 12 halves fit. Notice the answer got bigger!' }, + { kind: 'example', head: 'Divide: 3 ÷ 1/4', body: 'How many quarters fit in 3 wholes? Each whole holds 4 quarters, so 3 × 4 = 12. Twelve quarter-pieces fit inside 3 wholes.' }, + { kind: 'protip', head: 'Flip and multiply', body: 'Dividing by a fraction = multiplying by its reciprocal (the flip). 6 ÷ 1/2 = 6 × 2/1 = 12. Flip the SECOND fraction only, then multiply straight across.' }, + { kind: 'trap', head: 'Trap: expecting division to shrink', body: 'With whole numbers, dividing makes things smaller — but dividing BY a fraction makes them bigger! 6 ÷ 1/2 = 12, not 3. If you\'re splitting into pieces smaller than 1, MORE pieces fit.' }, + { kind: 'summary', head: 'Three moves to remember', body: 'Multiply fractions straight across (tops × tops, bottoms × bottoms). "Of" means multiply. Divide by a fraction by flipping it and multiplying — the answer grows because small pieces fit many times.' }, + ], + '5.F-4': [ + { kind: 'objective', head: 'Decimals, decoded', body: 'Today you will compare, add, subtract, and multiply decimals. The secret weapon: line up the decimal points and give numbers the same number of places.' }, + { kind: 'concept', head: 'Line up the points', body: 'To add or subtract decimals, stack them with the decimal points in a straight line. 2.5 is the same as 2.50 — you can add zeros on the right for free. Then add or subtract like normal numbers.' }, + { kind: 'concept', head: 'Compare with equal places', body: 'Which is bigger, 0.5 or 0.45? Give both two places: 0.50 vs 0.45. Now it\'s obvious: 50 hundredths beats 45 hundredths.' }, + { kind: 'concept', head: 'Multiplying: count the places', body: 'Multiply decimals as if they were whole numbers, then place the point. Count the decimal places in both factors and give the answer that many. Tenths × tenths = hundredths.' }, + { kind: 'example', head: 'Add: 0.2 + 0.35', body: 'Give both two places: 0.20 + 0.35. Line up the points and add: 20 + 35 = 55 hundredths. Answer: 0.55.' }, + { kind: 'example', head: 'Add: 0.3 + 0.45', body: 'Write 0.3 as 0.30 so both have two places. 0.30 + 0.45 = 0.75. Lining up the points keeps tenths with tenths and hundredths with hundredths.' }, + { kind: 'example', head: 'Subtract: 2 − 0.85', body: 'Count UP from 0.85 instead of borrowing. From 0.85 to 1 is 0.15. From 1 to 2 is 1 more. Total: 1.15.' }, + { kind: 'example', head: 'Multiply: 0.5 × 0.8', body: 'Ignore the points: 5 × 8 = 40. Count decimal places: one in 0.5, one in 0.8 — two total. Place the point two spots in: 0.40, which is 0.4.' }, + { kind: 'example', head: 'Multiply: 1.5 × 4', body: 'Break it apart: 1 × 4 = 4, and 0.5 × 4 = 2. Add the pieces: 4 + 2 = 6. A whole-number multiplier just scales each part.' }, + { kind: 'protip', head: 'Money is decimals in disguise', body: 'Think of decimals as dollars and cents: 0.5 is 50 cents, 0.45 is 45 cents. Comparing or adding money feels natural — use that instinct on any decimal problem.' }, + { kind: 'trap', head: 'Trap: "longer means bigger"', body: '0.45 has more digits than 0.5, but it is SMALLER. Length tells you nothing — place value does. Pad to equal places (0.50 vs 0.45) and then compare.' }, + { kind: 'summary', head: 'Points lined up, places counted', body: 'Add and subtract with decimal points aligned (pad with zeros). Compare by giving equal places. Multiply as whole numbers, then count decimal places to set the point. Money sense is your friend!' }, + ], + '5.F-5': [ + { kind: 'objective', head: 'Convert units & measure space', body: 'Today you will convert between units (meters ↔ centimeters, feet ↔ inches) and find the volume of boxes. One rule decides multiply-or-divide every time.' }, + { kind: 'concept', head: 'Big → small: multiply', body: 'Going from a bigger unit to a smaller one means MORE pieces, so multiply. 3 meters = 3 × 100 = 300 centimeters. One big thing becomes many small things.' }, + { kind: 'concept', head: 'Small → big: divide', body: 'Going from a smaller unit to a bigger one means FEWER pieces, so divide. 400 cm = 400 ÷ 100 = 4 meters. Many small things bundle into few big things.' }, + { kind: 'concept', head: 'Memorize the anchors', body: 'A few conversions unlock everything: 100 cm = 1 m, 1,000 g = 1 kg, 12 in = 1 ft, 4 qt = 1 gal, 60 min = 1 hr. Learn these five and you can convert almost anything.' }, + { kind: 'concept', head: 'Volume = length × width × height', body: 'Volume measures how much SPACE fills a box, counted in little cubes. Multiply the three edge lengths: a 3 × 2 × 4 box holds 24 unit cubes. Volume answers are in CUBIC units.' }, + { kind: 'example', head: 'Convert: 2 m to cm', body: 'Meters are bigger than centimeters, so multiply. 1 m = 100 cm. 2 × 100 = 200 cm.' }, + { kind: 'example', head: 'Convert: 5 ft to inches', body: 'Feet are bigger than inches, so multiply. 1 ft = 12 in. 5 × 12 = 60 inches.' }, + { kind: 'example', head: 'Convert back: 400 cm to m', body: 'Centimeters are smaller than meters, so divide. 100 cm make 1 m. 400 ÷ 100 = 4 meters.' }, + { kind: 'example', head: 'Volume of a 3 × 2 × 4 box', body: 'Multiply the edges one pair at a time: 3 × 2 = 6. Then 6 × 4 = 24. The box holds 24 cubic units.' }, + { kind: 'example', head: 'Volume of a cube, edge 3', body: 'A cube has equal edges, so volume = 3 × 3 × 3. That\'s 9 × 3 = 27. Answer: 27 cubic units.' }, + { kind: 'protip', head: 'Sanity-check the direction', body: 'After converting, ask: should my number be bigger or smaller? Converting 2 m to cm should give a BIGGER number (200) because centimeters are tiny. If the direction feels wrong, you multiplied when you should have divided.' }, + { kind: 'trap', head: 'Trap: volume vs area', body: 'Area covers a FLAT surface (2 lengths multiplied, square units). Volume fills a 3-D box (3 lengths, CUBIC units). If a question says "how much fits inside", it wants volume — don\'t stop after multiplying just two edges.' }, + { kind: 'summary', head: 'Direction and dimensions', body: 'Big unit → small unit: multiply. Small → big: divide. Keep the five anchor conversions memorized. Volume = length × width × height in cubic units. Always sanity-check which direction your number should move!' }, + ], + '5.F-6': [ + { kind: 'objective', head: 'Points, patterns & plots', body: 'Today you will plot points on the coordinate plane, extend number patterns with a rule, and read line plots. Three skills, one theme: reading math pictures.' }, + { kind: 'concept', head: 'Run before you jump', body: 'A point (x, y) gives two directions from the origin: go ACROSS x first, then UP y. Remember "run before you jump". (3, 2) means run 3, jump 2.' }, + { kind: 'concept', head: 'Patterns have a jump rule', body: 'In a pattern like 0, 4, 8, 12 … each term jumps by the same amount (+4). The n-th term = start + jump × (n − 1). You can leap straight to term 100 without listing them all!' }, + { kind: 'concept', head: 'Line plots: every X counts', body: 'A line plot stacks an X for each data value above a number line. Two Xs above 1/2 means two things measured 1/2. To answer questions, just count Xs.' }, + { kind: 'example', head: 'Plot a point: right 3, up 2', body: 'Start at the origin (0, 0). Run right 3 → x = 3. Jump up 2 → y = 2. The point is (3, 2).' }, + { kind: 'example', head: 'Name the point: right 4, up 2', body: 'Across first: x = 4. Up second: y = 2. Write it (x, y) = (4, 2). Order matters — (4, 2) and (2, 4) are DIFFERENT points!' }, + { kind: 'example', head: 'Extend a pattern: 5, 10, 15, …', body: 'Find the jump: 10 − 5 = 5, so each term adds 5. The next term after 15 is 15 + 5 = 20.' }, + { kind: 'example', head: 'Leap ahead: 0, 4, 8 … term 5?', body: 'Start 0, jump +4. Term 5 makes four jumps from the start: 0 + 4 × 4 = 16. The rule start + jump × (n − 1) skips the counting.' }, + { kind: 'example', head: 'Read a line plot', body: 'A line plot shows 2 Xs above 1/2. Each X is one measured item. So 2 items measured exactly 1/2.' }, + { kind: 'protip', head: 'Check the jump twice', body: 'Before extending a pattern, compute the jump from TWO different pairs: 10 − 5 and 15 − 10. If both give the same jump, your rule is solid. Patterns with changing jumps need a different rule.' }, + { kind: 'trap', head: 'Trap: jumping before you run', body: 'The #1 coordinate mistake is going UP first. (3, 2) means across 3 THEN up 2 — not up 3. Say "run before you jump" every time you plot.' }, + { kind: 'summary', head: 'Pictures you can read', body: 'Points: run x, then jump y. Patterns: find the constant jump, then use start + jump × (n − 1). Line plots: each X is one data value — count them. Math pictures answer questions fast once you know the code!' }, + ], +}; diff --git a/src/data/lessonSlides/g.ts b/src/data/lessonSlides/g.ts new file mode 100644 index 0000000..aca1eea --- /dev/null +++ b/src/data/lessonSlides/g.ts @@ -0,0 +1,163 @@ +import type { SlideBank } from './types'; + +// 6.G — Geometry. 12–14 slides per lesson, ~3 short sentences each, +// written for a 10–12-year-old: objective → concepts → simplest-to-fuller +// examples → pro tip → trap(s) → summary. +export const G_SLIDES: SlideBank = { + '6.G-1': [ + { kind: 'objective', head: 'Area: pick the right formula', body: 'Today you will find the area of rectangles and triangles. Two formulas do all the work. The trick is knowing which one to grab — and never forgetting the ½.' }, + { kind: 'concept', head: 'Area counts unit squares', body: 'Area asks: how many 1-by-1 squares cover this shape? A rectangle answers that fast: area = length × width. A 7-by-3 rectangle holds 7 squares in each of 3 rows.' }, + { kind: 'concept', head: 'A triangle is half a rectangle', body: 'Draw a rectangle around a triangle and the triangle fills exactly HALF of it. That\'s why triangle area = ½ × base × height. Same numbers as a rectangle, then cut in half.' }, + { kind: 'concept', head: 'Height stands straight up', body: 'The height is NOT a slanted side. It must meet the base at a right angle — perpendicular, like a flagpole on flat ground. On a tilted triangle, the height can even be a dashed line drawn inside or outside.' }, + { kind: 'example', head: 'Rectangle 7 by 3', body: 'Area = length × width.\n7 × 3 = 21.\nThe answer is 21 square units — picture 3 rows of 7 little squares.' }, + { kind: 'example', head: 'Triangle: base 8, height 5', body: 'Area = ½ × base × height.\n½ × 8 × 5 → take half of 8 first: 4. Then 4 × 5 = 20.\nAnswer: 20 square units.' }, + { kind: 'example', head: 'Triangle: base 10, height 4', body: '½ × 10 × 4.\nHalf of 10 is 5, and 5 × 4 = 20.\nAnswer: 20 square units.' }, + { kind: 'example', head: 'Rectangle 6 by 9', body: 'Area = 6 × 9.\nThink 6 × 9 = 54 — that\'s 6 rows of 9 squares.\nAnswer: 54 square units.' }, + { kind: 'example', head: 'Triangle: base 12, height 5', body: '½ × 12 × 5.\nHalf of 12 is 6. Then 6 × 5 = 30.\nAnswer: 30 square units.' }, + { kind: 'example', head: 'Odd numbers? Halve the easy one', body: 'Triangle with base 7 and height 6.\n½ × 7 × 6 → halve the EVEN number: half of 6 is 3.\nThen 7 × 3 = 21 square units.' }, + { kind: 'protip', head: 'Halve whichever number is even', body: 'For ½ × base × height, you can take half of the base OR the height — pick the even one so you avoid fractions. ½ × 7 × 6 is easiest as 7 × 3. The answer comes out the same either way.' }, + { kind: 'trap', head: 'Trap: forgetting the ½', body: 'Base 8, height 5 does NOT give area 40 for a triangle — that\'s the rectangle\'s area. A triangle is only HALF of that box: 20. The moment you see the word triangle, write the ½ down first.' }, + { kind: 'trap', head: 'Trap: using the slanted side', body: 'Some triangles show three numbers, and kids grab the slanted side as the height. The height must be perpendicular to the base — it makes a square corner. If a side leans, it\'s not the height.' }, + { kind: 'summary', head: 'Two formulas, one warning', body: 'Rectangle: area = length × width. Triangle: area = ½ × base × height, with a height that stands straight up from the base. Write the ½ FIRST for triangles and you\'ll never lose it.' }, + ], + '6.G-2': [ + { kind: 'objective', head: 'Shapes on the grid', body: 'Today you will find side lengths of polygons using their coordinates. No ruler needed — just subtraction! Then you\'ll use those lengths to find perimeter and area.' }, + { kind: 'concept', head: 'Plot the corners in order', body: 'A polygon on the grid is given by its vertices — the corner points. Plot them in the order listed and connect the dots. Going in order keeps the sides from crossing.' }, + { kind: 'concept', head: 'Same x? It\'s a vertical side', body: 'If two points share the same x-value, like (2, 1) and (2, 6), the side goes straight up and down. Its length is the difference of the y-values: 6 − 1 = 5. You\'re just counting the steps up.' }, + { kind: 'concept', head: 'Same y? It\'s a horizontal side', body: 'If two points share the same y-value, like (1, 3) and (7, 3), the side runs left to right. Its length is the difference of the x-values: 7 − 1 = 6. Count the steps across.' }, + { kind: 'concept', head: 'Lengths feed the formulas', body: 'Once you know the side lengths, the grid disappears and it\'s a normal shape problem. Width × height gives a rectangle\'s area. Adding all the sides gives the perimeter.' }, + { kind: 'example', head: 'Vertical side: (2, 1) to (2, 6)', body: 'Both points have x = 2, so the side is vertical.\nSubtract the y-values: 6 − 1 = 5.\nThe side is 5 units long.' }, + { kind: 'example', head: 'Horizontal side: (1, 3) to (7, 3)', body: 'Both points have y = 3, so the side is horizontal.\nSubtract the x-values: 7 − 1 = 6.\nThe side is 6 units long.' }, + { kind: 'example', head: 'Rectangle area from corners', body: 'Corners: (0,0), (4,0), (4,2), (0,2).\nBottom side: 4 − 0 = 4 wide. Left side: 2 − 0 = 2 tall.\nArea = 4 × 2 = 8 square units.' }, + { kind: 'example', head: 'Crossing below zero', body: 'Distance from (3, −2) to (3, 5)?\nSame x, so subtract y-values: 5 − (−2) = 5 + 2 = 7.\nThe side is 7 units — count it: 2 steps up to zero, then 5 more.' }, + { kind: 'example', head: 'Square from one side', body: 'A square has a side from (0,0) to (5,0).\nThat side is 5 − 0 = 5 long, and a square\'s sides are all equal.\nArea = 5 × 5 = 25 square units.' }, + { kind: 'example', head: 'Perimeter from corners', body: 'Rectangle: (0,0), (6,0), (6,3), (0,3).\nWidth = 6, height = 3.\nPerimeter = 6 + 3 + 6 + 3 = 18 units around.' }, + { kind: 'protip', head: 'Sketch it, even roughly', body: 'A ten-second sketch beats staring at coordinates. Plot the points, connect them, and label each side\'s length as you find it. Mistakes practically point at themselves on a picture.' }, + { kind: 'trap', head: 'Trap: subtracting mismatched points', body: 'You can only subtract directly when the points share an x (vertical side) or share a y (horizontal side). If BOTH numbers differ, the side is slanted, and plain subtraction won\'t give its length. Check for the matching coordinate first.' }, + { kind: 'summary', head: 'Match, subtract, then compute', body: 'Same x → vertical side, subtract the y-values. Same y → horizontal side, subtract the x-values. Then feed those lengths into your area or perimeter formula. Sketch first and the grid does the measuring for you.' }, + ], + '6.G-3': [ + { kind: 'objective', head: 'How much fits in the box?', body: 'Today you will find the volume of rectangular prisms — box shapes. One formula does it: length × width × height. It even works when the edges are fractions!' }, + { kind: 'concept', head: 'Volume counts unit cubes', body: 'Volume asks: how many 1×1×1 cubes fill this box? A 2-by-3 floor holds 6 cubes, and stacking 5 layers gives 30. That\'s why volume = length × width × height.' }, + { kind: 'concept', head: 'Three numbers, cubic units', body: 'Area uses TWO lengths and comes out in square units. Volume uses THREE lengths and comes out in CUBIC units, like cm³. If you only multiplied two numbers, you found a floor, not a box.' }, + { kind: 'concept', head: 'Fractions are welcome', body: 'The formula doesn\'t care if an edge is ½ or 3¼ — multiply all three edges anyway. A box ½ unit tall simply holds half-height cubes. Multiply the whole numbers first, then bring in the fraction.' }, + { kind: 'example', head: 'Box 2 × 3 × 5', body: 'V = length × width × height.\n2 × 3 = 6, then 6 × 5 = 30.\nVolume = 30 cubic units — 6 cubes per layer, 5 layers.' }, + { kind: 'example', head: 'Cube with side 3', body: 'A cube has three equal edges.\n3 × 3 = 9, then 9 × 3 = 27.\nVolume = 27 cubic units.' }, + { kind: 'example', head: 'Box 4 × 2 × 3', body: '4 × 2 = 8.\n8 × 3 = 24.\nVolume = 24 cubic units.' }, + { kind: 'example', head: 'A fraction edge: ½ × 3 × 4', body: 'Multiply the whole numbers first: 3 × 4 = 12.\nThen take half: ½ × 12 = 6.\nVolume = 6 cubic units.' }, + { kind: 'example', head: 'Another fraction: ½ × 4 × 6', body: '4 × 6 = 24.\nHalf of 24 is 12.\nVolume = 12 cubic units — a ½-unit-tall box holds half as much as a 1-unit-tall one.' }, + { kind: 'example', head: 'Find the missing edge', body: 'A box has volume 40, length 4, and width 2. How tall is it?\n4 × 2 = 8, so height × 8 = 40.\n40 ÷ 8 = 5. The height is 5 units.' }, + { kind: 'protip', head: 'Multiply in any order', body: 'You can multiply the three edges in whatever order is easiest — the answer never changes. For 4 × 7 × 5, do 4 × 5 = 20 first, then 20 × 7 = 140. Hunt for pairs that make tens!' }, + { kind: 'trap', head: 'Trap: stopping at two numbers', body: 'Volume needs all THREE dimensions. Multiplying just 2 × 3 for a 2×3×5 box gives 6 — that\'s the area of one face, not the volume. Count your factors: three edges in, cubic units out.' }, + { kind: 'summary', head: 'Stack the layers', body: 'Volume = length × width × height, in cubic units. It works with fractions — multiply the whole numbers first, then apply the fraction. Three edges multiplied, every time.' }, + ], + '6.G-4': [ + { kind: 'objective', head: 'Unfold it: surface area', body: 'Today you will find the surface area of 3-D shapes — the total area of ALL their faces. The secret tool is a net: the shape unfolded flat like a cardboard box.' }, + { kind: 'concept', head: 'A net is a flattened solid', body: 'Cut a cereal box along its edges and flatten it out — that flat pattern is a NET. Every face of the box becomes a flat rectangle you can see all at once. Nets turn a 3-D problem into a bunch of easy 2-D ones.' }, + { kind: 'concept', head: 'Surface area = add the faces', body: 'Find the area of each face in the net, then add them all up. Surface area tells you how much wrapping paper covers the shape. Since it measures covering, the answer is in SQUARE units.' }, + { kind: 'concept', head: 'Boxes come in matching pairs', body: 'A rectangular box has 6 faces in 3 matching pairs: top & bottom, front & back, left & right. Find one of each pair, then double it. A cube is even friendlier — all 6 faces are identical squares.' }, + { kind: 'example', head: 'One face of a box', body: 'A box is 2 × 3 × 1. What\'s the area of its 2 × 3 face?\nJust multiply: 2 × 3 = 6.\nThat face is 6 square units.' }, + { kind: 'example', head: 'Cube with side 2', body: 'One face = 2 × 2 = 4.\nA cube has 6 identical faces.\n6 × 4 = 24 square units of surface area.' }, + { kind: 'example', head: 'Cube with side 3', body: 'One face = 3 × 3 = 9.\nSix faces: 6 × 9 = 54.\nSurface area = 54 square units.' }, + { kind: 'example', head: 'Cube with side 5', body: 'One face = 5 × 5 = 25.\n6 × 25 = 150.\nSurface area = 150 square units — enough paper to wrap the whole cube.' }, + { kind: 'example', head: 'A full box: 2 × 3 × 1', body: 'Three different faces: 2 × 3 = 6, 2 × 1 = 2, 3 × 1 = 3.\nEach comes in a pair, so add first: 6 + 2 + 3 = 11.\nDouble it: 2 × 11 = 22 square units.' }, + { kind: 'example', head: 'Count the faces in a net', body: 'A net for a box shows all its faces laid flat. Count them: top, bottom, front, back, left, right.\nThat\'s 6 faces.\nIf your net has more or fewer, a face got lost or doubled!' }, + { kind: 'protip', head: 'Make a face checklist', body: 'Before adding, list every face: top, bottom, front, back, left, right. Check each one off as you compute its area. The checklist catches the sneaky missing face every time.' }, + { kind: 'trap', head: 'Trap: computing volume instead', body: 'Multiplying all three edges (2 × 3 × 1 = 6) gives VOLUME, not surface area. Surface area adds up FACE areas and lives in square units. Ask yourself: am I filling the box, or wrapping it?' }, + { kind: 'summary', head: 'Unfold, compute, add', body: 'Unfold the solid into a net so every face is flat. Find each face\'s area and add them all — pairs make boxes fast, and a cube is 6 × (side × side). Surface area is wrapping, so it\'s always square units.' }, + ], + '6.G-5': [ + { kind: 'objective', head: 'Weird shapes? Slice them up!', body: 'Today you will find the area of composite figures — shapes built from rectangles and triangles glued together. Split, solve each piece, then add. Holes get subtracted.' }, + { kind: 'concept', head: 'Split into shapes you know', body: 'An L-shape or a house shape looks scary, but it\'s just rectangles and triangles in disguise. Draw a line to cut it into pieces with formulas you know. There\'s often more than one good way to slice!' }, + { kind: 'concept', head: 'Add the pieces', body: 'Find each piece\'s area separately, then add them together. The pieces share an edge but never overlap, so nothing gets counted twice. Piece by piece, the weird shape becomes easy.' }, + { kind: 'concept', head: 'Holes get subtracted', body: 'If a shape has a cut-out — like a square hole in a bigger square — work backwards. Find the FULL shape\'s area, then subtract the hole. What\'s removed can\'t count toward the area.' }, + { kind: 'example', head: 'L-shape: two rectangles', body: 'An L-shape splits into a 4 × 2 rectangle and a 3 × 2 rectangle.\nPiece 1: 4 × 2 = 8. Piece 2: 3 × 2 = 6.\nTotal area = 8 + 6 = 14 square units.' }, + { kind: 'example', head: 'Side-by-side rectangles', body: 'Two rectangles, 3 × 4 and 2 × 4, joined together.\n3 × 4 = 12 and 2 × 4 = 8.\nCombined area = 12 + 8 = 20 square units.' }, + { kind: 'example', head: 'Square with a hole', body: 'A 5 × 5 square has a 2 × 2 square cut out of it.\nFull square: 5 × 5 = 25. Hole: 2 × 2 = 4.\nArea left = 25 − 4 = 21 square units.' }, + { kind: 'example', head: 'The house shape', body: 'A 6 × 3 rectangle with a triangle roof: base 6, height 2.\nRectangle: 6 × 3 = 18. Roof: ½ × 6 × 2 = 6.\nTotal = 18 + 6 = 24 square units.' }, + { kind: 'example', head: 'Corner bite: 10 × 10 minus 5 × 5', body: 'A 10 × 10 square loses a 5 × 5 corner.\nFull: 10 × 10 = 100. Bite: 5 × 5 = 25.\nArea left = 100 − 25 = 75 square units.' }, + { kind: 'example', head: 'Find a missing side first', body: 'An L-shape is 8 wide and 5 tall, and its notch is 3 wide and 2 tall.\nSplit off the full bottom: 8 × 3 = 24. The top piece is (8 − 3) wide: 5 × 2 = 10.\nTotal = 24 + 10 = 34 square units.' }, + { kind: 'protip', head: 'Draw the cut lines', body: 'Actually draw your slicing lines on the figure, then label every piece\'s base and height. Unlabeled lengths cause more errors than bad arithmetic. Sometimes a side\'s length is hiding — find it by subtracting known sides.' }, + { kind: 'trap', head: 'Trap: double-counting the seam', body: 'Where two pieces meet, the shared edge belongs to the shape only once. If your cut pieces overlap, some area gets counted twice and your answer comes out too big. Cut so pieces touch but never sit on top of each other.' }, + { kind: 'trap', head: 'Trap: adding a hole', body: 'A cut-out is missing area, so it must be SUBTRACTED. Adding the hole\'s area gives a total bigger than the original shape — an instant red flag. Ask: is this piece part of the shape, or removed from it?' }, + { kind: 'summary', head: 'Split, solve, combine', body: 'Slice composite figures into rectangles and triangles. Find each piece\'s area, then ADD the parts — or SUBTRACT the holes. Label every length and never let pieces overlap.' }, + ], + '6.G-6': [ + { kind: 'objective', head: 'Area or volume? You choose', body: 'Today is formula-picking day: rectangles, triangles, and prisms all in one review. The winning move is reading the question FIRST — flat shape or solid, square units or cubic?' }, + { kind: 'concept', head: 'Flat vs. solid', body: 'A flat shape (rectangle, triangle) has AREA, measured in square units. A solid shape (prism, cube) has VOLUME, measured in cubic units. The units tell you which world you\'re in before you compute anything.' }, + { kind: 'concept', head: 'The three formulas', body: 'Rectangle: area = length × width. Triangle: area = ½ × base × height. Rectangular prism: volume = length × width × height. Two numbers for flat shapes, three for solids.' }, + { kind: 'concept', head: 'Underline before you calculate', body: 'Underline WHAT is asked and the UNITS before touching numbers. "How much carpet?" is area. "How much water fits?" is volume. Ten seconds of reading saves a whole wrong answer.' }, + { kind: 'example', head: 'Rectangle 8 × 4', body: 'Flat shape → area.\n8 × 4 = 32.\nAnswer: 32 square units.' }, + { kind: 'example', head: 'Triangle: base 6, height 9', body: 'Flat shape with the ½: area = ½ × 6 × 9.\nHalf of 6 is 3, then 3 × 9 = 27.\nAnswer: 27 square units.' }, + { kind: 'example', head: 'Prism 2 × 3 × 5', body: 'Three edges → solid → volume.\n2 × 3 = 6, then 6 × 5 = 30.\nAnswer: 30 cubic units.' }, + { kind: 'example', head: 'Cube with side 4', body: 'A cube is a solid, so use volume: 4 × 4 × 4.\n4 × 4 = 16, then 16 × 4 = 64.\nAnswer: 64 cubic units.' }, + { kind: 'example', head: 'Triangle: base 10, height 3', body: '½ × 10 × 3.\nHalf of 10 is 5, then 5 × 3 = 15.\nAnswer: 15 square units.' }, + { kind: 'example', head: 'Mixed question, careful read', body: 'A box is 3 × 4 × 2. How much space is INSIDE it?\n"Inside" means volume: 3 × 4 = 12, then 12 × 2 = 24.\nAnswer: 24 cubic units — not 12, which is just one face.' }, + { kind: 'protip', head: 'Count the lengths you multiplied', body: 'After solving, count your factors. Two lengths multiplied → area → square units. Three lengths → volume → cubic units. If your count doesn\'t match the question, you picked the wrong formula.' }, + { kind: 'trap', head: 'Trap: mixing up the units', body: 'Writing "30 square units" for a prism\'s volume — or "27 cubic units" for a triangle\'s area — is the classic review-day slip. Square units cover flat shapes; cubic units fill solids. Match the units to the shape every single time.' }, + { kind: 'summary', head: 'Read, pick, compute', body: 'Flat → area (square units); solid → volume (cubic units). Rectangle: l × w. Triangle: ½ × b × h. Prism: l × w × h. Underline what\'s asked first, and the formula picks itself.' }, + ], + '6.G-7': [ + { kind: 'objective', head: 'Composite figures, level up', body: 'Today you will master areas of shapes built from rectangles and triangles — including tricky cutouts and missing side lengths. Break it, label it, add it (or subtract it).' }, + { kind: 'concept', head: 'Break into known pieces', body: 'Every composite figure hides simple shapes inside. Slice it into rectangles and triangles whose formulas you already know. One straight cut is often all it takes.' }, + { kind: 'concept', head: 'Add pieces, subtract cutouts', body: 'Pieces glued ON get ADDED — like a triangular roof on a rectangle. Pieces cut OUT get SUBTRACTED — like a window hole in a wall. Decide add-or-subtract for each piece before you compute.' }, + { kind: 'concept', head: 'Label every length first', body: 'Most composite-figure errors aren\'t math errors — they\'re missing or confused side lengths. Before computing, write a number on EVERY side of every piece. If a length isn\'t given, find it by adding or subtracting the sides you know.' }, + { kind: 'example', head: 'Two rectangles side-by-side', body: 'Rectangles 4 × 3 and 4 × 2 joined together.\nPiece 1: 4 × 3 = 12. Piece 2: 4 × 2 = 8.\nTotal area = 12 + 8 = 20 square units.' }, + { kind: 'example', head: 'Another pair: 5 × 4 and 5 × 3', body: 'Piece 1: 5 × 4 = 20.\nPiece 2: 5 × 3 = 15.\nTotal = 20 + 15 = 35 square units.' }, + { kind: 'example', head: 'Rectangle with a cutout', body: 'A 6 × 5 rectangle has a 2 × 2 square removed.\nBig rectangle: 6 × 5 = 30. Cutout: 2 × 2 = 4.\nArea left = 30 − 4 = 26 square units.' }, + { kind: 'example', head: 'The house: rectangle + roof', body: 'Rectangle 8 × 5 with a triangle on top: base 8, height 4.\nRectangle: 8 × 5 = 40. Roof: ½ × 8 × 4 = 16.\nTotal = 40 + 16 = 56 square units.' }, + { kind: 'example', head: 'Bigger cutout: 10 × 6 minus 3 × 2', body: 'Full rectangle: 10 × 6 = 60.\nCutout: 3 × 2 = 6.\nArea = 60 − 6 = 54 square units.' }, + { kind: 'example', head: 'Hunt the hidden length', body: 'A T-shape: the top bar is 9 × 2, and the stem below is 3 wide and 4 tall.\nTop: 9 × 2 = 18. Stem: 3 × 4 = 12.\nTotal = 18 + 12 = 30 square units — the stem\'s width came from the drawing, not the top bar!' }, + { kind: 'protip', head: 'Solve the same shape two ways', body: 'Many figures can be sliced vertically OR horizontally — both must give the same area. When you have time, compute it both ways as a built-in answer check. Matching answers mean you can trust your work.' }, + { kind: 'trap', head: 'Trap: adding when you should subtract', body: 'A roof glued ON adds area; a hole cut OUT removes it. Kids often add everything in sight, hole included. Say it out loud for each piece: "on means add, out means subtract."' }, + { kind: 'trap', head: 'Trap: trusting an unlabeled side', body: 'Don\'t guess a length because it "looks like 3." Every length you use must be given or computed from given sides — often by subtracting (whole side − known part). Label first, calculate second.' }, + { kind: 'summary', head: 'Label, split, add or subtract', body: 'Label every side length, computing missing ones from the sides you know. Split the figure into rectangles and triangles. Add the pieces that build the shape; subtract the cutouts. That routine cracks any composite figure.' }, + ], + '6.G-8': [ + { kind: 'objective', head: 'Volume, fractions included', body: 'Today you will compute the volume of right rectangular prisms — box shapes — as length × width × height. And you\'ll handle fraction edges like ½ without breaking a sweat.' }, + { kind: 'concept', head: 'V = l × w × h, in cubic units', body: 'Volume measures the space inside a box, counted in unit cubes. Multiply the three edges: length × width × height. The answer is in CUBIC units, like in³, cm³, or ft³.' }, + { kind: 'concept', head: 'Fraction edges multiply the same way', body: 'When an edge is a fraction, multiply tops together and bottoms together. ½ × ½ = 1/4, because 1 × 1 = 1 on top and 2 × 2 = 4 on the bottom. Whole numbers are just fractions over 1.' }, + { kind: 'concept', head: 'Cubes: V = s³', body: 'A cube\'s edges are all equal, so its volume is side × side × side — written s³ and said "s cubed." That little 3 means the side is used three times. A side-3 cube has volume 3 × 3 × 3 = 27.' }, + { kind: 'example', head: 'Box 1 × 3 × 5', body: 'Multiply the edges: 1 × 3 = 3.\nThen 3 × 5 = 15.\nVolume = 15 cubic units.' }, + { kind: 'example', head: 'Box 2 × 4 × 5', body: '2 × 4 = 8.\n8 × 5 = 40.\nVolume = 40 cubic units.' }, + { kind: 'example', head: 'Cube with edge 3', body: 'V = s³ = 3 × 3 × 3.\n3 × 3 = 9, then 9 × 3 = 27.\nVolume = 27 cubic units.' }, + { kind: 'example', head: 'Fraction edge: 1 × 2 × ½', body: '1 × 2 = 2.\nThen 2 × ½ means half of 2, which is 1.\nVolume = 1 cubic unit.' }, + { kind: 'example', head: 'Two fractions: ½ × ½ × 4', body: 'Fractions first: ½ × ½ = 1/4.\nThen 1/4 × 4 = 4/4 = 1.\nVolume = 1 cubic unit — a skinny box can still hold exactly one cube\'s worth!' }, + { kind: 'example', head: 'Mixed: ½ × 3 × 8', body: 'Whole numbers first: 3 × 8 = 24.\nThen half of 24 is 12.\nVolume = 12 cubic units.' }, + { kind: 'protip', head: 'Save the fraction for last', body: 'Multiply the whole-number edges first, then hit the result with the fraction. For ½ × 3 × 8, do 3 × 8 = 24, then halve it: 12. One clean fraction step beats juggling fractions the whole way.' }, + { kind: 'trap', head: 'Trap: wrong units on the answer', body: 'Volume is always CUBIC units — 15 cm³, not 15 cm or 15 cm². Plain units measure length and square units measure area; both are the wrong dimension for volume. Three edges multiplied means a little 3 on the unit.' }, + { kind: 'summary', head: 'Three edges, tops and bottoms', body: 'Volume = length × width × height, always in cubic units. Fractions multiply tops × tops and bottoms × bottoms — or save the fraction for the last step. Cubes are the shortcut case: V = s³.' }, + ], + '6.G-9': [ + { kind: 'objective', head: 'Polygons meet coordinates', body: 'Today you will find side lengths and areas of polygons drawn on the coordinate plane. Subtraction with absolute value does the measuring — even across negative numbers.' }, + { kind: 'concept', head: 'Horizontal: subtract the x\'s', body: 'If two vertices share a y-value, the segment between them is horizontal. Its length is |x₂ − x₁| — the difference of the x-values. Those straight bars mean absolute value: the distance, always positive.' }, + { kind: 'concept', head: 'Vertical: subtract the y\'s', body: 'If two vertices share an x-value, the segment is vertical. Its length is |y₂ − y₁|. Same idea, just up-and-down instead of left-and-right.' }, + { kind: 'concept', head: 'Negatives: distance still positive', body: 'From (−3, 4) to (2, 4), the length is |2 − (−3)| = |2 + 3| = 5. Subtracting a negative turns into adding, and absolute value keeps the answer positive. Distance is never negative — it\'s how far, not which way.' }, + { kind: 'concept', head: 'Rectangle area from the grid', body: 'For an axis-aligned rectangle (sides run along the grid), find the horizontal length and the vertical length. Then area = horizontal × vertical. The coordinates hand you both numbers.' }, + { kind: 'example', head: 'Horizontal: (2, 1) to (7, 1)', body: 'Same y = 1, so it\'s horizontal.\n|7 − 2| = 5.\nThe segment is 5 units long.' }, + { kind: 'example', head: 'Vertical: (1, 2) to (1, 6)', body: 'Same x = 1, so it\'s vertical.\n|6 − 2| = 4.\nThe segment is 4 units long.' }, + { kind: 'example', head: 'With a negative: (−3, 4) to (2, 4)', body: 'Same y, horizontal.\n|2 − (−3)| = |2 + 3| = 5.\nLength = 5 units — 3 steps to reach zero, then 2 more.' }, + { kind: 'example', head: 'Rectangle: (0,0), (4,0), (4,3), (0,3)', body: 'Width: |4 − 0| = 4. Height: |3 − 0| = 3.\nArea = 4 × 3 = 12.\nAnswer: 12 square units.' }, + { kind: 'example', head: 'Rectangle: (0,0), (5,0), (5,2), (0,2)', body: 'Width: |5 − 0| = 5. Height: |2 − 0| = 2.\nArea = 5 × 2 = 10 square units.\nThe corners did all the measuring for us.' }, + { kind: 'example', head: 'Rectangle crossing zero', body: 'Corners: (−2, −1), (3, −1), (3, 2), (−2, 2).\nWidth: |3 − (−2)| = 5. Height: |2 − (−1)| = 3.\nArea = 5 × 3 = 15 square units.' }, + { kind: 'protip', head: 'Say "distance," not "difference"', body: 'When you subtract coordinates, you\'re measuring a distance — so wrap it in absolute value and expect a positive number. |2 − 7| and |7 − 2| both equal 5. Order can\'t hurt you if you take the absolute value.' }, + { kind: 'trap', head: 'Trap: the "negative distance"', body: 'Computing 2 − 7 = −5 and calling a side −5 long is the classic slip. A negative just means you flipped the subtraction order. Take the absolute value: the length is 5, full stop.' }, + { kind: 'summary', head: 'Absolute value measures the grid', body: 'Same y → horizontal, length = |x₂ − x₁|. Same x → vertical, length = |y₂ − y₁|. Multiply horizontal × vertical for an axis-aligned rectangle\'s area. Distances are always positive!' }, + ], + '6.G-10': [ + { kind: 'objective', head: 'Wrap it up: surface area', body: 'Today you will compute surface area — the total area of every face of a prism — using nets. Cubes get a shortcut formula, and boxes get the three-pairs trick.' }, + { kind: 'concept', head: 'Nets show every face at once', body: 'A NET is the prism unfolded flat, like a cardboard box opened up. Every face becomes a rectangle you can see on paper. No face can hide from you in a net.' }, + { kind: 'concept', head: 'Sum the faces, in square units', body: 'Surface area = the SUM of all the face areas. It measures covering — paint, wrapping paper, cardboard — so it comes out in SQUARE units. Add every face, skip none.' }, + { kind: 'concept', head: 'Cube shortcut: SA = 6s²', body: 'A cube has 6 identical square faces. One face has area s × s = s², so the whole cube has SA = 6 × s². Edge 3? One face is 9, so SA = 6 × 9 = 54.' }, + { kind: 'concept', head: 'Boxes: three pairs', body: 'A rectangular prism has 6 faces in 3 identical pairs: top & bottom, front & back, left & right. Compute the three different faces, add them, then DOUBLE the total. That\'s SA = 2 × (lw + lh + wh).' }, + { kind: 'example', head: 'How many faces?', body: 'Count a rectangular prism\'s faces: top, bottom, front, back, left, right.\nThat\'s 6 faces.\nEvery box — cube or not — has exactly 6.' }, + { kind: 'example', head: 'Cube with edge 3', body: 'One face: 3 × 3 = 9.\nSix faces: 6 × 9 = 54.\nSurface area = 54 square units.' }, + { kind: 'example', head: 'Cube with edge 5', body: 'One face: 5 × 5 = 25.\n6 × 25 = 150.\nSurface area = 150 square units.' }, + { kind: 'example', head: 'Prism 2 × 3 × 4, step by step', body: 'The three face types: 2 × 3 = 6, 2 × 4 = 8, 3 × 4 = 12.\nAdd them: 6 + 8 + 12 = 26.\nDouble for the pairs: 2 × 26 = 52 square units.' }, + { kind: 'example', head: 'Prism 1 × 2 × 3', body: 'Faces: 1 × 2 = 2, 1 × 3 = 3, 2 × 3 = 6.\nSum: 2 + 3 + 6 = 11.\nDouble: 2 × 11 = 22 square units.' }, + { kind: 'example', head: 'Same box, from the net', body: 'Unfold a 2 × 3 × 4 prism into its net: six rectangles.\nTwo are 2 × 3 (6 each), two are 2 × 4 (8 each), two are 3 × 4 (12 each).\n6 + 6 + 8 + 8 + 12 + 12 = 52 — the net agrees with the formula!' }, + { kind: 'protip', head: 'Three products, add, double', body: 'For any box, make just three multiplications: l × w, l × h, and w × h. Add the three answers, then double. That rhythm — three products, add, double — computes any prism\'s surface area in seconds.' }, + { kind: 'trap', head: 'Trap: surface area vs. volume', body: 'Multiplying 2 × 3 × 4 = 24 gives volume, not surface area — and 24 is nowhere near the true SA of 52. Surface area ADDS face areas and uses square units; volume MULTIPLIES three edges and uses cubic. Wrapping or filling? Decide before you compute.' }, + { kind: 'summary', head: 'Every face counts', body: 'Unfold the prism into a net and add up ALL the face areas, in square units. Cube: SA = 6s². Box: find the three different faces, add, then double. Wrapping = surface area; filling = volume.' }, + ], +}; diff --git a/src/data/lessonSlides/index.ts b/src/data/lessonSlides/index.ts new file mode 100644 index 0000000..86ed422 --- /dev/null +++ b/src/data/lessonSlides/index.ts @@ -0,0 +1,19 @@ +import type { SlideBank } from './types'; +import { F5_SLIDES } from './f5'; +import { RP_SLIDES } from './rp'; +import { NS_SLIDES } from './ns'; +import { EE_SLIDES } from './ee'; +import { G_SLIDES } from './g'; +import { SP_SLIDES } from './sp'; + +export type { LessonSlide, SlideBank } from './types'; + +// One slide deck per lesson, keyed by `${domain}-${unit}` (see lessonKey). +export const LESSON_SLIDES: SlideBank = { + ...F5_SLIDES, + ...RP_SLIDES, + ...NS_SLIDES, + ...EE_SLIDES, + ...G_SLIDES, + ...SP_SLIDES, +}; diff --git a/src/data/lessonSlides/ns.ts b/src/data/lessonSlides/ns.ts new file mode 100644 index 0000000..ea98860 --- /dev/null +++ b/src/data/lessonSlides/ns.ts @@ -0,0 +1,166 @@ +import type { SlideBank } from './types'; + +// 6.NS — The Number System. 12–14 slides per lesson, ~3 short sentences each, +// written for a 10–12-year-old: objective → concepts → simplest-to-fuller +// examples → pro tip → trap(s) → summary. +export const NS_SLIDES: SlideBank = { + '6.NS-1': [ + { kind: 'objective', head: 'Decimals that behave', body: 'Today you will add and subtract decimals without a single slip. The whole game is lining up the decimal points. Do that, and decimals act just like whole numbers.' }, + { kind: 'concept', head: 'Line up the points, always', body: 'Before you add or subtract, stack the numbers so the decimal points sit in one straight column. That keeps tenths with tenths and hundredths with hundredths. Lining up the LAST digits instead is how answers go wrong.' }, + { kind: 'concept', head: 'Zeros on the right are free', body: 'You can add zeros to the right end of a decimal without changing it: 3.4 is exactly the same as 3.40. Pad both numbers to the same number of places. Now every column has a digit and nothing gets skipped.' }, + { kind: 'concept', head: 'Bring the point straight down', body: 'Once the points are lined up, add or subtract like normal whole numbers. Carry and borrow the usual way. Then drop the decimal point STRAIGHT down into your answer — it never wanders.' }, + { kind: 'example', head: 'Warm-up: 0.3 + 0.4', body: 'Both numbers already have one place, and the points line up. Add the tenths: 3 + 4 = 7 tenths. Answer: 0.7.' }, + { kind: 'example', head: 'Pad a zero: 3.4 + 1.25', body: 'Write 3.4 as 3.40 so both have two places.\n3.40 + 1.25: hundredths 0 + 5 = 5, tenths 4 + 2 = 6, ones 3 + 1 = 4.\nAnswer: 4.65.' }, + { kind: 'example', head: 'Add with a carry: 0.75 + 0.5', body: 'Write 0.5 as 0.50.\n0.75 + 0.50: hundredths 5 + 0 = 5, tenths 7 + 5 = 12 — write 2, carry 1 to the ones.\nAnswer: 1.25.' }, + { kind: 'example', head: 'A hidden point: 5 − 2.3', body: 'A whole number has a secret decimal point: 5 is 5.0.\n5.0 − 2.3: borrow to make 10 − 3 = 7 tenths, then 4 − 2 = 2 ones.\nAnswer: 2.7.' }, + { kind: 'example', head: 'Two carries: 2.6 + 3.45', body: 'Pad: 2.60 + 3.45.\nHundredths 0 + 5 = 5. Tenths 6 + 4 = 10 — write 0, carry 1. Ones 2 + 3 + 1 = 6.\nAnswer: 6.05.' }, + { kind: 'example', head: 'Borrow twice: 4.2 − 1.75', body: 'Pad: 4.20 − 1.75.\nHundredths: borrow, 10 − 5 = 5. Tenths: 2 became 1, borrow again, 11 − 7 = 4. Ones: 3 − 1 = 2.\nAnswer: 2.45.' }, + { kind: 'protip', head: 'Estimate before you compute', body: 'Round first: 3.4 + 1.25 is about 3 + 1 = 4, so the answer should be a little over 4. If you get 45.65 or 0.465, the decimal point slipped. A ten-second estimate catches almost every point mistake.' }, + { kind: 'trap', head: 'Trap: lining up the last digits', body: 'Stacking 3.4 over 1.25 by their LAST digits adds tenths to hundredths — total nonsense. Always line up the decimal POINTS, not the ends of the numbers. Pad with zeros so every column matches.' }, + { kind: 'trap', head: 'Trap: forgetting the hidden point', body: 'In 5 − 2.3, the 5 is really 5.0 — the point hides after the ones digit. If you skip that, you might write 5 − 2.3 = 2.3 or worse. Give whole numbers their decimal point and a zero before you subtract.' }, + { kind: 'summary', head: 'Three moves, zero mistakes', body: 'Line up the decimal points in a straight column. Pad with zeros so both numbers have the same places. Compute like whole numbers and bring the point straight down. Estimate first to catch any slip!' }, + ], + '6.NS-2': [ + { kind: 'objective', head: 'Multiply & divide decimals', body: 'Today you will multiply and divide decimals like a pro. The trick: work with whole numbers first, then put the decimal point where it belongs. Counting places does all the hard thinking for you.' }, + { kind: 'concept', head: 'Multiply first, point later', body: 'To multiply decimals, ignore the points and multiply the whole numbers. Then count the decimal places in BOTH factors and add them up. Your answer gets exactly that many decimal places.' }, + { kind: 'concept', head: 'Why counting places works', body: 'A number like 0.6 is really 6 tenths, and 0.4 is 4 tenths. Tenths times tenths makes hundredths — that\'s two places. Every decimal place in a factor shifts the answer one more place.' }, + { kind: 'concept', head: 'Dividing? Slide both points', body: 'You\'re not allowed to be confused by a decimal divisor — so get rid of it! Move the decimal point right until the divisor is a whole number, and move the dividend\'s point the SAME number of spots. 4.8 ÷ 0.6 becomes 48 ÷ 6, which is easy.' }, + { kind: 'concept', head: 'Estimate to place the point', body: 'Before computing, round and guess: 1.2 × 3 is about 1 × 3 = 3, so expect an answer near 3. Estimates tell you whether the answer should be 0.36, 3.6, or 36. The digits come from multiplying; the point comes from thinking.' }, + { kind: 'example', head: 'Warm-up: 0.3 × 0.7', body: 'Ignore the points: 3 × 7 = 21.\nCount places: one in 0.3, one in 0.7 — two total.\nPlace the point two spots in: 0.21.' }, + { kind: 'example', head: 'Multiply: 0.6 × 0.4', body: 'Whole numbers first: 6 × 4 = 24.\nDecimal places: 0.6 has one, 0.4 has one — two total.\nAnswer: 0.24.' }, + { kind: 'example', head: 'One decimal factor: 1.2 × 3', body: 'Ignore the point: 12 × 3 = 36.\nCount places: 1.2 has one, 3 has none — one total.\nAnswer: 3.6. Check: about 1 × 3 = 3. Fits!' }, + { kind: 'example', head: 'Divide: 2.5 ÷ 0.5', body: 'Slide both points one spot right: 2.5 ÷ 0.5 becomes 25 ÷ 5.\n25 ÷ 5 = 5.\nAnswer: 5 — how many halves fit in two and a half? Five!' }, + { kind: 'example', head: 'Divide: 4.8 ÷ 0.6', body: 'Make the divisor whole: move both points one spot → 48 ÷ 6.\n48 ÷ 6 = 8.\nAnswer: 8. Sliding both points is fair because you scaled both numbers by 10.' }, + { kind: 'example', head: 'Trailing zero: 0.5 × 0.8', body: '5 × 8 = 40.\nTwo decimal places total, so count two spots in: 0.40.\nAnswer: 0.40, which is the same as 0.4 — count places BEFORE you drop the zero.' }, + { kind: 'protip', head: 'The answer can shrink', body: 'Multiplying by a number smaller than 1 makes things SMALLER: 0.6 × 0.4 = 0.24, less than both factors. That\'s not a mistake — you\'re taking a fraction of a fraction. Use it as a check: decimal × decimal under 1 should shrink.' }, + { kind: 'trap', head: 'Trap: counting only one factor', body: 'In 0.6 × 0.4, some kids count one decimal place and write 2.4 — ten times too big! Count the places in BOTH factors and add them: 1 + 1 = 2 places, so 0.24. Both factors always vote.' }, + { kind: 'trap', head: 'Trap: moving only one point', body: 'When dividing, if you shift the divisor\'s point you MUST shift the dividend\'s point the same amount. Turning 4.8 ÷ 0.6 into 4.8 ÷ 6 changes the problem completely. Both points slide together, always.' }, + { kind: 'summary', head: 'Digits first, point second', body: 'Multiply as whole numbers, then count decimal places in both factors to set the point. Divide by sliding BOTH points until the divisor is whole. Estimate first so the point lands in a sensible spot!' }, + ], + '6.NS-3': [ + { kind: 'objective', head: 'GCF, LCM & distributing', body: 'Today you will find the greatest common factor and least common multiple of two numbers. Then you\'ll use the GCF to rewrite sums in a slick factored form. These tools make big numbers break apart nicely.' }, + { kind: 'concept', head: 'GCF: the biggest shared divider', body: 'The Greatest Common Factor is the LARGEST number that divides evenly into both numbers. Factors of 12: 1, 2, 3, 4, 6, 12. Factors of 18: 1, 2, 3, 6, 9, 18 — the biggest one on both lists is 6.' }, + { kind: 'concept', head: 'LCM: the smallest shared target', body: 'The Least Common Multiple is the SMALLEST number that both numbers divide into. List multiples of the bigger number and stop at the first one the smaller number also hits. For 4 and 6: multiples of 6 are 6, 12 … and 12 works for 4 too.' }, + { kind: 'concept', head: 'Which way does it point?', body: 'GCF divides INTO your numbers, so it\'s always smaller than (or equal to) them. LCM is what your numbers divide INTO, so it\'s always bigger than (or equal to) them. If your "GCF of 4 and 6" comes out as 12, you found the LCM instead.' }, + { kind: 'concept', head: 'Distribute with the GCF', body: 'You can pull the GCF out of a sum like a common ingredient. Since 18 = 6 × 3 and 24 = 6 × 4, you can write 18 + 24 = 6(3 + 4). That\'s the distributive property running in reverse — factoring!' }, + { kind: 'example', head: 'Warm-up: GCF of 8 and 12', body: 'Factors of 8: 1, 2, 4, 8. Factors of 12: 1, 2, 3, 4, 6, 12.\nShared factors: 1, 2, 4.\nThe greatest is 4, so GCF = 4.' }, + { kind: 'example', head: 'GCF of 12 and 18', body: 'Break into primes: 12 = 2 × 2 × 3 and 18 = 2 × 3 × 3.\nThey share one 2 and one 3.\nMultiply the shared primes: 2 × 3 = 6. GCF = 6.' }, + { kind: 'example', head: 'LCM of 4 and 6', body: 'List multiples of 6: 6, 12, 18 …\nIs 6 a multiple of 4? No. Is 12? Yes — 4 × 3 = 12.\nLCM = 12.' }, + { kind: 'example', head: 'LCM of 3 and 5', body: 'The numbers 3 and 5 share no factors except 1.\nWhen that happens, just multiply them: 3 × 5 = 15.\nLCM = 15.' }, + { kind: 'example', head: 'GCF of 16 and 24', body: 'Primes: 16 = 2 × 2 × 2 × 2 and 24 = 2 × 2 × 2 × 3.\nThey share three 2s.\n2 × 2 × 2 = 8, so GCF = 8.' }, + { kind: 'example', head: 'Rewrite 18 + 24 with the GCF', body: 'GCF of 18 and 24 is 6.\nWrite each as 6 times something: 18 = 6 × 3 and 24 = 6 × 4.\nSo 18 + 24 = 6(3 + 4). Check: 6 × 7 = 42, and 18 + 24 = 42. Match!' }, + { kind: 'protip', head: 'Primes make it automatic', body: 'Break both numbers into prime factors. GCF = multiply the primes they SHARE. LCM = multiply the shared primes once, plus every leftover prime. One factor tree answers both questions.' }, + { kind: 'trap', head: 'Trap: swapping GCF and LCM', body: 'The classic mix-up: answering 12 for "GCF of 4 and 6". Remember — GCF divides into the numbers (small), LCM is what they divide into (big). Say the direction out loud before you answer.' }, + { kind: 'summary', head: 'Divide in, multiply out', body: 'GCF: the biggest number dividing into both — find it with shared prime factors. LCM: the smallest number both divide into — scan multiples of the larger number. Pull the GCF out of a sum to write it as GCF × (sum): 18 + 24 = 6(3 + 4).' }, + ], + '6.NS-4': [ + { kind: 'objective', head: 'Meet the negative numbers', body: 'Today you will work with integers — positive AND negative whole numbers. You\'ll compare them on a number line and measure their distance from zero with absolute value. Below zero is a real place, and you\'re about to map it.' }, + { kind: 'concept', head: 'Negatives live below zero', body: 'Negative numbers describe things below a starting point: owing $5 is −5 dollars, a submarine 30 feet down is at −30 feet, and 4 degrees below freezing is −4°C. The minus sign means "on the other side of zero". Zero itself is neither positive nor negative.' }, + { kind: 'concept', head: 'Right is always bigger', body: 'On a number line, numbers grow as you move right and shrink as you move left. So 2 > −5 because 2 sits to the right. This rule never breaks — even deep in negative territory, −2 beats −7 because it\'s further right.' }, + { kind: 'concept', head: 'Absolute value = distance from 0', body: 'The absolute value |x| asks one question: how FAR is x from zero? Distance is never negative, so |−7| = 7 and |7| = 7 too. The bars strip away the direction and keep only the distance.' }, + { kind: 'example', head: 'Warm-up: |−7|', body: 'How far is −7 from 0? Count the steps: seven.\nDistance is always positive.\n|−7| = 7.' }, + { kind: 'example', head: 'Compare: −5 or −2?', body: 'Picture the number line: −5 sits five steps left of zero, −2 only two steps left.\n−2 is to the RIGHT of −5.\nSo −2 is greater: −2 > −5.' }, + { kind: 'example', head: 'Compute: |−15|', body: 'The bars ask for distance from zero.\n−15 is fifteen steps from 0.\n|−15| = 15.' }, + { kind: 'example', head: 'Order −3, 2, −8', body: 'Place each on the number line: −8 is furthest left, then −3, then 2 on the positive side.\nLeast to greatest reads left to right.\nAnswer: −8, −3, 2.' }, + { kind: 'example', head: 'Diver vs kite', body: 'A diver is at −30 ft and a kite at 12 ft. Who is farther from sea level (0)?\nCompare distances: |−30| = 30 and |12| = 12.\n30 > 12, so the diver is farther — even though −30 is the SMALLER number.' }, + { kind: 'protip', head: 'Tell a story with the sign', body: 'Stuck comparing negatives? Turn them into money: −5 means owing $5, −2 means owing $2. Owing less means you\'re better off, so −2 > −5. Real-life stories make signed numbers obvious.' }, + { kind: 'trap', head: 'Trap: "7 is bigger than 2"', body: 'It\'s true for positives, but −7 is LESS than −2! A bigger digit after a minus sign means further below zero — deeper in debt. Always compare positions on the line, not the bare digits.' }, + { kind: 'trap', head: 'Trap: bars that flip signs', body: 'Absolute value bars are not sign-flippers or parentheses. |−7| = 7 because distance is positive — but |7| is still 7, not −7. The bars never make a number negative.' }, + { kind: 'summary', head: 'Position and distance', body: 'Negatives sit below zero and describe debt, depth, and cold. Bigger always means further RIGHT on the number line, so −2 > −5. Absolute value is distance from zero — always positive. Two ideas, whole new number world!' }, + ], + '6.NS-5': [ + { kind: 'objective', head: 'Master the coordinate plane', body: 'Today you will plot points in all four quadrants, not just the top-right corner. You\'ll name quadrants by their signs, measure distances along grid lines, and reflect points across the axes. The full map is yours now.' }, + { kind: 'concept', head: '(x, y): across, then up or down', body: 'An ordered pair (x, y) is a set of directions from the origin (0, 0). The first number x says how far to go ACROSS — right if positive, left if negative. The second number y says how far up (positive) or down (negative).' }, + { kind: 'concept', head: 'Four quadrants, four sign combos', body: 'The axes slice the plane into four quadrants, numbered I, II, III, IV counterclockwise from the top-right. Quadrant I is (+, +), II is (−, +), III is (−, −), and IV is (+, −). Read a point\'s two signs and you instantly know its quadrant.' }, + { kind: 'concept', head: 'Distance along a grid line', body: 'If two points share an x-coordinate, they sit on the same vertical line — subtract the y-values for the distance. Share a y? Subtract the x-values. Distance is always positive, so take the absolute value of the difference.' }, + { kind: 'concept', head: 'Reflections flip one sign', body: 'Reflecting across the y-axis flips the point left-right, so the x-coordinate changes sign: (4, 3) → (−4, 3). Reflecting across the x-axis flips up-down, so y changes sign: (4, 3) → (4, −3). One mirror, one sign flip.' }, + { kind: 'example', head: 'Warm-up: plot (−2, 3)', body: 'Start at the origin (0, 0).\nx = −2: go LEFT 2. y = 3: go UP 3.\nThe point lands in the top-left region — Quadrant II.' }, + { kind: 'example', head: 'Name the quadrant: (−3, 5)', body: 'Check the signs: x is negative, y is positive.\nNegative x means left of the y-axis; positive y means above the x-axis.\nTop-left is Quadrant II.' }, + { kind: 'example', head: 'Name the quadrant: (6, −2)', body: 'Signs: x positive (right), y negative (down).\nRight and down is the bottom-right region.\nThat\'s Quadrant IV.' }, + { kind: 'example', head: 'Vertical distance: (2, 1) to (2, 6)', body: 'Both points have x = 2, so they line up vertically.\nSubtract the y-values: 6 − 1 = 5.\nDistance: 5 units.' }, + { kind: 'example', head: 'Across the axis: (−3, 4) to (5, 4)', body: 'Both have y = 4, so the path is horizontal.\nSubtract x-values: 5 − (−3) = 5 + 3 = 8.\nDistance: 8 units — count the 3 steps to zero plus 5 more.' }, + { kind: 'example', head: 'Reflect (4, 3) across the y-axis', body: 'The y-axis is a left-right mirror, so only x changes sign.\nx: 4 → −4. y stays 3.\nAnswer: (−4, 3).' }, + { kind: 'protip', head: 'Signs are a GPS', body: 'Before plotting, read the signs like directions: (+, +) means right-up, (−, +) left-up, (−, −) left-down, (+, −) right-down. You\'ll know the quadrant before your pencil moves. It also catches plotting mistakes instantly.' }, + { kind: 'trap', head: 'Trap: going up before across', body: 'The order in (x, y) is not optional: across FIRST, then up or down. Plotting (−3, 5) by going up 5 then left 3 might feel the same, but swapping the numbers gives (5, −3) — a completely different point. Run before you jump, even with negatives.' }, + { kind: 'summary', head: 'The whole plane, unlocked', body: 'Plot (x, y) by going across first, then up or down — signs give the direction. Quadrants I–IV are named by the sign pair. Grid-line distance: subtract the coordinates that differ and take absolute value. Reflections flip exactly one sign.' }, + ], + '6.NS-6': [ + { kind: 'objective', head: 'Divide fractions with a flip', body: 'Today you will divide a fraction by a fraction — the boss level of fraction skills. The move is called Keep-Change-Flip, and it turns every division into a multiplication. You\'ll also see WHY it works.' }, + { kind: 'concept', head: 'Division asks "how many fit?"', body: 'The problem 1/2 ÷ 1/4 asks: how many quarter-pieces fit inside one half? Picture a half sandwich cut into quarters — two of them fit. That\'s why dividing by a small fraction gives a BIG answer.' }, + { kind: 'concept', head: 'Keep, Change, Flip', body: 'KEEP the first fraction exactly as it is. CHANGE the ÷ sign to ×. FLIP the second fraction upside-down — its reciprocal. So 3/4 ÷ 1/2 becomes 3/4 × 2/1.' }, + { kind: 'concept', head: 'Why flipping works', body: 'Dividing by 1/2 means asking how many halves fit — and 2 halves fit in every whole, so it\'s the same as multiplying by 2. The reciprocal 2/1 IS that "how many fit per whole" number. Flipping isn\'t a magic trick; it\'s the fitting rate.' }, + { kind: 'concept', head: 'Then multiply straight across', body: 'After the flip, it\'s a multiplication you already know: tops times tops, bottoms times bottoms. Finish by simplifying — divide top and bottom by their GCF. An answer like 6/4 should leave home as 3/2.' }, + { kind: 'example', head: 'Warm-up: 1/2 ÷ 1/4', body: 'Keep 1/2, change ÷ to ×, flip 1/4 to 4/1.\n1/2 × 4/1: tops 1 × 4 = 4, bottoms 2 × 1 = 2. That\'s 4/2.\nSimplify: 4/2 = 2. Two quarters fit in a half!' }, + { kind: 'example', head: 'Check it with a picture', body: '1/3 ÷ 1/6 = ? Think: how many sixths fit inside one third?\nA third equals two sixths — picture a pizza slice cut in half.\nKeep-change-flip agrees: 1/3 × 6/1 = 6/3 = 2.' }, + { kind: 'example', head: 'Bigger than 1: 3/4 ÷ 1/2', body: 'Keep-change-flip: 3/4 × 2/1.\nTops: 3 × 2 = 6. Bottoms: 4 × 1 = 4. That\'s 6/4.\nSimplify by dividing top and bottom by 2: 3/2, which is 1 1/2.' }, + { kind: 'example', head: 'Divide BY a whole number: 2/3 ÷ 4', body: 'Write 4 as a fraction: 4/1. Flip it to 1/4.\n2/3 × 1/4: tops 2 × 1 = 2, bottoms 3 × 4 = 12. That\'s 2/12.\nSimplify: 2/12 = 1/6. Sharing 2/3 among 4 people gives each 1/6.' }, + { kind: 'example', head: 'Full workout: 5/6 ÷ 1/2', body: 'Keep 5/6, change to ×, flip 1/2 to 2/1.\nTops: 5 × 2 = 10. Bottoms: 6 × 1 = 6. That\'s 10/6.\nSimplify by 2: 5/3, or 1 2/3.' }, + { kind: 'protip', head: 'Predict big or small first', body: 'Before computing, ask: is the divisor smaller than 1? Then lots of pieces fit, so expect an answer BIGGER than the first fraction. Dividing by a number bigger than 1 shrinks things. This one prediction catches flipped-the-wrong-fraction errors instantly.' }, + { kind: 'trap', head: 'Trap: flipping both fractions', body: 'Only the SECOND fraction gets flipped — the one you\'re dividing by. Flipping both turns 1/2 ÷ 1/4 into 2/1 × 4/1 = 8, instead of the true answer 2. Keep the first, flip the second, never both.' }, + { kind: 'trap', head: 'Trap: flipping before changing the sign', body: 'Some kids flip the second fraction but keep the ÷ sign — then divide again and tie themselves in knots. The three moves come as a set: keep, CHANGE ÷ to ×, flip. Say all three out loud every time.' }, + { kind: 'summary', head: 'Keep-Change-Flip forever', body: 'Division asks how many of the second fraction fit in the first. Keep the first fraction, change ÷ to ×, flip the second. Multiply straight across and simplify. Dividing by a fraction under 1 makes the answer grow!' }, + ], + '6.NS-7': [ + { kind: 'objective', head: 'Big adds & subtracts, nailed', body: 'Today you will add and subtract multi-digit numbers quickly and correctly. Carrying and borrowing become automatic when you treat each column like its own mini-problem. Stack, solve, done.' }, + { kind: 'concept', head: 'Stack by place value', body: 'Write the numbers on top of each other with ones under ones, tens under tens, hundreds under hundreds. Straight columns are half the battle. Then work column by column, starting from the ones on the right.' }, + { kind: 'concept', head: 'Carrying: ten spills over', body: 'When a column adds to 10 or more, it overflows. Write the ones digit of the sum and carry the 1 into the NEXT column to the left. That carry is a real ten (or hundred) changing places — don\'t drop it.' }, + { kind: 'concept', head: 'Borrowing: trade from a neighbor', body: 'When the top digit is too small to subtract from, borrow from the column to its left. The neighbor gives up 1 (worth ten of yours), so 2 − 7 becomes 12 − 7. The neighbor\'s digit drops by 1 — write it down so you don\'t forget.' }, + { kind: 'example', head: 'Warm-up: 34 + 25', body: 'Stack: ones 4 + 5 = 9, no carry.\nTens: 3 + 2 = 5.\nAnswer: 59.' }, + { kind: 'example', head: 'One carry: 618 + 274', body: 'Ones: 8 + 4 = 12 — write 2, carry 1.\nTens: 1 + 7 + the carry 1 = 9.\nHundreds: 6 + 2 = 8. Answer: 892.' }, + { kind: 'example', head: 'Carry twice: 425 + 376', body: 'Ones: 5 + 6 = 11 — write 1, carry 1.\nTens: 2 + 7 + 1 = 10 — write 0, carry 1.\nHundreds: 4 + 3 + 1 = 8. Answer: 801.' }, + { kind: 'example', head: 'Borrow twice: 952 − 387', body: 'Ones: 2 − 7 won\'t go. Borrow: 12 − 7 = 5, and the 5 tens become 4.\nTens: 4 − 8 won\'t go. Borrow: 14 − 8 = 6, and the 9 hundreds become 8.\nHundreds: 8 − 3 = 5. Answer: 565.' }, + { kind: 'example', head: 'Across the zeros: 500 − 173', body: 'Ones: 0 − 3 won\'t go, and the tens are 0 too — borrow from the hundreds. 500 becomes 4 hundreds, 9 tens, 10 ones.\nOnes: 10 − 3 = 7. Tens: 9 − 7 = 2. Hundreds: 4 − 1 = 3.\nAnswer: 327.' }, + { kind: 'example', head: 'Boss level: 1003 − 247', body: 'Borrow travels across two zeros: 1003 becomes 0 thousands, 9 hundreds, 9 tens, 13 ones.\nOnes: 13 − 7 = 6. Tens: 9 − 4 = 5. Hundreds: 9 − 2 = 7.\nAnswer: 756. Check: 756 + 247 = 1003. It works!' }, + { kind: 'protip', head: 'Check subtraction by adding back', body: 'Subtraction and addition undo each other. After computing 952 − 387 = 565, add back: 565 + 387 should return 952 — and it does. This check catches borrowing slips in seconds.' }, + { kind: 'trap', head: 'Trap: the vanishing carry', body: 'The most common error: computing 2 + 7 = 9 in the tens of 425 + 376 and FORGETTING the carried 1 from the ones. Write every carry as a small 1 above the next column. Carries and borrows always move to the next-larger place — never skip one.' }, + { kind: 'trap', head: 'Trap: subtracting upside-down', body: 'In 952 − 387, the ones column shows 2 − 7. You cannot sneakily flip it to 7 − 2 = 5 — that changes the problem! When the top digit is smaller, you must BORROW, not swap.' }, + { kind: 'summary', head: 'Column by column wins', body: 'Stack numbers by place value and work right to left. Sums of 10+ carry a 1 to the next column; too-small digits borrow 10 from the left neighbor. Zeros pass the borrow along. Add back to check every subtraction!' }, + ], + '6.NS-8': [ + { kind: 'objective', head: 'Line up signed numbers', body: 'Today you will compare and order numbers with signs — positives, negatives, and zero. One picture solves everything: the number line. Left is smaller, right is bigger, no exceptions.' }, + { kind: 'concept', head: 'Right is bigger. Always.', body: 'On the number line, values grow as you travel right and shrink as you travel left. This works everywhere on the line — positive side, negative side, and across zero. To compare two numbers, just ask which one sits further right.' }, + { kind: 'concept', head: 'Every negative loses to every positive', body: 'All negatives live left of zero and all positives live right of it. So ANY positive beats ANY negative: even tiny 1 is greater than mighty-looking −100. Zero sits in the middle — bigger than every negative, smaller than every positive.' }, + { kind: 'concept', head: 'Among negatives, closer to zero wins', body: 'Between two negatives, the one CLOSER to zero is greater, because it\'s further right. So −4 > −9, even though 9 is a bigger digit than 4. Think temperature: −4° is warmer than −9°.' }, + { kind: 'example', head: 'Warm-up: −3 or 1?', body: '1 is positive, so it sits right of zero. −3 sits left of zero.\nRight beats left.\n1 > −3.' }, + { kind: 'example', head: 'Two negatives: −4 or −9?', body: 'Both are left of zero. −4 is only 4 steps out; −9 is 9 steps out.\n−4 sits closer to zero, so it\'s further right.\n−4 > −9.' }, + { kind: 'example', head: 'And again: −1 or −7?', body: 'Distance from zero: −1 is 1 step, −7 is 7 steps.\nCloser to zero wins among negatives.\n−1 > −7.' }, + { kind: 'example', head: 'Order −2, 0, −5', body: 'Place them: −5 is furthest left, then −2, then 0.\nLeast to greatest reads left to right.\nAnswer: −5, −2, 0.' }, + { kind: 'example', head: 'Order −3, 2, −5', body: 'Sort by position: −5 is leftmost, −3 comes next, and 2 sits on the positive side.\nSo −5 < −3 < 2.\nLeast to greatest: −5, −3, 2.' }, + { kind: 'example', head: 'Real life: coldest city', body: 'Overnight temperatures: Oslo −8°, Denver 3°, Chicago −2°. Which is coldest?\nColdest = smallest = furthest left: −8 < −2 < 3.\nOslo is coldest, and Denver is warmest.' }, + { kind: 'protip', head: 'Sketch a mini number line', body: 'For any ordering question, draw a quick line, mark 0 in the middle, and drop a dot for each number. Then just read the dots left to right — the ordering does itself. Ten seconds of sketching beats a minute of second-guessing.' }, + { kind: 'trap', head: 'Trap: big digit, small number', body: 'Kids see −10 and −2 and think −10 is bigger because 10 beats 2. Backwards! A bigger digit after a minus means further LEFT, so −10 < −2. Negative numbers reverse the size order of their digits.' }, + { kind: 'summary', head: 'One line rules them all', body: 'Right is bigger, left is smaller — everywhere on the number line. Every positive beats every negative, with zero in between. Among negatives, closer to zero is greater. Sketch the line and read your answer!' }, + ], + '6.NS-9': [ + { kind: 'objective', head: 'Opposites & absolute value', body: 'Today you will flip numbers to their opposites and measure distance from zero with absolute value. Two simple ideas — a mirror and a ruler — that power all of integer math. You\'ll even stack them together.' }, + { kind: 'concept', head: 'Opposites: the mirror across zero', body: 'The opposite of a number is its mirror image on the other side of 0, the same distance away. The opposite of 5 is −5; the opposite of −5 is 5. Zero is its own opposite — it\'s standing on the mirror.' }, + { kind: 'concept', head: 'Opposite of an opposite goes home', body: 'Flip a number twice and you\'re back where you started: −(−n) = n. The opposite of the opposite of 3 is… 3. Every extra minus sign is one more flip across zero.' }, + { kind: 'concept', head: 'Absolute value: the distance ruler', body: 'The bars |n| measure how far n is from zero — nothing more. Distance can\'t be negative, so |n| is always 0 or positive. Opposites like 6 and −6 have the SAME absolute value, because they\'re the same distance out.' }, + { kind: 'example', head: 'Warm-up: opposite of 7', body: '7 sits seven steps right of zero.\nIts mirror image is seven steps LEFT.\nThe opposite of 7 is −7.' }, + { kind: 'example', head: 'Opposite of −15', body: '−15 is fifteen steps left of zero.\nFlip across the mirror: fifteen steps right.\nThe opposite of −15 is 15.' }, + { kind: 'example', head: 'Absolute value: |−12|', body: 'Ask the ruler: how far is −12 from 0?\nTwelve steps.\n|−12| = 12.' }, + { kind: 'example', head: 'Careful now: |9|', body: 'The bars don\'t flip anything — they just measure.\n9 is nine steps from zero.\n|9| = 9. Still positive, no change.' }, + { kind: 'example', head: 'Double flip: −(−3)', body: 'What is the opposite of (the opposite of −3)?\nFirst flip: opposite of −3 is 3. Second flip: opposite of 3 is −3.\nAnswer: −3 — two flips bring you home.' }, + { kind: 'example', head: 'Mix them: |−8| vs the opposite of 8', body: '|−8| measures distance: 8. The opposite of 8 flips it: −8.\nSame starting digit, totally different answers!\n|−8| = 8, but the opposite of 8 is −8. Bars measure; the minus sign flips.' }, + { kind: 'protip', head: 'Mirror or ruler?', body: 'When you see a problem, ask which tool it wants. "Opposite" = mirror: flip the sign. "Absolute value" = ruler: report the distance, always 0 or positive. Naming the tool first stops sign confusion cold.' }, + { kind: 'trap', head: 'Trap: treating bars like parentheses', body: 'Absolute value bars are NOT parentheses: |−5| = 5, not −5. The bars erase direction and keep only distance. If your absolute value ever comes out negative, the ruler is broken — recheck.' }, + { kind: 'trap', head: 'Trap: "opposite" means make it negative', body: 'The opposite isn\'t always negative — it\'s the OTHER side of zero. The opposite of −15 is positive 15. Flip the sign the number already has; don\'t just slap on a minus.' }, + { kind: 'summary', head: 'Flip and measure', body: 'Opposite = mirror across zero: flip the sign, and two flips return home (−(−n) = n). Absolute value = distance from zero: always 0 or positive, and opposites share it. Ask "mirror or ruler?" and the answer follows.' }, + ], + '6.NS-10': [ + { kind: 'objective', head: 'Grid distances & shape sides', body: 'Today you will find the distance between points on the coordinate plane — no ruler needed. When points line up on a grid line, one subtraction gives the distance. Then you\'ll use it to measure the sides of rectangles drawn from corner points.' }, + { kind: 'concept', head: 'Same x? Measure vertically', body: 'If two points share an x-coordinate, they sit on the same vertical line — one directly above the other. The distance is just how far apart the y-values are: |y₁ − y₂|. The absolute value keeps distance positive no matter which point you name first.' }, + { kind: 'concept', head: 'Same y? Measure horizontally', body: 'If two points share a y-coordinate, they line up side by side on a horizontal line. Distance = |x₁ − x₂|. Spot which coordinate MATCHES, then subtract the pair that differs.' }, + { kind: 'concept', head: 'Crossing zero adds distances', body: 'When one coordinate is negative and the other positive, the path crosses zero. From −2 to 5 is 2 steps to reach zero plus 5 more: 7 total. The subtraction agrees: 5 − (−2) = 5 + 2 = 7 — subtracting a negative adds.' }, + { kind: 'concept', head: 'Rectangles from corners', body: 'Given a rectangle\'s corner points, its sides run along grid lines. Width = the gap between the x-values; height = the gap between the y-values. Two subtractions and you know every side.' }, + { kind: 'example', head: 'Warm-up: (0, 0) to (0, 6)', body: 'Both points have x = 0, so the path is vertical.\nSubtract y-values: |6 − 0| = 6.\nDistance: 6 units.' }, + { kind: 'example', head: 'Vertical: (3, 2) to (3, 7)', body: 'The x-coordinates match (both 3), so measure up-down.\n|7 − 2| = 5.\nDistance: 5 units.' }, + { kind: 'example', head: 'Horizontal: (1, 4) to (6, 4)', body: 'The y-coordinates match (both 4), so measure left-right.\n|6 − 1| = 5.\nDistance: 5 units.' }, + { kind: 'example', head: 'Across zero: (−2, 4) to (5, 4)', body: 'Same y, so subtract the x-values: 5 − (−2).\nSubtracting a negative adds: 5 + 2 = 7.\nDistance: 7 units — 2 steps to the y-axis, then 5 more.' }, + { kind: 'example', head: 'Another crossing: (−3, 1) to (4, 1)', body: 'Same y = 1, so it\'s horizontal.\n|4 − (−3)| = |4 + 3| = 7.\nDistance: 7 units. Check by counting: 3 steps from −3 to 0, then 4 steps to 4.' }, + { kind: 'example', head: 'Rectangle sides from corners', body: 'Corners: (1, 1), (5, 1), (5, 4), (1, 4).\nWidth: x goes from 1 to 5, so |5 − 1| = 4. Height: y goes from 1 to 4, so |4 − 1| = 3.\nThe sides are 4 and 3 — and the perimeter would be 4 + 3 + 4 + 3 = 14.' }, + { kind: 'protip', head: 'Match first, subtract second', body: 'Start every problem by asking: which coordinate is the SAME in both points? That tells you the direction (same x → vertical, same y → horizontal). Then subtract the coordinates that differ and take the absolute value. Match, subtract, done.' }, + { kind: 'trap', head: 'Trap: 5 − (−2) is not 3', body: 'When a coordinate is negative, watch the subtraction: 5 − (−2) = 5 + 2 = 7, NOT 3. The two minus signs team up into a plus, because you\'re crossing zero. If you get 3, you dropped a sign — count the steps on the line to confirm 7.' }, + { kind: 'summary', head: 'One subtraction, real distance', body: 'Same x means vertical: distance = |y₁ − y₂|. Same y means horizontal: distance = |x₁ − x₂|. Crossing zero? Subtracting a negative ADDS the distances. For rectangles, the x-gap is the width and the y-gap is the height.' }, + ], +}; diff --git a/src/data/lessonSlides/rp.ts b/src/data/lessonSlides/rp.ts new file mode 100644 index 0000000..e2c0cec --- /dev/null +++ b/src/data/lessonSlides/rp.ts @@ -0,0 +1,181 @@ +import type { SlideBank } from './types'; + +// 6.RP — Ratios & Proportions. 12–14 slides per lesson, ~3 short sentences +// each, written for a 10–12-year-old: objective → concepts → simplest-to-fuller +// examples → pro tip → trap(s) → summary. +export const RP_SLIDES: SlideBank = { + '6.RP-1': [ + { kind: 'objective', head: 'Meet the ratio', body: 'Today you will compare two amounts using a ratio — a super-useful math tool. You will write ratios, put them in the right order, and shrink them to their simplest form. By the end, ratios will feel like a secret code you can read.' }, + { kind: 'concept', head: 'A ratio compares two amounts', body: 'A ratio says how two amounts stack up, like 3 red marbles to 2 blue ones. You can write it three ways: 3:2, "3 to 2", or as the fraction 3/2. All three mean the exact same comparison.' }, + { kind: 'concept', head: 'Order matters — a lot', body: '3:2 and 2:3 are NOT the same ratio. The first number always matches the first thing named. If a question asks for "apples to oranges", the apple count goes first, no matter which number is bigger.' }, + { kind: 'concept', head: 'Scale it up or down together', body: 'Multiply or divide BOTH parts of a ratio by the same number and the comparison stays the same. 2:3 becomes 4:6 (both × 2) or 20:30 (both × 10). Dividing both parts by a common factor is called simplifying.' }, + { kind: 'concept', head: 'Simplest form = smallest whole numbers', body: 'A ratio is in simplest form when no number divides evenly into both parts anymore. 4:6 simplifies to 2:3 because both divide by 2. 2:3 is done — nothing bigger than 1 goes into both 2 and 3.' }, + { kind: 'example', head: 'Write a ratio: 3 cats, 4 dogs', body: 'What is the ratio of cats to dogs?\nCats are named first, so their number goes first: 3. Dogs come second: 4. The ratio is 3:4 — no simplifying needed, since nothing divides both.' }, + { kind: 'example', head: 'Simplify: 4 apples to 6 oranges', body: 'Apples to oranges = 4:6.\nBoth numbers divide by 2: 4 ÷ 2 = 2 and 6 ÷ 2 = 3. Simplest form: 2:3.' }, + { kind: 'example', head: 'Simplify: 5 cats to 10 dogs', body: 'Cats to dogs = 5:10.\nBoth divide by 5: 5 ÷ 5 = 1 and 10 ÷ 5 = 2. Simplest form: 1:2 — one cat for every two dogs.' }, + { kind: 'example', head: 'Watch the order: milk to flour', body: 'A recipe uses 2 cups flour and 3 cups milk. Ratio of MILK to flour?\nMilk is asked first, so milk\'s number leads: 3. Flour follows: 2. Answer: 3:2 — not 2:3!' }, + { kind: 'example', head: 'Simplify: 6 blue to 9 red', body: 'Blue to red = 6:9.\nFind the common factor: both divide by 3. 6 ÷ 3 = 2 and 9 ÷ 3 = 3. Simplest form: 2:3.' }, + { kind: 'example', head: 'Bigger numbers: 8 boys to 12 girls', body: 'Boys to girls = 8:12.\nBoth divide by 4: 8 ÷ 4 = 2 and 12 ÷ 4 = 3. Simplest form: 2:3 — for every 2 boys there are 3 girls.' }, + { kind: 'protip', head: 'Hunt for the BIGGEST common factor', body: 'You can simplify in small steps, but hunting the biggest common factor is faster. For 8:12, dividing by 4 finishes in one move; dividing by 2 twice also works. Either way, keep dividing until nothing fits both numbers.' }, + { kind: 'trap', head: 'Trap: flipping the order', body: 'The #1 ratio mistake: writing the numbers in the order they appear in the story instead of the order the QUESTION asks. "Milk to flour" puts milk first even if flour was mentioned first. Always re-read which word comes first in the question.' }, + { kind: 'summary', head: 'Ratios in three moves', body: 'A ratio compares two amounts: write it 3:2 or "3 to 2". Match the order to the words in the question — first named, first written. Simplify by dividing both parts by the same number until you can\'t anymore.' }, + ], + '6.RP-2': [ + { kind: 'objective', head: 'How much for just ONE?', body: 'Today you will find unit rates — the amount for exactly one item, one hour, or one pound. It is the trick behind price tags, speed limits, and batting averages. One division unlocks it all.' }, + { kind: 'concept', head: 'A rate compares different units', body: 'A rate is a ratio between two DIFFERENT kinds of things, like miles and hours, or dollars and muffins. "150 miles in 3 hours" is a rate. Rates describe how one thing changes with another.' }, + { kind: 'concept', head: 'A unit rate is the amount for 1', body: 'A unit rate tells you the amount for exactly ONE unit: dollars per 1 muffin, miles per 1 hour. That little word "per" means "for each one". Unit rates make everything easy to compare.' }, + { kind: 'concept', head: 'Divide to find it', body: 'To get a unit rate, divide the total by the number of units. Cost per muffin = total money ÷ number of muffins. Miles per hour = total miles ÷ number of hours. The thing after "per" is what you divide BY.' }, + { kind: 'example', head: 'Warm-up: 10 stickers, 5 packs', body: 'How many stickers per pack?\nPer pack means divide by packs: 10 ÷ 5 = 2. Each pack holds 2 stickers.' }, + { kind: 'example', head: 'Speed: 150 miles in 3 hours', body: 'Miles per hour means miles ÷ hours.\n150 ÷ 3 = 50. The car travels 50 miles each hour — that\'s 50 mph.' }, + { kind: 'example', head: 'Price: 6 muffins cost $9', body: 'Cost per muffin means money ÷ muffins.\n$9 ÷ 6: since 6 × 1 = 6 with $3 left, and $3 ÷ 6 = $0.50, the answer is $1.50. Each muffin costs $1.50.' }, + { kind: 'example', head: 'Price: 4 notebooks cost $10', body: 'Divide cost by notebooks: $10 ÷ 4.\n4 × 2 = 8, leaving $2. Then $2 ÷ 4 = $0.50. Each notebook costs $2.50.' }, + { kind: 'example', head: 'Small answer: 8 apples cost $4', body: 'Cost per apple = $4 ÷ 8.\nFour split among eight is less than a dollar each: 4 ÷ 8 = 0.50. Each apple costs $0.50 — fifty cents.' }, + { kind: 'example', head: 'Running rate: 100 m in 20 s', body: 'Meters per second means meters ÷ seconds.\n100 ÷ 20 = 5. The runner covers 5 meters every second.' }, + { kind: 'protip', head: '"Per" points at the divider', body: 'Whatever comes right after "per" is the number you divide BY. Dollars per POUND? Divide by pounds. Miles per HOUR? Divide by hours. Spot the "per" word and the setup writes itself.' }, + { kind: 'trap', head: 'Trap: dividing the wrong way', body: 'For "cost per muffin", kids often compute muffins ÷ money and get a weird answer. The money goes ON TOP, and you divide by muffins. Check with common sense: 6 muffins for $9 should cost between $1 and $2 each — not 0.67!' }, + { kind: 'summary', head: 'One division does it', body: 'A rate compares two different units; a unit rate is the amount for exactly 1. Divide the total by the number of units — "per" tells you what to divide by. Then sanity-check that the size of your answer makes sense.' }, + ], + '6.RP-3': [ + { kind: 'objective', head: 'Ratio tables: pattern machines', body: 'Today you will use ratio tables to find equivalent ratios fast. Spot the pattern in a table, and you can predict any missing value. It is like having a machine that scales recipes, prices, and more.' }, + { kind: 'concept', head: 'Equivalent ratios, same comparison', body: 'Equivalent ratios make the exact same comparison with different numbers: 1:3, 2:6, and 3:9 all say "three times as much". You build them by multiplying or dividing both parts by the same number.' }, + { kind: 'concept', head: 'A table keeps the pairs organized', body: 'A ratio table lines up matching pairs in rows or columns: 2 cups → 10 cookies, 4 cups → 20 cookies. Every row is an equivalent ratio. Reading down or across, the pattern stays steady.' }, + { kind: 'concept', head: 'Move with the same multiplier', body: 'To go from one row to another, multiply BOTH numbers by the same amount. If cups double, cookies double too. Whatever you do to one column, you must do to the other — that\'s the golden rule of ratio tables.' }, + { kind: 'concept', head: 'Or find the "times what?" rule', body: 'Many tables hide a rule connecting input to output, like "output = input × 3". Test it on a row you know: does 2 × 3 = 6? Yes! Once the rule checks out, use it on ANY input — even huge ones.' }, + { kind: 'example', head: 'Find the rule: 2 → 6, 3 → 9', body: 'What does 5 map to?\nCheck the rule: 2 × 3 = 6 and 3 × 3 = 9, so output = input × 3. Then 5 × 3 = 15. Answer: 15.' }, + { kind: 'example', head: 'Another rule: 1 → 4, 2 → 8', body: 'What is the output for 6?\nThe rule: 1 × 4 = 4 and 2 × 4 = 8, so output = input × 4. Then 6 × 4 = 24. Answer: 24.' }, + { kind: 'example', head: 'Doubling: 4 pens cost $3', body: 'What do 8 pens cost?\n8 is exactly 4 × 2, so the price doubles too. $3 × 2 = $6. Eight pens cost $6.' }, + { kind: 'example', head: 'Tripling: 2 cups make 10 cookies', body: 'How many cookies from 6 cups?\n6 is 2 × 3, so triple the cookies. 10 × 3 = 30. Six cups make 30 cookies.' }, + { kind: 'example', head: 'Rule first: 3 → 12, 5 → 20, 7 → ?', body: 'Test the rule: 3 × 4 = 12 and 5 × 4 = 20, so output = input × 4.\nApply it: 7 × 4 = 28. The missing value is 28.' }, + { kind: 'example', head: 'Scaling down: 10 → 40, so 5 → ?', body: 'You can divide too! 5 is 10 ÷ 2, so divide the output by 2 as well.\n40 ÷ 2 = 20. The row reads 5 → 20.' }, + { kind: 'protip', head: 'Check the rule on TWO rows', body: 'Before trusting a pattern, test it on two different rows. If 2 → 6 and 3 → 9 both fit "× 3", the rule is solid. One row can fool you; two rows almost never lie.' }, + { kind: 'trap', head: 'Trap: scaling only one column', body: 'The classic table mistake: doubling the cups but forgetting to double the cookies. Whatever you multiply one column by, multiply the other by too. A ratio table only works when both sides move together.' }, + { kind: 'summary', head: 'Tables tame ratios', body: 'Equivalent ratios multiply BOTH parts by the same number. In a table, move between rows with one multiplier, or find the input → output rule and test it twice. Both columns always move together!' }, + ], + '6.RP-4': [ + { kind: 'objective', head: 'Two flavors of ratio', body: 'Today you will learn to tell apart part-to-part ratios (boys to girls) and part-to-whole ratios (boys to the whole class). One tiny word — "whole" or "all" — changes the entire answer. You will spot it every time.' }, + { kind: 'concept', head: 'Part-to-part: group vs group', body: 'A part-to-part ratio compares two groups directly, like boys to girls or red paint to blue paint. Neither number is the total. "3 boys to 2 girls" is part-to-part: 3:2.' }, + { kind: 'concept', head: 'Part-to-whole: group vs everything', body: 'A part-to-whole ratio compares one group to the TOTAL, like boys to all students. Words like "whole", "all", "total", or "out of" are your signal. This kind can also be written as a fraction of the whole.' }, + { kind: 'concept', head: 'Add the parts to build the whole', body: 'The whole usually is not given — you build it by ADDING the parts. If a class has 3 boys to 2 girls, the whole is 3 + 2 = 5 parts. Then boys to the whole class is 3:5, and boys are 3/5 of the class.' }, + { kind: 'example', head: 'Warm-up: 3 boys, 2 girls', body: 'Ratio of boys to the whole class?\nBuild the whole: 3 + 2 = 5. Boys to whole = 3 to 5. Answer: 3:5.' }, + { kind: 'example', head: 'Fruit bowl: 4 apples, 6 pears', body: 'Ratio of apples to ALL the fruit?\nTotal fruit = 4 + 6 = 10, so apples to total = 4:10. Both divide by 2: answer 2:5.' }, + { kind: 'example', head: 'Paint mix: 2 red to 3 blue', body: 'What FRACTION of the mix is red?\nWhole = 2 + 3 = 5 parts. Red is 2 of those 5 parts. Answer: 2/5 of the paint is red.' }, + { kind: 'example', head: 'Team: 7 forwards, 3 defenders', body: 'Ratio of defenders to the whole team?\nWhole team = 7 + 3 = 10 players. Defenders to whole = 3 to 10. Answer: 3:10.' }, + { kind: 'example', head: 'Chips: 5 red, 5 blue', body: 'What fraction of the chips are red?\nWhole = 5 + 5 = 10 chips. Red = 5 out of 10 = 5/10. Simplify: 1/2 — half the chips are red.' }, + { kind: 'example', head: 'Both flavors, same story', body: 'A garden has 6 roses and 9 tulips.\nPart-to-part, roses to tulips: 6:9 = 2:3. Part-to-whole, roses to all flowers: whole = 6 + 9 = 15, so 6:15 = 2:5. Same garden, two different ratios!' }, + { kind: 'protip', head: 'Underline the second word', body: 'Read the question and underline what comes after "to": is it another GROUP or the WHOLE? "Boys to girls" = part-to-part. "Boys to students" or "boys to the class" = part-to-whole — add first! That one underline prevents most mistakes.' }, + { kind: 'trap', head: 'Trap: skipping the addition', body: 'For "3 boys to 2 girls, what fraction are boys?", the answer is NOT 3/2. You must add the parts first: 3 + 2 = 5, so boys are 3/5. Whenever the question mentions the whole, the total, or a fraction — ADD before you answer.' }, + { kind: 'trap', head: 'Trap: treating a ratio number as a count', body: 'A 2:3 ratio does not mean there are exactly 2 and 3 things — there might be 20 and 30! Ratio numbers show the pattern, not the real counts. Only add ratio parts to find the whole IN PARTS: 2 + 3 = 5 parts.' }, + { kind: 'summary', head: 'Part or whole? Check, then add', body: 'Part-to-part compares two groups; part-to-whole compares one group to the total. Build the whole by adding the parts first. Signal words like "all", "total", and "fraction" mean the whole is involved!' }, + ], + '6.RP-5': [ + { kind: 'objective', head: 'Percent: out of 100', body: 'Today you will crack percents — they are just "out of 100" in disguise. You will turn percents into decimals, find a percent OF a number, and use shortcuts like "50% means half". Discounts and game stats, here you come.' }, + { kind: 'concept', head: 'Percent means per hundred', body: 'The word percent literally means "per hundred". 25% is 25 out of every 100 — the same as 25/100 or the decimal 0.25. If 25% of students walk to school, that\'s 25 out of every 100 students.' }, + { kind: 'concept', head: '"Of" means multiply', body: 'To find a percent OF a number, turn the percent into a decimal and multiply. Move the decimal point two places LEFT: 20% becomes 0.20. Then 20% of 45 is just 0.20 × 45.' }, + { kind: 'concept', head: 'Know the friendly benchmarks', body: 'Some percents are instant: 100% is the whole thing, 50% is half, 25% is a quarter, and 10% moves the decimal one place left. Memorize these four and tons of problems become mental math.' }, + { kind: 'example', head: 'Easiest: 50% of 80', body: '50% means one half.\nHalf of 80 = 80 ÷ 2 = 40. Answer: 40.' }, + { kind: 'example', head: 'Quick trick: 10% of 250', body: '10% moves the decimal point one place left.\n250 becomes 25.0. Answer: 10% of 250 = 25.' }, + { kind: 'example', head: 'Quarter power: 25% of 40', body: '25% means one quarter, so divide by 4.\n40 ÷ 4 = 10. Answer: 25% of 40 = 10.' }, + { kind: 'example', head: 'Decimal method: 20% of 45', body: 'Turn 20% into a decimal: 0.20.\nMultiply: 0.20 × 45. Since 0.2 × 45 = 45 ÷ 5 = 9, the answer is 9.' }, + { kind: 'example', head: 'Fraction to percent: 3/4', body: 'Write 3/4 as a percent.\n3 ÷ 4 = 0.75, and 0.75 means 75 per hundred. Answer: 75%.' }, + { kind: 'example', head: 'Build from 10%: 30% of 60', body: 'First find 10% of 60: move the point — 6.\n30% is three of those: 3 × 6 = 18. Answer: 30% of 60 = 18.' }, + { kind: 'protip', head: '10% is your master key', body: 'Almost any percent can be built from 10% chunks. 10% of 60 is 6, so 20% is 12, 30% is 18, and 5% is half a chunk — 3. Find 10% first, then stack the chunks you need.' }, + { kind: 'trap', head: 'Trap: multiplying by the raw percent', body: '20% of 45 is NOT 20 × 45 = 900 — way too big! Convert the percent to a decimal first: move the point two places left, so 20% = 0.20. Then multiply. Ask yourself: 20% is a small slice, so the answer must be SMALLER than 45.' }, + { kind: 'summary', head: 'Percents, decoded', body: 'Percent means per hundred: 25% = 25/100 = 0.25. To find a percent OF a number, convert to a decimal and multiply. Use benchmarks — 50% is half, 25% is a quarter, 10% shifts the point — to make it mental math.' }, + ], + '6.RP-6': [ + { kind: 'objective', head: 'Switch units with a rate', body: 'Today you will convert units — feet to inches, meters to centimeters, quarts to cups — using rates. Every conversion is just a ratio like "12 inches per 1 foot". Pick multiply or divide, and the units fall into place.' }, + { kind: 'concept', head: 'A conversion IS a rate', body: 'Conversion facts are rates in disguise: 12 inches per 1 foot, 100 cm per 1 meter, 4 cups per 1 quart. Each one says how many small units fit inside one big unit. Treat them exactly like the unit rates you already know.' }, + { kind: 'concept', head: 'Big unit → small unit: multiply', body: 'Going from a bigger unit to a smaller one means you\'ll have MORE of them, so multiply. 3 feet becomes 3 × 12 = 36 inches. One big thing splits into many small pieces.' }, + { kind: 'concept', head: 'Small unit → big unit: divide', body: 'Going from a smaller unit to a bigger one means FEWER of them, so divide. 48 inches becomes 48 ÷ 12 = 4 feet. Many small pieces bundle up into a few big ones.' }, + { kind: 'concept', head: 'Always sense-check the size', body: 'After converting, ask: should my number be bigger or smaller than what I started with? Inches are tiny, so 3 feet should give a BIGGER number of inches. If the direction feels backwards, you picked the wrong operation.' }, + { kind: 'example', head: 'Feet to inches: 3 feet', body: 'Rate: 1 foot = 12 inches. Feet are bigger, so multiply.\n3 × 12 = 36. Answer: 36 inches.' }, + { kind: 'example', head: 'Inches to feet: 48 inches', body: 'Rate: 12 inches = 1 foot. Inches are smaller, so divide.\n48 ÷ 12 = 4. Answer: 4 feet.' }, + { kind: 'example', head: 'Quarts to cups: 2 quarts', body: 'Rate: 1 quart = 4 cups. Quarts are bigger, so multiply.\n2 × 4 = 8. Answer: 8 cups.' }, + { kind: 'example', head: 'Feet to inches: 5 feet', body: 'Rate: 1 foot = 12 inches. Multiply: 5 × 12.\n5 × 10 = 50 and 5 × 2 = 10, so 50 + 10 = 60. Answer: 60 inches.' }, + { kind: 'example', head: 'Meters to cm: 3.5 meters', body: 'Rate: 1 m = 100 cm. Meters are bigger, so multiply.\n3.5 × 100 = 350 — the decimal point slides two places right. Answer: 350 cm.' }, + { kind: 'example', head: 'Cups to quarts: 12 cups', body: 'Rate: 4 cups = 1 quart. Cups are smaller, so divide.\n12 ÷ 4 = 3. Answer: 3 quarts.' }, + { kind: 'protip', head: 'Say the rate out loud first', body: 'Before touching numbers, say the conversion as a sentence: "12 inches PER foot." Then ask which unit you are heading toward — smaller means multiply, bigger means divide. Two seconds of talking saves the whole problem.' }, + { kind: 'trap', head: 'Trap: multiplying both directions', body: 'Kids often multiply no matter what: 48 inches × 12 = 576 "feet" — but a person is not 576 feet tall! Going to a BIGGER unit needs division: 48 ÷ 12 = 4 feet. Always check whether your answer should grow or shrink.' }, + { kind: 'summary', head: 'Rates run the conversion', body: 'Every conversion is a rate like 12 inches per 1 foot. Heading to a smaller unit? Multiply. Heading to a bigger unit? Divide. Finish with a sense-check: did the number move in the direction it should?' }, + ], + '6.RP-7': [ + { kind: 'objective', head: 'Percents in the real world', body: 'Today you will use percents where they actually live: tips at restaurants, tax at the store, and discounts on sale tags. You will find a percent of a number fast, then decide — add it on, or take it off?' }, + { kind: 'concept', head: 'Percent of a number, refreshed', body: 'A percent is a fraction out of 100, so 25% = 25/100 = 1/4. To find X% of Y, slide the decimal point two places LEFT to get a decimal, then multiply. 25% of 80 is 0.25 × 80.' }, + { kind: 'concept', head: 'Build percents from 10% and 5%', body: 'For odd percents like 15%, use chunks. 10% of 60 is 6 (move the point). 5% is half of that: 3. So 15% of 60 = 6 + 3 = 9. Chunks turn scary percents into easy addition.' }, + { kind: 'concept', head: 'Discount subtracts, tax and tip add', body: 'A discount ("30% off") comes OFF the price — subtract it. Tax and tips go ON TOP — add them. Same percent math either way; the story tells you whether the final price goes down or up.' }, + { kind: 'example', head: 'Straight percent: 25% of 80', body: '25% = 0.25, or just "one quarter".\n80 ÷ 4 = 20, or 0.25 × 80 = 20. Answer: 20.' }, + { kind: 'example', head: 'Point slide: 10% of 250', body: '10% moves the decimal point one place left.\n250 → 25. Answer: 25.' }, + { kind: 'example', head: 'Chunks: 15% of 60', body: '10% of 60 = 6. 5% is half of 10%, so 5% of 60 = 3.\nAdd the chunks: 6 + 3 = 9. Answer: 15% of 60 = 9.' }, + { kind: 'example', head: 'Half off-ish: 50% of 86', body: '50% is exactly half.\n86 ÷ 2 = 43. Answer: 43.' }, + { kind: 'example', head: 'Discount: $40 shirt, 30% off', body: 'First find the discount: 10% of $40 = $4, so 30% = 3 × $4 = $12 off.\nSubtract from the original: $40 − $12 = $28. Sale price: $28.' }, + { kind: 'example', head: 'Tip: 20% on a $35 meal', body: 'Find the tip: 10% of $35 = $3.50, so 20% = 2 × $3.50 = $7.\nTips ADD on: $35 + $7 = $42. Total paid: $42.' }, + { kind: 'protip', head: 'Ask: up or down?', body: 'Before computing, decide which way the price moves. "Off", "discount", "sale" → price goes DOWN. "Tax", "tip", "increase" → price goes UP. Write a little arrow next to the problem so you don\'t forget at the end.' }, + { kind: 'trap', head: 'Trap: stopping at the percent amount', body: 'For the $40 shirt at 30% off, $12 is NOT the answer — that\'s just the discount! The question wants the SALE PRICE: $40 − $12 = $28. Always re-read what the question asks: the change, or the final price?' }, + { kind: 'trap', head: 'Trap: subtracting when you should add', body: '"% off" means subtract, but "% tax" and "% tip" mean ADD. Kids who subtract tax get a store that pays THEM — nice try! Match the operation to the story before you finish.' }, + { kind: 'summary', head: 'Percent power, applied', body: 'Convert the percent to a decimal (point two places left) and multiply — or build it from 10% chunks. Discounts subtract from the price; tax and tips add on. And always finish the problem: give the final price, not just the percent amount.' }, + ], + '6.RP-8': [ + { kind: 'objective', head: 'Speed, prices & the better deal', body: 'Today you will compute speeds, unit prices, and — the superpower — which deal is actually cheaper. Stores count on people not checking the price per pound. After today, they can\'t fool you.' }, + { kind: 'concept', head: 'Unit rate = amount per 1', body: 'A unit rate is "per one": miles per 1 hour, dollars per 1 pound, cost per 1 cookie. It squishes any rate down to a single, comparable number. That\'s what "mph" and "price per lb" tags really are.' }, + { kind: 'concept', head: 'Divide total by units', body: 'To find a unit rate, divide the total by the number of units. 180 miles in 3 hours → 180 ÷ 3 = 60 mph. The unit named ON TOP (miles) gets divided by the unit on the bottom (hours).' }, + { kind: 'concept', head: 'Compare deals with unit prices', body: 'To pick the better deal, find the unit price of EACH option, then choose the smaller one. You cannot compare "4 lbs for $10" and "6 lbs for $12" directly — but $2.50/lb vs $2.00/lb is instant.' }, + { kind: 'example', head: 'Speed: 180 miles in 3 hours', body: 'Speed = miles ÷ hours.\n180 ÷ 3 = 60. The speed is 60 mph.' }, + { kind: 'example', head: 'Speed: 240 miles in 4 hours', body: 'Miles ÷ hours: 240 ÷ 4.\n24 ÷ 4 = 6, so 240 ÷ 4 = 60. Speed: 60 mph.' }, + { kind: 'example', head: 'Unit price: 12 cookies for $6', body: 'Cost per cookie = $6 ÷ 12.\nSix split among twelve is half a dollar each: 6 ÷ 12 = 0.50. Each cookie costs $0.50.' }, + { kind: 'example', head: 'Unit price: 8 oranges for $4', body: 'Cost per orange = $4 ÷ 8.\n4 ÷ 8 = 0.50. Each orange costs $0.50 — fifty cents.' }, + { kind: 'example', head: 'Better deal: apples by the pound', body: 'Deal A: 4 lbs for $10. Deal B: 6 lbs for $12. Which is cheaper per pound?\nA: $10 ÷ 4 = $2.50 per lb. B: $12 ÷ 6 = $2.00 per lb.\nSmaller wins: Deal B, 6 lbs for $12.' }, + { kind: 'example', head: 'Better deal: juice boxes', body: 'Deal A: 5 boxes for $5. Deal B: 8 boxes for $6.\nA: $5 ÷ 5 = $1.00 per box. B: $6 ÷ 8 = $0.75 per box.\n$0.75 beats $1.00 — Deal B is the better buy.' }, + { kind: 'protip', head: 'Label every unit rate', body: 'Always write the unit next to your answer: $2.50/lb, 60 mph, $0.75 per box. Labels stop you from comparing dollars-per-pound to pounds-per-dollar by accident. A number without a label is a guess; a number with a label is an answer.' }, + { kind: 'trap', head: 'Trap: judging deals by the total', body: '"$12 is more than $10, so $10 is cheaper" — nope! The $12 deal gives you MORE pounds. Only the price PER POUND tells the truth: $2.00/lb beats $2.50/lb. Never compare totals; always compare unit prices.' }, + { kind: 'trap', head: 'Trap: flipping the division', body: 'A "mph" answer means miles go ON TOP: miles ÷ hours. Computing 3 ÷ 180 gives a tiny nonsense speed. Match the order of the units in the answer — the first-named unit is the one you divide.' }, + { kind: 'summary', head: 'Divide, label, compare', body: 'Unit rate = total ÷ number of units, with the "per" unit on the bottom. Label every answer (mph, $/lb) so units never flip. For deals, find each unit price and pick the smaller — totals lie, unit prices don\'t.' }, + ], + '6.RP-9': [ + { kind: 'objective', head: 'Convert like a pro', body: 'Today you will convert measurements — inches to feet, centimeters to meters, kilometers to meters — using ratio thinking. Learn five anchor facts and one direction rule, and every conversion becomes two steps.' }, + { kind: 'concept', head: 'Memorize the anchors', body: 'A few facts unlock everything: 12 in = 1 ft, 3 ft = 1 yd, 100 cm = 1 m, 1000 m = 1 km, and 16 oz = 1 lb. Each anchor says how many small units make one big unit. Keep them in your back pocket.' }, + { kind: 'concept', head: 'To a smaller unit: multiply', body: 'Converting to a SMALLER unit means you\'ll count MORE of them, so multiply by the anchor. 2 feet becomes 2 × 12 = 24 inches. Small pieces are plentiful.' }, + { kind: 'concept', head: 'To a bigger unit: divide', body: 'Converting to a BIGGER unit means FEWER of them, so divide by the anchor. 36 inches becomes 36 ÷ 12 = 3 feet. Big units gobble up many small ones.' }, + { kind: 'concept', head: 'Metric moves the decimal point', body: 'Metric anchors are powers of ten, so converting is just sliding the decimal point. Meters to centimeters: slide 2 places right (× 100). Meters to kilometers: slide 3 places left (÷ 1000). No long math needed!' }, + { kind: 'example', head: 'Feet to inches: 2 feet', body: 'Anchor: 1 ft = 12 in. Inches are smaller, so multiply.\n2 × 12 = 24. Answer: 24 inches.' }, + { kind: 'example', head: 'Yards to feet: 4 yards', body: 'Anchor: 1 yd = 3 ft. Feet are smaller, so multiply.\n4 × 3 = 12. Answer: 12 feet.' }, + { kind: 'example', head: 'Inches to feet: 36 inches', body: 'Anchor: 12 in = 1 ft. Feet are bigger, so divide.\n36 ÷ 12 = 3. Answer: 3 feet.' }, + { kind: 'example', head: 'Cm to meters: 250 cm', body: 'Anchor: 100 cm = 1 m. Meters are bigger, so divide.\n250 ÷ 100 = 2.5 — the decimal point slides two places left. Answer: 2.5 meters.' }, + { kind: 'example', head: 'Km to meters: 5 km', body: 'Anchor: 1 km = 1000 m. Meters are smaller, so multiply.\n5 × 1000 = 5000 — three zeros hop on. Answer: 5000 meters.' }, + { kind: 'example', head: 'Ounces to pounds: 48 oz', body: 'Anchor: 16 oz = 1 lb. Pounds are bigger, so divide.\n48 ÷ 16 = 3, since 16 × 3 = 48. Answer: 3 pounds.' }, + { kind: 'protip', head: 'Guess the size before you compute', body: 'Before converting, estimate: 250 cm is about the height of a door, so it should be "2-and-a-bit" meters — and 2.5 fits! If your computed answer is 25,000 meters, the estimate catches it instantly. Estimate first, compute second.' }, + { kind: 'trap', head: 'Trap: multiplying inches into feet', body: 'Inches → feet trips everyone up: kids multiply and get 36 in = 432 "feet". But feet are BIGGER, so 36 inches fits FEWER times: 36 ÷ 12 = 3 feet. Smaller-to-bigger always means divide.' }, + { kind: 'summary', head: 'Anchors + direction = done', body: 'Know the anchors: 12 in/ft, 3 ft/yd, 100 cm/m, 1000 m/km, 16 oz/lb. To a smaller unit, multiply; to a bigger unit, divide. Estimate the size first so a wrong direction can never sneak past you.' }, + ], + '6.RP-10': [ + { kind: 'objective', head: 'Scale anything with ratios', body: 'Today you put ratios to work: scaling recipes up, figuring out real counts from a ratio, and checking whether two ratios match. One idea — the scale factor — solves them all.' }, + { kind: 'concept', head: 'Equivalent ratios share a multiplier', body: 'Two ratios are equivalent when one is the other with BOTH parts multiplied by the same number. 2:3 × 4 gives 8:12, so 2:3 and 8:12 are equivalent. That shared multiplier is called the scale factor.' }, + { kind: 'concept', head: 'Find the scale factor by dividing', body: 'To scale from 4 servings to 6 servings, divide: 6 ÷ 4 = 1.5. That 1.5 is your scale factor — multiply EVERY ingredient by it. Recipes, teams, paint mixes: same move every time.' }, + { kind: 'concept', head: 'From ratio to real counts', body: 'A ratio like dogs:cats = 3:5 shows the pattern, not the real numbers. If there are actually 20 cats, find the multiplier: 20 ÷ 5 = 4. Then every ratio number gets × 4 — so dogs = 3 × 4 = 12.' }, + { kind: 'concept', head: 'Ratio tables organize the scaling', body: 'Write the known pair as a row — 4 servings | 6 cups — then scale to a new row. Multiply both entries by the same factor and the table stays truthful. It\'s the same golden rule: both sides move together.' }, + { kind: 'example', head: 'Check equivalence: 2:3 and 8:12', body: 'Is 2:3 equivalent to 8:12?\nTry a multiplier: 2 × 4 = 8 and 3 × 4 = 12. Both parts use × 4, so YES — they are equivalent.' }, + { kind: 'example', head: 'Scale a recipe: 4 servings → 6', body: '4 servings need 6 cups of flour. How much flour for 6 servings?\nScale factor = 6 ÷ 4 = 1.5. Flour = 6 × 1.5 = 9. Answer: 9 cups.' }, + { kind: 'example', head: 'Triple batch: 3 eggs per 12 cookies', body: 'How many eggs for 36 cookies?\n36 ÷ 12 = 3, so you\'re making 3 times the cookies. Eggs = 3 × 3 = 9. Answer: 9 eggs.' }, + { kind: 'example', head: 'Real counts: dogs to cats 3:5', body: 'A shelter\'s dogs:cats ratio is 3:5, and there are 20 cats. How many dogs?\nMultiplier = 20 ÷ 5 = 4. Dogs = 3 × 4 = 12. Answer: 12 dogs.' }, + { kind: 'example', head: 'Unit-rate route: 5 packs cost $20', body: 'What do 8 packs cost?\nFirst find the price per pack: $20 ÷ 5 = $4. Then scale up: $4 × 8 = $32. Answer: $32.' }, + { kind: 'example', head: 'Mix it: juice 2:5 with 10 cups juice', body: 'A punch uses juice:soda = 2:5. With 10 cups of juice, how much soda?\nMultiplier = 10 ÷ 2 = 5. Soda = 5 × 5 = 25. Answer: 25 cups of soda.' }, + { kind: 'protip', head: 'Two roads: scale factor or unit rate', body: 'Stuck on a scaling problem? You have two roads. Road 1: find the scale factor (new ÷ old) and multiply everything. Road 2: drop to the unit rate (per 1) and build back up. If one road looks muddy, take the other!' }, + { kind: 'trap', head: 'Trap: scaling only one side', body: 'The classic blunder: doubling the flour but not the eggs, or multiplying just one ratio part. BOTH parts of a ratio — and EVERY ingredient in a recipe — get the same scale factor. One-sided scaling breaks the ratio completely.' }, + { kind: 'summary', head: 'One factor rules them all', body: 'Equivalent ratios multiply both parts by one scale factor. Find that factor by dividing new by old, then multiply everything by it. When you have a real count, divide it by its ratio number to get the multiplier — then scale the rest.' }, + ], + '6.RP-11': [ + { kind: 'objective', head: 'Distance = rate × time', body: 'Today you will master the speed formula d = r × t, the equation behind every road trip. You will find distance, speed, OR time — whichever is missing — and learn why the units must match before you touch the numbers.' }, + { kind: 'concept', head: 'Speed is a rate', body: 'Speed tells you distance per unit of time: miles per hour, kilometers per hour, meters per second. A car at 60 mph covers 60 miles EACH hour. Speed is just a unit rate wearing a racing helmet.' }, + { kind: 'concept', head: 'The triangle: d over r · t', body: 'Distance, rate, and time link up as d = r × t. Picture a triangle with d on top and r and t on the bottom. Cover the one you want: d = r × t, r = d ÷ t, t = d ÷ r. One picture, three formulas.' }, + { kind: 'concept', head: 'Units must match FIRST', body: '"Miles per HOUR" only works with time in HOURS. If the time is in minutes, convert before computing: minutes ÷ 60 = hours, so 30 minutes = 0.5 hour. Mismatched units give confident wrong answers.' }, + { kind: 'example', head: 'Find distance: 12 mph for 3 hours', body: 'A cyclist rides at 12 mph for 3 hours. How far?\nWant distance: d = r × t = 12 × 3.\n12 × 3 = 36. Answer: 36 miles.' }, + { kind: 'example', head: 'Find speed: 240 km in 4 hours', body: 'A train covers 240 km in 4 hours. What is its speed?\nWant rate: r = d ÷ t = 240 ÷ 4.\n24 ÷ 4 = 6, so 240 ÷ 4 = 60. Answer: 60 km/h.' }, + { kind: 'example', head: 'Find time: 150 miles at 50 mph', body: 'How long does 150 miles take at 50 mph?\nWant time: t = d ÷ r = 150 ÷ 50.\n50 × 3 = 150, so t = 3. Answer: 3 hours.' }, + { kind: 'example', head: 'Convert first: 60 mph for 30 min', body: 'A car drives 60 mph. How far in 30 minutes?\nUnits clash — convert: 30 ÷ 60 = 0.5 hour.\nd = r × t = 60 × 0.5 = 30. Answer: 30 miles.' }, + { kind: 'example', head: 'Sailing: 20 km/h for 2 hours', body: 'A boat sails at 20 km/h for 2 hours. How far?\nd = r × t = 20 × 2 = 40. Answer: 40 km.' }, + { kind: 'example', head: 'Sprinting: 5 m/s for 1 minute', body: 'A runner moves 5 meters per second. How far in 1 minute?\nMatch units: 1 minute = 60 seconds.\nd = r × t = 5 × 60 = 300. Answer: 300 meters.' }, + { kind: 'protip', head: 'Circle what\'s missing', body: 'Read the problem and circle which of the three — distance, rate, time — is missing. The other two are given. Missing d? Multiply. Missing r or t? Divide the distance by the one you have. The circle picks the formula for you.' }, + { kind: 'trap', head: 'Trap: minutes pretending to be hours', body: 'At 60 mph for 30 minutes, computing 60 × 30 = 1800 miles is wildly wrong — that\'s New York to way past Denver! MPH needs HOURS: 30 minutes = 0.5 hour, so the real distance is 60 × 0.5 = 30 miles. Convert time before you multiply.' }, + { kind: 'trap', head: 'Trap: dividing the wrong pair', body: 'When finding speed, distance goes ON TOP: r = d ÷ t. Computing 4 ÷ 240 for the train gives a crawl of 0.0167 — obviously silly for a train. If your speed looks absurd, flip the division and check again.' }, + { kind: 'summary', head: 'Three friends, one triangle', body: 'd = r × t connects distance, rate, and time — cover the missing one in the triangle to pick your formula. Multiply for distance; divide the distance for rate or time. And ALWAYS match the units first: minutes become hours (÷ 60) before mph math.' }, + ], +}; diff --git a/src/data/lessonSlides/sp.ts b/src/data/lessonSlides/sp.ts new file mode 100644 index 0000000..321ec8a --- /dev/null +++ b/src/data/lessonSlides/sp.ts @@ -0,0 +1,158 @@ +import type { SlideBank } from './types'; + +// 6.SP — Statistics & Probability. 12–14 slides per lesson, ~3 short sentences +// each, written for a 10–12-year-old: objective → concepts → simplest-to-fuller +// examples → pro tip → trap(s) → summary. +export const SP_SLIDES: SlideBank = { + '6.SP-1': [ + { kind: 'objective', head: 'Find the "typical" number', body: 'Today you will learn three ways to describe the center of a bunch of numbers: mean, median, and mode. Each one answers "what\'s typical?" in its own way. By the end, you\'ll compute all three without breaking a sweat.' }, + { kind: 'concept', head: 'Mean: share it out evenly', body: 'The MEAN is the classic average. Add up ALL the values, then divide by how many values there are. It\'s like pooling everyone\'s candy and splitting it evenly.' }, + { kind: 'concept', head: 'Median: the middle one', body: 'The MEDIAN is the value sitting exactly in the middle — but ONLY after you sort the numbers from smallest to biggest. Half the values sit below it, half sit above. Sorting first is the golden rule.' }, + { kind: 'concept', head: 'Mode: the most popular', body: 'The MODE is the value that shows up MOST OFTEN. No adding, no dividing — just look for the repeat champion. A data set can even have two modes, or none at all if nothing repeats.' }, + { kind: 'example', head: 'Mean of 4, 6, 8', body: 'Add them up: 4 + 6 = 10, then 10 + 8 = 18.\nCount the values: there are 3.\nDivide: 18 ÷ 3 = 6. The mean is 6.' }, + { kind: 'example', head: 'Mean of 10, 20, 30', body: 'Add: 10 + 20 = 30, then 30 + 30 = 60.\nThere are 3 values.\nDivide: 60 ÷ 3 = 20. The mean is 20.' }, + { kind: 'example', head: 'Median of 3, 7, 5', body: 'Sort first: 3, 5, 7.\nNow pick the middle value — with 3 numbers, it\'s the 2nd one.\nThe median is 5. (Notice it is NOT 7, the middle of the unsorted list!)' }, + { kind: 'example', head: 'Median of 8, 2, 5, 9, 4', body: 'Sort: 2, 4, 5, 8, 9.\nFive values means the middle is the 3rd one.\nCount in: 2, 4, then 5. The median is 5.' }, + { kind: 'example', head: 'Mode of 2, 4, 4, 9', body: 'Tally each value: 2 appears once, 4 appears twice, 9 appears once.\nThe repeat champion is 4.\nThe mode is 4.' }, + { kind: 'example', head: 'All three at once: 3, 5, 5, 7', body: 'Mean: 3 + 5 + 5 + 7 = 20, and 20 ÷ 4 = 5.\nMedian: sorted already, middle two are 5 and 5, so the median is 5.\nMode: 5 appears twice — the mode is 5. All three centers agree here!' }, + { kind: 'protip', head: 'Cross off from both ends', body: 'To find a median fast, sort the list and cross off one number from EACH end, over and over. The last number standing is your median. It works every time and you can\'t lose count.' }, + { kind: 'trap', head: 'Trap: skipping the sort', body: 'The #1 median mistake is grabbing the middle of the UNSORTED list. The median of 3, 7, 5 is 5 — not 7. Always sort from smallest to biggest first, then find the middle.' }, + { kind: 'summary', head: 'Three centers, three moves', body: 'Mean: add everything, divide by the count. Median: sort first, then take the middle. Mode: spot the value that appears most often. Now you can describe "typical" three different ways!' }, + ], + '6.SP-2': [ + { kind: 'objective', head: 'Pick the RIGHT average', body: 'You know how to find the mean and the median. Today you will learn WHEN to use each one. One weird value can make the mean tell a fib — and you\'ll learn to catch it.' }, + { kind: 'concept', head: 'The mean uses every value', body: 'The mean adds up EVERYTHING, so every single value gets a vote. That\'s great when the data is balanced. But it also means one extreme value can drag the whole mean toward it.' }, + { kind: 'concept', head: 'Outliers pull the mean', body: 'An OUTLIER is a value far away from all the others — like a 100 sitting next to 2, 3, and 4. Outliers yank the mean toward themselves like a magnet. The mean stops looking "typical".' }, + { kind: 'concept', head: 'The median stands its ground', body: 'The median only cares about the MIDDLE position, not how big the extremes are. An outlier can be 100 or 1,000,000 — the middle value barely moves. That\'s why the median resists outliers.' }, + { kind: 'concept', head: 'Lopsided data? Choose median', body: 'When data is very lopsided — a few huge values or a few tiny ones — the median usually describes "typical" better. When data is balanced with no outliers, the mean works great. Look at the data BEFORE you pick.' }, + { kind: 'example', head: 'Warm-up: mean of 1, 2, 3, 4, 5', body: 'Add: 1 + 2 + 3 + 4 + 5 = 15.\nCount: 5 values.\nDivide: 15 ÷ 5 = 3. Balanced data — the mean of 3 feels truly typical.' }, + { kind: 'example', head: 'Enter the outlier: 2, 3, 4, 100', body: 'Mean: 2 + 3 + 4 + 100 = 109, and 109 ÷ 4 = 27.25.\nBut look — NONE of the first three values is anywhere near 27!\nThe 100 pulled the mean way up. The mean is misleading here.' }, + { kind: 'example', head: 'Same data, try the median', body: 'Sort 2, 3, 4, 100 — already sorted.\nWith 4 values, the middle two are 3 and 4. Their average: (3 + 4) ÷ 2 = 3.5.\nThe median is 3.5 — much more "typical" than 27.25. Median wins!' }, + { kind: 'example', head: 'Salaries: 30, 32, 35, 200', body: 'These are salaries in thousands, and the 200 is an outlier.\nMean: 30 + 32 + 35 + 200 = 297, and 297 ÷ 4 = 74.25 — nobody actually earns near that!\nMedian: middle two are 32 and 35, so (32 + 35) ÷ 2 = 33.5. Use the MEDIAN for "typical" here.' }, + { kind: 'example', head: 'Does the outlier move the median?', body: 'Take 4, 4, 10. Sorted, the middle value is 4 — median = 4.\nNow swap the 10 for 1,000: the list is 4, 4, 1000. The middle is STILL 4.\nThe median didn\'t budge. Outliers barely change the median — so the answer is NO.' }, + { kind: 'protip', head: 'Scan for weirdos first', body: 'Before choosing a center, scan the data for any value far from the pack. See one? Lean toward the median. See a nice balanced spread? The mean is safe. Ten seconds of scanning saves a misleading answer.' }, + { kind: 'trap', head: 'Trap: trusting the mean blindly', body: 'One huge or tiny value can make the mean totally misleading — like saying the "typical" salary is 74 thousand when most people earn near 32. Don\'t report a mean without checking for outliers. If the mean doesn\'t look like ANY of the data, something pulled it.' }, + { kind: 'summary', head: 'Match the center to the data', body: 'The mean uses every value, so outliers drag it around. The median is the middle and stands firm. Lopsided data or outliers → median. Balanced data → mean. Always peek at the data before you pick!' }, + ], + '6.SP-3': [ + { kind: 'objective', head: 'Measure the spread', body: 'Center tells you what\'s typical — SPREAD tells you how scattered the data is. Today you will measure spread three ways: range, IQR, and MAD. Two classes can have the same average but totally different spreads!' }, + { kind: 'concept', head: 'Range: max minus min', body: 'The RANGE is the simplest spread: biggest value minus smallest value. Range = maximum − minimum. A big range means the data stretches far; a range of 0 means every value is identical.' }, + { kind: 'concept', head: 'IQR: spread of the middle half', body: 'Sort the data and find the quartiles: the lower quartile (Q1) is the middle of the bottom half, and the upper quartile (Q3) is the middle of the top half. IQR = Q3 − Q1. It measures how spread out the MIDDLE HALF of the data is, so outliers can\'t fool it.' }, + { kind: 'concept', head: 'MAD: average distance from the mean', body: 'MAD stands for Mean Absolute Deviation — a fancy name for a simple idea. Find the mean, measure how far each value sits from it (distances are always positive), then average those distances. A big MAD means values wander far from the mean.' }, + { kind: 'example', head: 'Range of 5, 9, 12, 20', body: 'Find the max: 20. Find the min: 5.\nSubtract: 20 − 5 = 15.\nThe range is 15.' }, + { kind: 'example', head: 'Range of 14, 6, 22, 9', body: 'Scan for the max: 22. Scan for the min: 6.\nSubtract: 22 − 6 = 16.\nThe range is 16.' }, + { kind: 'example', head: 'Range of 3, 3, 3', body: 'Max = 3 and min = 3.\nSubtract: 3 − 3 = 0.\nThe range is 0 — no spread at all, because every value is the same!' }, + { kind: 'example', head: 'One distance from the mean', body: 'The data 2, 4, 6 has mean 4 (since 2 + 4 + 6 = 12 and 12 ÷ 3 = 4).\nHow far is 6 from the mean? Distance = 6 − 4 = 2.\nThat single distance is one ingredient of the MAD.' }, + { kind: 'example', head: 'Full MAD of 2, 4, 6', body: 'Mean = 4. Distances from the mean: 2 is 2 away, 4 is 0 away, 6 is 2 away.\nAdd the distances: 2 + 0 + 2 = 4.\nAverage them: 4 ÷ 3 ≈ 1.33. The MAD is about 1.33.' }, + { kind: 'example', head: 'IQR of 1, 3, 5, 7, 9, 11, 13, 15', body: 'Bottom half: 1, 3, 5, 7 — its middle is between 3 and 5, so Q1 = 4.\nTop half: 9, 11, 13, 15 — its middle is between 11 and 13, so Q3 = 12.\nIQR = 12 − 4 = 8. The middle half of the data spans 8 units.' }, + { kind: 'protip', head: 'Same center, different spread', body: 'The sets 4, 5, 6 and 0, 5, 10 BOTH have mean 5 — but the first has range 2 and the second has range 10. Spread is the story the center can\'t tell. Report both and you\'ve painted the full picture.' }, + { kind: 'trap', head: 'Trap: mixing up center and spread', body: 'Center and spread answer DIFFERENT questions. "What\'s typical?" wants a center (mean or median). "How scattered is it?" wants a spread (range, IQR, or MAD). Read the question twice before deciding which one it\'s asking for.' }, + { kind: 'summary', head: 'Three rulers for scatter', body: 'Range = max − min: quick but sensitive to extremes. IQR = Q3 − Q1: the spread of the middle half, tough against outliers. MAD = the average distance from the mean. Spread plus center tells the whole data story!' }, + ], + '6.SP-4': [ + { kind: 'objective', head: 'Read data pictures', body: 'Today you will read the three big data displays: dot plots, histograms, and box plots. Each one turns a pile of numbers into a picture you can read at a glance. Learn the code and the pictures start talking.' }, + { kind: 'concept', head: 'Dot plot: one dot per value', body: 'A DOT PLOT stacks a dot above the number line for EACH data value. Three dots above 5 means the value 5 showed up three times. Tall stacks show the popular values instantly.' }, + { kind: 'concept', head: 'Histogram: bars over ranges', body: 'A HISTOGRAM groups data into equal-sized ranges (like 0–9, 10–19, 20–29) and draws a bar for each. Bar height = how many values landed in that range. The bars TOUCH — no gaps — because the ranges connect end to end.' }, + { kind: 'concept', head: 'Box plot: five-number snapshot', body: 'A BOX PLOT draws a box from the lower quartile (Q1) to the upper quartile (Q3) — that box holds the middle half of the data. The line INSIDE the box marks the median. Whiskers stretch out to the minimum and maximum.' }, + { kind: 'example', head: 'Count the dots', body: 'A dot plot has 3 dots stacked above the 5.\nEach dot = one data value.\nSo exactly 3 values in the data equal 5.' }, + { kind: 'example', head: 'More dots', body: 'A dot plot shows 4 dots above the value 2.\nOne dot per data point means 4 data points equal 2.\nCounting dots IS reading the plot — that\'s the whole trick.' }, + { kind: 'example', head: 'The line inside the box', body: 'On a box plot, what does the line inside the box show?\nThe box spans the middle half of the data, and the line splits ALL the data at its exact middle.\nIt\'s the MEDIAN.' }, + { kind: 'example', head: 'Do histogram bars touch?', body: 'Yes! A histogram\'s ranges connect — 0–9 ends right where 10–19 begins.\nSo the bars stand shoulder to shoulder with no gaps.\nIf you see gaps between the bars, you\'re probably looking at a bar graph instead.' }, + { kind: 'example', head: 'Read a histogram bar', body: 'A histogram bar over the range 10–19 has height 6.\nBar height = the count of values in that range.\nSo 6 data values fall somewhere between 10 and 19.' }, + { kind: 'example', head: 'Which display shows quartiles?', body: 'Question: box plot or bar graph — which one shows the median and quartiles?\nA bar graph just compares categories. A box plot is BUILT from Q1, the median, and Q3.\nAnswer: the box plot.' }, + { kind: 'protip', head: 'Match the display to the job', body: 'Want to see every single value? Dot plot. Have tons of data to squeeze into ranges? Histogram. Want the median and spread in one glance? Box plot. Pick the picture that answers your question fastest.' }, + { kind: 'trap', head: 'Trap: histogram vs bar graph', body: 'They look similar, but they\'re different animals. A histogram groups NUMBERS into equal ranges and its bars touch. A bar graph shows separate CATEGORIES (like pizza vs tacos) with gaps between bars. Check what\'s on the bottom axis before you answer.' }, + { kind: 'summary', head: 'Three pictures, one skill', body: 'Dot plot: one dot per value — count the dots. Histogram: touching bars over equal ranges — bar height is the count. Box plot: box from Q1 to Q3 with the median line inside. Now data pictures read like comic strips!' }, + ], + '6.SP-5': [ + { kind: 'objective', head: 'Tell the data\'s story', body: 'Numbers alone don\'t explain much — today you will DESCRIBE a distribution in words. You\'ll cover its center, its spread, and its shape, and call out anything unusual. It\'s like being a sports announcer for data.' }, + { kind: 'concept', head: 'The big three: center, spread, shape', body: 'A good description hits three things. CENTER: what\'s a typical value? SPREAD: are the values bunched tight or scattered wide? SHAPE: is the data symmetric, or does it lean with a long tail on one side?' }, + { kind: 'concept', head: 'Name the shape', body: 'If most values bunch up on the LEFT with a long tail stretching right, the data is SKEWED RIGHT. Tail stretching left? Skewed LEFT. If both sides mirror each other like a butterfly, it\'s SYMMETRIC. The tail names the skew — not the bump.' }, + { kind: 'concept', head: 'Spot outliers and clusters', body: 'An OUTLIER is a lone value sitting far from the crowd. A CLUSTER is a bunch of values huddled together. Both are worth mentioning — they often reveal the most interesting part of the story.' }, + { kind: 'concept', head: 'Answer the actual question', body: 'A description should connect back to the real-world question. "Test scores cluster near 80" means most students did well. Data always comes FROM somewhere — say what your numbers mean there.' }, + { kind: 'example', head: 'Name that lonely value', body: 'Test scores cluster near 80, but one score is 30.\nThe 30 sits far away from every other value.\nThat makes it an OUTLIER.' }, + { kind: 'example', head: 'Name that shape', body: 'Most values bunch on the left, with a long tail trailing off to the right.\nThe TAIL points right, and the tail names the skew.\nThe shape is SKEWED RIGHT.' }, + { kind: 'example', head: 'What completes the description?', body: 'A classmate describes data with just a center: "the typical score is 80."\nA good description needs the center PLUS one more big thing.\nThe missing piece is SPREAD — how scattered the scores are.' }, + { kind: 'example', head: 'Describe a small data set', body: 'Quiz scores: 7, 8, 8, 8, 9, 9, 10.\nCenter: the median is 8 (the 4th of 7 sorted values). Spread: range = 10 − 7 = 3, nice and tight. Shape: fairly symmetric, no outliers.\nFull description: "Scores center around 8, stay within 3 points of each other, and look symmetric."' }, + { kind: 'example', head: 'Describe data WITH an outlier', body: 'Minutes of homework: 20, 25, 25, 30, 90.\nCenter: the median is 25. Spread: range = 90 − 20 = 70, but that\'s mostly the 90\'s fault. Shape: skewed right, with the 90 as an outlier.\nDescription: "Most students spent about 25 minutes; one took 90, an outlier that stretches the spread."' }, + { kind: 'protip', head: 'Run the checklist', body: 'Before you finish a description, run the checklist: Center? Spread? Shape? Then add a bonus line for outliers or clusters if you spot any. Four quick checks and your description is complete every time.' }, + { kind: 'trap', head: 'Trap: reporting only the average', body: '"The mean is 80" is NOT a description — it\'s one number. Two classes can both average 80 while one has everyone at 78–82 and the other swings from 40 to 100. Always include center AND spread, or you\'ve told half the story.' }, + { kind: 'summary', head: 'Announce like a pro', body: 'Describe every distribution with the big three: center (typical value), spread (how scattered), and shape (symmetric or skewed). Call out outliers and clusters. Then tie it back to the real question the data came from!' }, + ], + '6.SP-6': [ + { kind: 'objective', head: 'Pull out the key numbers', body: 'Today you become a data detective. Given any data set, you will pull out its key numbers: the count (n), a center, and a spread. Three quick finds and any pile of numbers is summarized.' }, + { kind: 'concept', head: 'Step 1: count the values (n)', body: 'First, count how many data values you have — statisticians call this "n". It sounds too easy to matter, but n decides everything: what you divide by for the mean, and where the middle sits for the median. Count carefully!' }, + { kind: 'concept', head: 'Step 2: find a center', body: 'Next, find the typical value. Use the MEAN (add all, divide by n) when the data is balanced, or the MEDIAN (sort, take the middle) when there are outliers. The mode is a nice bonus — the value that appears most often.' }, + { kind: 'concept', head: 'Step 3: find a spread', body: 'Last, measure the scatter. The quickest spread is the RANGE: max − min. For a tougher measure that ignores extremes, use the IQR. Center + spread + count = a complete summary.' }, + { kind: 'example', head: 'Count first: n of 2, 4, 6, 8, 10', body: 'Point and count: 2 is one, 4 is two, 6 is three, 8 is four, 10 is five.\nn = 5.\nNow you know to divide any sum by 5, and that the median is the 3rd sorted value.' }, + { kind: 'example', head: 'Count again: 11, 13, 15, 17', body: 'Count them off: 11, 13, 15, 17 — that\'s 4 values.\nn = 4.\nWith an even n, the median will be the average of the two middle values. Knowing n tips you off early!' }, + { kind: 'example', head: 'Mode of 3, 5, 5, 7', body: 'Tally: 3 appears once, 5 appears twice, 7 appears once.\nThe most frequent value is 5.\nMode = 5.' }, + { kind: 'example', head: 'Mode of 6, 6, 2, 9, 6', body: 'Tally: 6 appears three times, 2 appears once, 9 appears once.\nThe champion is 6.\nMode = 6.' }, + { kind: 'example', head: 'Mean of 3, 5, 5, 7', body: 'Add: 3 + 5 = 8, then 8 + 5 = 13, then 13 + 7 = 20.\nCount: n = 4.\nDivide: 20 ÷ 4 = 5. Mean = 5.' }, + { kind: 'example', head: 'Full summary of 3, 5, 5, 7', body: 'Count: n = 4. Center: mean = 5 (and the median is 5 too — the middle two are both 5!).\nSpread: range = 7 − 3 = 4.\nSummary: "4 values, centered at 5, spread across 4 units." Done in three moves.' }, + { kind: 'protip', head: 'Sort once, harvest everything', body: 'Sort the data ONE time at the start. From the sorted list you can read the min and max (for range), the middle (for median), and repeated values (for mode) — all in one pass. One sort, four answers.' }, + { kind: 'trap', head: 'Trap: answering the wrong question', body: 'Kids often compute a center when the question wanted a spread — or the reverse. "What\'s typical?" = center. "How much do the values vary?" = spread. Underline the question word BEFORE you start calculating.' }, + { kind: 'summary', head: 'Count, center, spread', body: 'Every summary is three finds: n (count the values), a center (mean or median), and a spread (range or IQR). Sort once to make all of them easy. Check what the question wants before you answer!' }, + ], + '6.SP-7': [ + { kind: 'objective', head: 'Spot a statistical question', body: 'Today you will learn to tell a STATISTICAL question from a plain fact question. The secret is one idea: variability — do you expect different answers? It\'s the very first skill of every statistician.' }, + { kind: 'concept', head: 'Statistical = answers VARY', body: 'A statistical question expects MANY different answers. "How tall are the kids in 6th grade?" — every kid has a different height, so the answers vary. Questions like that need data collection to answer.' }, + { kind: 'concept', head: 'Fact questions have ONE answer', body: 'A non-statistical question has exactly one answer. "How tall am I?" — one person, one height, done. No variability means no statistics needed; you just measure or look it up.' }, + { kind: 'concept', head: 'Hunt for group words', body: 'Statistical questions usually mention a GROUP: "each student", "every player", "the kids in my class". Group words are a giant clue that answers will vary across the group. One person or one fact? Probably not statistical.' }, + { kind: 'example', head: 'Is "How tall am I?" statistical?', body: 'Who does it ask about? Just ME — one person.\nOne person has exactly one height, so there\'s nothing to vary.\nAnswer: NO, not statistical.' }, + { kind: 'example', head: '"How tall are students in my class?"', body: 'Who does it ask about? A whole CLASS of students.\nEvery student has a different height, so the answers vary.\nAnswer: YES, statistical!' }, + { kind: 'example', head: '"How many days in February 2025?"', body: 'It sounds mathy, but check for variability.\nFebruary 2025 has exactly one answer: 28 days. Nothing varies.\nAnswer: NO — it\'s a fact question, even though it\'s about numbers.' }, + { kind: 'example', head: '"How long does each student take to eat lunch?"', body: 'Spot the group word: "EACH student".\nSome eat in 10 minutes, some take 25 — the answers vary across the group.\nAnswer: YES, statistical.' }, + { kind: 'example', head: '"What is the capital of California?"', body: 'Is there a group? No. Do answers vary? No — it\'s Sacramento, always.\nOne fixed fact, zero variability.\nAnswer: NO, not statistical.' }, + { kind: 'example', head: 'Fix a fact question', body: '"How many pets do I have?" is not statistical — one me, one answer.\nAdd a group: "How many pets does each family on my street have?"\nNow answers vary from house to house. One little rewrite made it statistical!' }, + { kind: 'protip', head: 'Ask: would a survey help?', body: 'Quick test: would you need to ask MANY people (or take many measurements) to answer well? If yes, it\'s statistical. If one lookup or one measurement settles it, it\'s a fact question.' }, + { kind: 'trap', head: 'Trap: "it\'s about numbers, so it\'s statistical"', body: 'Wrong! "How many days are in February 2025?" is all about numbers but has ONE fixed answer. Statistical is about whether answers VARY — not whether the topic is mathematical. Check for variability, not for numbers.' }, + { kind: 'summary', head: 'Variability is the test', body: 'Statistical questions expect answers to vary across a group — you need data to answer them. Fact questions have one fixed answer. Hunt for group words like "each" and "every", and ask: would the answers differ? That\'s the whole test!' }, + ], + '6.SP-8': [ + { kind: 'objective', head: 'Mean & median, level 2', body: 'Today you will master the two big centers: compute the mean, find the median even with an EVEN number of values, and choose the right one for the situation. This is the center toolkit, fully loaded.' }, + { kind: 'concept', head: 'Mean: sum ÷ count', body: 'The MEAN is the sum of all values divided by how many there are. It\'s the fair-share number — pool everything, deal it out evenly. The mean shines when data is symmetric with no outliers.' }, + { kind: 'concept', head: 'Median: sort, then middle', body: 'The MEDIAN is the middle value of the SORTED data. Sorting is step zero — no exceptions. Because it only cares about position, the median is your best center when outliers lurk in the data.' }, + { kind: 'concept', head: 'Even count? Average the middle two', body: 'With an ODD number of values, one value sits dead center. With an EVEN number, TWO values share the middle — so the median is their average: add the middle two, divide by 2. That\'s why the median isn\'t always a number from your list!' }, + { kind: 'example', head: 'Median of 3, 5, 7, 9, 11', body: 'Already sorted, and there are 5 values (odd), so one middle exists.\nCount to the 3rd value: 3, 5, then 7.\nThe median is 7.' }, + { kind: 'example', head: 'Even count: median of 2, 4, 6, 8', body: 'Sorted, with 4 values — an even count, so TWO values share the middle.\nThe middle two are 4 and 6.\nAverage them: (4 + 6) ÷ 2 = 10 ÷ 2 = 5. The median is 5.' }, + { kind: 'example', head: 'Median of 1, 3, 7, 9', body: 'Sorted already; 4 values, so it\'s an even count.\nMiddle two: 3 and 7.\nAdd: 3 + 7 = 10. Divide: 10 ÷ 2 = 5. Median = 5 — a number that isn\'t even in the list!' }, + { kind: 'example', head: 'Mean of 6, 8, 10', body: 'Add: 6 + 8 = 14, then 14 + 10 = 24.\nCount: 3 values.\nDivide: 24 ÷ 3 = 8. The mean is 8.' }, + { kind: 'example', head: 'Outlier alert: mean of 5, 5, 5, 100', body: 'Add: 5 + 5 + 5 + 100 = 115. Count: 4 values.\nDivide: 115 ÷ 4 = 28.75.\nBut the median is (5 + 5) ÷ 2 = 5! The outlier 100 dragged the mean up to 28.75 while the median stayed honest at 5.' }, + { kind: 'example', head: 'Pick the better center', body: 'Data: 5, 5, 5, 100 — which center describes "typical" better?\nMean = 28.75, but almost every value is 5. Median = 5, which matches the data.\nWith an outlier like 100, choose the MEDIAN.' }, + { kind: 'protip', head: 'Let the shape choose for you', body: 'Symmetric data, no outliers → mean and median land close together, so use the mean. Skewed data or outliers → they split apart, so trust the median. If you compute both and they differ a lot, that gap itself is a clue an outlier is hiding.' }, + { kind: 'trap', head: 'Trap: forgetting to sort', body: 'Order is EVERYTHING for the median. The median of 9, 1, 7, 3 is not "the middle of what I see" — sort to 1, 3, 7, 9 first, then average 3 and 7 to get 5. Unsorted data gives a wrong median almost every time.' }, + { kind: 'trap', head: 'Trap: even count, one middle', body: 'With 4 values there is NO single middle value — don\'t just grab the 2nd or the 3rd one. Take BOTH middle values and average them: for 2, 4, 6, 8 that\'s (4 + 6) ÷ 2 = 5. Even count → two middles → average them.' }, + { kind: 'summary', head: 'The center toolkit', body: 'Mean = sum ÷ count; best for balanced data. Median = middle of the SORTED list; best when outliers lurk. Even count? Average the two middle values. Sort first, scan for outliers, then pick your center!' }, + ], + '6.SP-9': [ + { kind: 'objective', head: 'Master the three displays', body: 'Today you will read dot plots, histograms, and box plots like a pro — the three displays every 6th-grade statistician uses. Each has one decoding rule. Learn the rules and no data picture can hide anything from you.' }, + { kind: 'concept', head: 'Dot plots: dots are data', body: 'On a DOT PLOT, each dot is exactly one data value sitting above its number on the line. Tall stacks mean common values; empty spots mean nobody got that value. To count anything, count dots.' }, + { kind: 'concept', head: 'Histograms: height is the count', body: 'A HISTOGRAM chops the number line into equal intervals (like 10–19, 20–29) and raises a bar over each. The bar\'s HEIGHT tells how many values landed in that interval. You lose the exact values but see the overall shape beautifully.' }, + { kind: 'concept', head: 'Box plots: the middle 50%', body: 'A BOX PLOT is built from five numbers: minimum, Q1, median, Q3, maximum. The box runs from Q1 to Q3 and holds the middle 50% of the data. The line inside the box is the median, and the whiskers reach out to the min and max.' }, + { kind: 'example', head: 'What is one dot worth?', body: 'On a dot plot, each dot represents… what?\nOne dot = one data value = one single observation.\nSo a stack of dots is just a count of how many times that value occurred.' }, + { kind: 'example', head: 'Dots above the 3', body: 'A dot plot has 4 dots stacked above the value 3.\nEach dot is one measurement.\nSo exactly 4 measurements equal 3.' }, + { kind: 'example', head: 'Histogram bar, height 5', body: 'A histogram bar sits over the interval 10–19 and has height 5.\nBar height = count of values in that interval.\nSo 5 values fall between 10 and 19.' }, + { kind: 'example', head: 'Histogram bar, height 8', body: 'A bar over the interval 20–29 has height 8.\nRead the height: 8.\nSo 8 values landed somewhere from 20 to 29. (The histogram won\'t tell you exactly WHERE in that range — that detail is traded away for the big picture.)' }, + { kind: 'example', head: 'What does the box show?', body: 'On a box plot, what does the box itself represent?\nThe box stretches from Q1 to Q3 — the quartiles.\nThat\'s the MIDDLE 50% of the data, with the median line inside it.' }, + { kind: 'example', head: 'Read a whole box plot', body: 'A box plot of quiz scores shows: min 4, Q1 6, median 7, Q3 9, max 10.\nThe box runs from 6 to 9, so the middle half of students scored between 6 and 9.\nTypical score: 7 (the median). Full spread: 10 − 4 = 6. One glance, whole story!' }, + { kind: 'protip', head: 'Read the axes before the bars', body: 'Before answering ANY display question, read the bottom axis (what\'s being measured) and the side axis (what\'s being counted). Ten seconds of axis-reading prevents almost every wrong answer. THEN look at dots, bars, or boxes.' }, + { kind: 'trap', head: 'Trap: judging bars by width', body: 'In a histogram, the bar\'s HEIGHT equals the count — never the width. All bars share the same width because the intervals are equal, so width tells you nothing about counts. Height is the only number that answers "how many?"' }, + { kind: 'summary', head: 'Three rules to rule them all', body: 'Dot plot: one dot = one value, so count dots. Histogram: bar HEIGHT = count in that interval. Box plot: box = middle 50% from Q1 to Q3, line = median, whiskers = min and max. Read the axes first, every time!' }, + ], + '6.SP-10': [ + { kind: 'objective', head: 'The grand data summary', body: 'This is the capstone: given any data set, you will compute its mean, its median, and its range, then report a quick summary of shape, center, and spread. Everything you\'ve learned in statistics comes together today.' }, + { kind: 'concept', head: 'A summary has three parts', body: 'A complete summary describes SHAPE (symmetric or skewed?), CENTER (mean or median), and SPREAD (range = max − min). Think of it as the data\'s ID card: three facts that identify the whole set.' }, + { kind: 'concept', head: 'Compute center and spread', body: 'Center: mean = sum ÷ count, or median = middle of the sorted list. Spread: range = maximum − minimum. Sort the data once and the median, the max, and the min are all sitting right there.' }, + { kind: 'concept', head: 'Pair the right center with the data', body: 'Outliers pull the MEAN but not the median. So for lopsided data or data with an extreme value, report the median as your center. For balanced data, the mean works great. The context picks the center!' }, + { kind: 'example', head: 'Mean of 10, 20, 30, 40, 50', body: 'Add step by step: 10 + 20 = 30, plus 30 = 60, plus 40 = 100, plus 50 = 150.\nCount: 5 values.\nDivide: 150 ÷ 5 = 30. The mean is 30.' }, + { kind: 'example', head: 'Mean of 2, 4, 6, 8', body: 'Add: 2 + 4 = 6, then 6 + 6 = 12, then 12 + 8 = 20.\nCount: 4 values.\nDivide: 20 ÷ 4 = 5. The mean is 5.' }, + { kind: 'example', head: 'Median of 3, 7, 1, 9, 5', body: 'Sort first: 1, 3, 5, 7, 9.\nFive values, so the middle is the 3rd one.\nCount in: 1, 3, then 5. The median is 5.' }, + { kind: 'example', head: 'Range of 12, 5, 18, 7, 20', body: 'Sort (or scan carefully): 5, 7, 12, 18, 20.\nMax = 20 and min = 5.\nRange = 20 − 5 = 15.' }, + { kind: 'example', head: 'Range of 7, 2, 11, 4', body: 'Sort: 2, 4, 7, 11.\nMax = 11, min = 2.\nRange = 11 − 2 = 9.' }, + { kind: 'example', head: 'Full summary, start to finish', body: 'Data: 3, 7, 1, 9, 5. Sort: 1, 3, 5, 7, 9.\nCenter: median = 5, and the mean = 25 ÷ 5 = 5 too — they match, so the data is balanced. Spread: range = 9 − 1 = 8.\nSummary: "Five values, symmetric, centered at 5, spread across 8." That\'s a complete report!' }, + { kind: 'protip', head: 'Sort once, answer everything', body: 'Make sorting your very first move on ANY summary problem. A sorted list hands you the min and max (for range) and the middle (for median) with zero extra work. One sort powers the entire summary.' }, + { kind: 'trap', head: 'Trap: trusting unsorted data', body: 'Unsorted data hides its extremes — in 12, 5, 18, 7, 20 the max and min are buried in the middle of the list. Grab the "first and last" of an unsorted list and your range is wrong; grab its middle and your median is wrong. SORT before finding the median or the range.' }, + { kind: 'summary', head: 'You\'re a data summarizer now', body: 'Every summary: shape, center, spread. Mean = sum ÷ count; median = middle of the SORTED list; range = max − min. Outliers pull the mean, so pick the median when data is lopsided. Sort first, and the numbers line up for you!' }, + ], +}; diff --git a/src/data/lessonSlides/types.ts b/src/data/lessonSlides/types.ts new file mode 100644 index 0000000..823b812 --- /dev/null +++ b/src/data/lessonSlides/types.ts @@ -0,0 +1,12 @@ +// The story-style slide format for lessons. Every lesson carries 12–20 of +// these: 1 objective · 3–5 concept · 5–7 examples (simplest → fuller) · +// 1–2 pro tips · 1–2 traps · 1 summary. ~3 short sentences per slide, written +// to be read by a 10–12-year-old. Slides advance on button press only; each +// kind has a minimum read time before Next unlocks (see LessonCard). +export interface LessonSlide { + kind: 'objective' | 'concept' | 'example' | 'protip' | 'trap' | 'summary'; + head: string; // big slide headline + body: string; // ~3 short sentences; \n allowed for line breaks +} + +export type SlideBank = Record; // key = `${domain}-${unit}` diff --git a/src/data/lessons.ts b/src/data/lessons.ts index fbe6a45..dc5d287 100644 --- a/src/data/lessons.ts +++ b/src/data/lessons.ts @@ -1,4 +1,8 @@ import type { Domain } from '../types/problem'; +import { LESSON_SLIDES } from './lessonSlides'; +import type { LessonSlide } from './lessonSlides'; + +export type { LessonSlide }; export interface WorkedExample { q: string; @@ -27,6 +31,7 @@ export interface Lesson { practice: PracticeQuestion[]; // try-it questions with accepted alternatives watchOut: string; videos?: VideoRef[]; // ordered Manim animations in public/videos/lessons/ + slides?: LessonSlide[]; // story-style deck (12–20 slides), merged from lessonSlides/ } export function lessonKey(domain: Domain, unit: number): string { @@ -1230,6 +1235,12 @@ export const LESSONS: Lesson[] = [ }, ]; +// Attach each lesson's story-style slide deck (authored per-domain in lessonSlides/). +for (const l of LESSONS) { + const s = LESSON_SLIDES[lessonKey(l.domain, l.unit)]; + if (s && s.length) l.slides = s; +} + const byKey = new Map(LESSONS.map((l) => [lessonKey(l.domain, l.unit), l])); export function getLesson(domain: Domain, unit: number): Lesson | null { diff --git a/src/data/mathStories.json b/src/data/mathStories.json index d8faa45..c90649f 100644 --- a/src/data/mathStories.json +++ b/src/data/mathStories.json @@ -7,19 +7,35 @@ "beats": [ { "head": "The diner offer", - "body": "Two 7-inch pizzas for $12, or one 14-inch for $12. The 14-inch is double the diameter — same deal, right?" + "body": "Two 7-inch pizzas for $12, or one 14-inch for $12. The 14-inch is double the diameter — same deal, right? Before you answer, remember that pizza value is about AREA, not width." }, { "head": "Diameters double, areas QUADRUPLE", - "body": "Pizza is round. Area = π × radius × radius. Double the radius means 4× the area." + "body": "Pizza is round, so we measure it with circle area: Area = π × radius × radius. Because the radius gets multiplied by ITSELF, doubling the radius means 2 × 2 = 4 times the area." }, { "head": "The numbers", - "body": "One 7-inch ≈ 38 in² of pizza. One 14-inch ≈ 154 in². Two 7-inchers? Only 76 in²." + "body": "One 7-inch pizza is about 38 in² of food. One 14-inch is about 154 in². Two 7-inchers together? Only 76 in² — barely half of the big one, for the same price." }, { "head": "Pick the big one", - "body": "Always. A bigger circle gives WAY more pizza per dollar than two small ones at the same diameter total." + "body": "Pick the big one — always. A bigger circle gives WAY more pizza per dollar than two small ones with the same total diameter, because area grows with the SQUARE of the size." + }, + { + "head": "Work it with π ≈ 3", + "body": "Try the math yourself with π ≈ 3. The 7-inch has radius 3.5, so area ≈ 3 × 3.5 × 3.5 ≈ 37 in². The 14-inch has radius 7: 3 × 7 × 7 = 147 in². Four times bigger!" + }, + { + "head": "Pro tip: compare per dollar", + "body": "Pro tip: divide area by price to get square inches per dollar. 154 ÷ 12 ≈ 13 in² per dollar for the big pizza, but only 76 ÷ 12 ≈ 6 for the two small ones." + }, + { + "head": "Trap: judging by diameter", + "body": "Trap: “14 is double 7, so it’s double the pizza.” Wrong! Diameter is a LENGTH, but food is an AREA. Lengths double; areas quadruple. Never compare circles by width alone." + }, + { + "head": "Real-world radar", + "body": "This shows up everywhere: TV screens, cake pans, garden hoses, even pupil sizes. Whenever something is measured by one length but used as an area, small size changes make surprisingly big differences." } ], "learned": "Area grows by the SQUARE of the size — circles especially.", @@ -33,19 +49,35 @@ "beats": [ { "head": "Track day", - "body": "A runner wants to get from point A to point B on the track. They could run east 3 meters, then north 4. Or just go diagonally." + "body": "A runner wants to get from point A to point B on the track. They could run east 3 meters, then north 4 meters — or just cut straight across the grass diagonally. Which path is smarter?" }, { "head": "Which is shorter?", - "body": "East 3 + North 4 = 7 meters total. The diagonal is shorter — but how much?" + "body": "Going east 3 + north 4 = 7 meters of running in total. The diagonal is clearly shorter — but by exactly how much? Guessing isn’t enough; geometry can tell us the precise answer." }, { "head": "Pythagoras to the rescue", - "body": "Diagonal² = 3² + 4² = 25. So diagonal = 5. Six steps shorter? Actually only 2." + "body": "Pythagoras to the rescue: in a right triangle, diagonal² = 3² + 4² = 9 + 16 = 25, so the diagonal = 5 meters. You expected to save a lot? The shortcut saves exactly 2 meters." }, { "head": "Coords matter", - "body": "On a coordinate plane, going (3, 4) means 3 right and 4 up. The straight-line distance is what really counts." + "body": "On a coordinate plane, moving (3, 4) means 3 right and 4 up — two separate legs of a right triangle. The straight-line distance between the points is the hypotenuse, and that’s what really counts." + }, + { + "head": "Another example: 6 and 8", + "body": "Try legs of 6 and 8. Then diagonal² = 36 + 64 = 100, so the diagonal is 10. Notice it’s just the 3-4-5 triangle doubled — scaling a right triangle keeps the same ratios." + }, + { + "head": "Pro tip: spot the right angle", + "body": "Pro tip: the shortcut formula only works when the two legs meet at a RIGHT angle, like grid streets. East and north always do, which is why coordinate grids and Pythagoras are best friends." + }, + { + "head": "Trap: adding the legs", + "body": "Trap: adding 3 + 4 and calling the diagonal 7. The diagonal is always SHORTER than the two legs combined — that’s the whole point of a shortcut. Square, add, then take the root." + }, + { + "head": "Where you’ll use it", + "body": "Game designers use this constantly: how far apart are two characters on screen? Drones, GPS apps, and even football commentators computing a pass distance all use the same right-triangle math." } ], "learned": "Diagonal distance on the grid is ALWAYS shorter than the L-shape.", @@ -59,19 +91,35 @@ "beats": [ { "head": "The deal", - "body": "Your boss offers: $1,000,000 cash, OR one penny today that doubles every day for 30 days. Which wins?" + "body": "Your boss offers a choice: $1,000,000 cash right now, OR one penny today that doubles every single day for 30 days. Which offer actually wins? Your instinct might betray you here." }, { "head": "Most kids pick the million", - "body": "It looks like a no-brainer. But that 'tiny' penny is hiding a secret: exponents grow scary fast." + "body": "Most kids pick the million — it looks like a no-brainer. But that “tiny” penny is hiding a secret: doubling is an EXPONENT, and exponential growth starts slow, then grows scary fast." }, { "head": "Let's count", - "body": "Day 5: 16¢. Day 10: $5. Day 20: $5,000. Day 30: BOOM." + "body": "Let’s count the doubling: Day 5 is only 16¢. Day 10 is about $5. Day 20 jumps to roughly $5,000. Each doubling multiplies everything that came before — Day 30: BOOM." }, { "head": "The winner", - "body": "Day 30: $5,368,709.12. Five times the million!" + "body": "Day 30 lands on $5,368,709.12 — more than FIVE times the million dollars. The penny wins because 2 multiplied by itself 29 times is over 500 million pennies." + }, + { + "head": "The math behind it", + "body": "The amount on day n is 1¢ × 2 raised to the (n − 1) power. Day 30 means 2²⁹ pennies. Exponents count repeated MULTIPLICATION, and multiplication compounds far faster than addition ever can." + }, + { + "head": "Pro tip: watch the last doubles", + "body": "Pro tip: half of all the money arrives on the very last day! Each double equals everything before it, so with exponential growth the final steps matter the most. Never quit doubling early." + }, + { + "head": "Trap: thinking in straight lines", + "body": "Trap: assuming growth is a straight line, like +$100 a day. Linear growth adds; exponential growth multiplies. Our brains expect lines, which is exactly why the penny fools almost everyone." + }, + { + "head": "Doubling in real life", + "body": "Doubling rules the real world: bank interest compounds, viral videos spread, bacteria colonies double every few hours. Understanding exponents helps you spot when something small is about to become enormous." } ], "learned": "Exponents (doubling, tripling…) explode much faster than adding.", @@ -85,19 +133,35 @@ "beats": [ { "head": "Italy, year 1202", - "body": "Fibonacci asks: if a pair of rabbits has a new pair every month, how many pairs after a year?" + "body": "In Italy, year 1202, Fibonacci poses a puzzle: if a pair of rabbits produces a new pair every month, how many pairs will there be after a year? The answer hides a famous pattern." }, { "head": "Each month", - "body": "Every rabbit pair from last month is still here, PLUS every pair that was around two months ago has a new pair." + "body": "Every rabbit pair from last month is still here, PLUS every pair that was around two months ago has a new pair. So each month’s total is built from the two months before it." }, { "head": "The pattern", - "body": "1, 1, 2, 3, 5, 8, 13, 21… Each number = sum of the two before it." + "body": "The pattern goes 1, 1, 2, 3, 5, 8, 13, 21… Each number equals the SUM of the two numbers before it — a simple rule that generates the sequence forever." }, { "head": "It's everywhere", - "body": "Sunflower seeds spiral in Fibonacci numbers. So do pinecones and seashells. Nature loves this pattern." + "body": "It’s everywhere in nature: sunflower seeds spiral in Fibonacci counts, and so do pinecones, pineapples, and seashells. Nature loves this pattern because it packs new growth efficiently around old growth." + }, + { + "head": "Work the next terms", + "body": "Extend it yourself: after 21 comes 13 + 21 = 34, then 21 + 34 = 55, then 34 + 55 = 89. After twelve months, Fibonacci’s rabbit count reaches 144 pairs!" + }, + { + "head": "Pro tip: write the rule", + "body": "Pro tip: don’t memorize the list — memorize the RULE: next = previous + one-before-previous. A rule that builds each term from earlier terms is called a recurrence, and it fits in one sentence." + }, + { + "head": "Trap: adding the wrong pair", + "body": "Trap: adding a number to ITSELF instead of to its neighbor. After 5, 8 the next term is 5 + 8 = 13, not 8 + 8 = 16. Always add the LAST TWO terms." + }, + { + "head": "The golden connection", + "body": "Divide neighboring Fibonacci numbers — 21 ÷ 13, 34 ÷ 21, 55 ÷ 34 — and the answers creep toward 1.618, the “golden ratio” that artists and architects have loved for centuries." } ], "learned": "A rule that links each term to the previous ones is called a RECURRENCE.", @@ -111,19 +175,35 @@ "beats": [ { "head": "A party", - "body": "20 friends at a party. Everyone shakes hands with everyone else, ONCE. How many handshakes total?" + "body": "Twenty friends are at a party, and everyone shakes hands with everyone else exactly ONCE. How many handshakes happen in total? Counting them one by one would take all night." }, { "head": "Start small", - "body": "With 6 people, draw lines between every pair. Count: 15 lines." + "body": "Start small to find the pattern: with 6 people, draw a dot for each person and a line between every pair. Count the lines carefully and you get exactly 15 handshakes." }, { "head": "The pattern", - "body": "Each of n people shakes hands with n-1 others. Each handshake is counted TWICE, so divide by 2." + "body": "Here’s the pattern: each of n people shakes hands with the other n − 1 people. But that counts every handshake TWICE — once from each side — so we divide the product by 2." }, { "head": "Solve it", - "body": "20 × 19 ÷ 2 = 190 handshakes. The formula n(n-1)/2 works for any size party." + "body": "Now solve the party: 20 × 19 ÷ 2 = 380 ÷ 2 = 190 handshakes. The formula n(n − 1) ÷ 2 works instantly for any size party, no drawing required." + }, + { + "head": "Try a bigger party", + "body": "A school dance with 100 students? 100 × 99 ÷ 2 = 4,950 handshakes. Notice how doubling isn’t what happens — five times the people gave us about twenty-six times the handshakes. Pairs explode fast." + }, + { + "head": "Pro tip: pairs are everywhere", + "body": "Pro tip: this same formula counts ANY kind of pairing — matches in a round-robin tournament, high-fives, direct flights between cities, or lines connecting dots. Spot the word “every pair” and reach for n(n − 1) ÷ 2." + }, + { + "head": "Trap: forgetting to halve", + "body": "Trap: answering 20 × 19 = 380. That counts Ana-shaking-Ben AND Ben-shaking-Ana as two different handshakes, but it’s the same event. One handshake involves two people, so always divide by 2." + }, + { + "head": "From pattern to formula", + "body": "This is how real mathematicians work: test tiny cases, spot the structure, then write a formula that answers EVERY case at once. A good formula is a pattern you never have to re-count." } ], "learned": "When you spot a pattern, write a formula — it works for ANY size.", @@ -137,19 +217,35 @@ "beats": [ { "head": "The inventor's prize", - "body": "Long ago, a wise man invented chess. The king offered any reward. The inventor asked for rice." + "body": "Long ago, a wise man invented the game of chess. The delighted king offered him any reward he could name. The inventor smiled and asked for something that sounded humble: rice." }, { "head": "Sounds small", - "body": "'One grain on square 1, two on square 2, four on square 3, doubling all the way.' The king laughed and agreed." + "body": "“One grain on square 1, two on square 2, four on square 3 — doubling on every square, all 64 of them.” The king laughed at such a small request and agreed instantly." }, { "head": "Filling the table", - "body": "Square 10 = 512. Square 20 = a million. Square 32 = 2.1 billion. The numbers EXPLODE." + "body": "Filling the board starts calmly, then explodes: square 10 holds 512 grains, square 20 over a million, square 32 about 2.1 billion. Doubling multiplies everything that came before, so the numbers EXPLODE." }, { "head": "Bankrupt", - "body": "Square 64 alone needs 2⁶³ grains — more rice than has ever existed on Earth." + "body": "Square 64 alone needs 2⁶³ grains — about 9 quintillion, more rice than has ever existed on Earth. The king was bankrupted by exponents he mistook for simple addition." + }, + { + "head": "Feel the powers of 2", + "body": "The pattern is powers of two: square n holds 2 to the (n − 1) power. Ten doublings multiply by about 1,000. So every 10 squares, the pile grows a THOUSAND times bigger." + }, + { + "head": "Pro tip: the 2-4-8 ladder", + "body": "Pro tip: memorize the small ladder 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024. Knowing that 2¹⁰ ≈ 1,000 lets you estimate huge doubling problems in your head." + }, + { + "head": "Trap: doubling ≠ adding 2", + "body": "Trap: treating doubling like adding. 2, 4, 6, 8 is an ADDING pattern that reaches only 128 by square 64. True doubling — 2, 4, 8, 16 — reaches 9,223,372,036,854,775,808. Exponents are a different universe." + }, + { + "head": "Same math, new places", + "body": "Computer memory doubles this way too — kilobyte, megabyte, gigabyte, terabyte each jump by about 1,000 (ten doublings). The chessboard puzzle is literally how engineers think about data sizes." } ], "learned": "When a table doubles row by row, the values get scary big — fast.", @@ -163,19 +259,35 @@ "beats": [ { "head": "4,500 years ago", - "body": "Egyptians had no rulers or fancy tools — yet the Pyramid corners are PERFECT right angles. How?" + "body": "About 4,500 years ago, Egyptians had no steel rulers or laser levels — yet the Great Pyramid’s corners are PERFECT right angles. How did they build so precisely with just rope and rocks?" }, { "head": "A knotted rope", - "body": "They tied 12 evenly spaced knots in a rope. Three workers stretched it into a triangle with sides 3, 4, and 5 knots." + "body": "Their tool was a knotted rope: 12 evenly spaced knots tied in a loop. Three workers pulled it tight into a triangle with sides of exactly 3, 4, and 5 knot-lengths." }, { "head": "Why those numbers?", - "body": "3² + 4² = 5². When sides are 3, 4, 5 (or any 3:4:5 ratio), the corner is EXACTLY 90°. Magic." + "body": "Why those numbers? Because 3² + 4² = 9 + 16 = 25 = 5². Whenever a triangle’s sides fit that squared relationship, the corner opposite the longest side is EXACTLY 90°. Rope-made magic." }, { "head": "Still used today", - "body": "Carpenters, builders, and gardeners still use this trick to make square corners without fancy tools." + "body": "The trick never expired: carpenters, builders, and gardeners still measure 3 feet, 4 feet, and check the diagonal is 5 to make square corners. Ancient technology, still perfectly accurate today." + }, + { + "head": "Scale it up", + "body": "Any multiple works too: 6-8-10, 9-12-15, even 30-40-50 for a whole building site. Multiplying all three sides by the same number keeps the ratios — and the right angle — perfectly intact." + }, + { + "head": "Pro tip: check corners backwards", + "body": "Pro tip: use it in reverse to TEST a corner. Mark 3 units along one edge and 4 along the other; if the diagonal between the marks isn’t exactly 5, your corner isn’t square." + }, + { + "head": "Trap: any old triangle", + "body": "Trap: thinking every triangle with a 5 side has a right angle. Sides 2-4-5 give 4 + 16 = 20, not 25 — no right angle. The SQUARES must add up exactly." + }, + { + "head": "Why right angles matter", + "body": "Right angles make walls stand straight, floors lie flat, and bricks stack without leaning. One knotted rope solved a problem that every builder in history has faced: how do you trust a corner?" } ], "learned": "The 3-4-5 ratio always makes a right angle. Ancient tech, still works.", @@ -189,43 +301,59 @@ "beats": [ { "head": "Ancient Egypt, 350 AD", - "body": "A baby girl named Hypatia is born in the city of Alexandria, Egypt. Her father runs the most famous school of math and astronomy in the entire world: the Library of Alexandria." + "body": "A baby girl named Hypatia is born around 350 AD in Alexandria, Egypt. Her father runs the most famous school of math and astronomy in the entire ancient world: the great Library of Alexandria." }, { "head": "Her dad's bet", - "body": "Most girls of her time would learn to weave cloth. Her father makes a wild bet: he'll teach her math, science, and philosophy — the same way he'd teach a son. Hypatia turns out to be a prodigy." + "body": "Most girls of her time would learn only to weave cloth and run a home. Her father makes a wild bet: he’ll teach her math, science, and philosophy — exactly as he’d teach a son. Hypatia turns out to be a prodigy." }, { "head": "The shapes nobody could explain", - "body": "Hypatia falls in love with POLYGONS — triangles, squares, pentagons, hexagons. Especially regular ones, where every side and every angle is exactly the same." + "body": "Hypatia falls in love with POLYGONS — triangles, squares, pentagons, hexagons. Especially the regular ones, where every side and every angle is exactly the same, because their perfect symmetry makes their properties predictable." }, { "head": "Why polygons matter", - "body": "Builders used polygons to make pillars. Sailors used them to navigate. Painters used them to make perspective work. Polygons were like the LEGO bricks of the ancient world." + "body": "Why did polygons matter so much? Builders used them to design pillars, sailors used them to navigate by the stars, and painters used them to make perspective work. Polygons were the LEGO bricks of the ancient world." }, { "head": "Slicing a cone", - "body": "Her best work was about 'conic sections' — what shapes you get when you slice a cone at different angles. A flat slice gives a circle. A tilted slice gives a stretched circle called an ellipse. Wild stuff." + "body": "Her best work explained “conic sections” — the shapes you get when you slice a cone at different angles. A level slice gives a circle; a tilted slice stretches it into an ellipse. One solid, a whole family of curves." }, { "head": "Famous teacher", - "body": "By age 30, Hypatia is the most respected teacher in Alexandria. Students travel for months from Italy, Greece, Syria, and Persia just to sit in her classroom. Her name appears in letters across the Mediterranean." + "body": "By age 30, Hypatia is the most respected teacher in Alexandria. Students travel for months from Italy, Greece, Syria, and Persia just to sit in her classroom, and her name appears in letters all across the Mediterranean." }, { "head": "Her style", - "body": "She wears a philosopher's robe instead of fancy clothes. She invents teaching tools — a hydrometer, an astrolabe — so students can SEE the math instead of just hearing it." + "body": "Her style was hands-on: she wears a plain philosopher’s robe instead of fancy clothes and invents teaching tools — a hydrometer, an astrolabe — so students can SEE and touch the math instead of just hearing it described." }, { "head": "Dangerous times", - "body": "But Alexandria is splitting apart. Different religious groups fight for power. Hypatia refuses to pick a side — she just wants to do math. That makes her enemies in 415 AD." + "body": "But Alexandria is splitting apart as different religious and political groups fight for power. Hypatia refuses to pick a side — she just wants to teach mathematics. In the year 415 AD, staying neutral makes her powerful enemies." }, { "head": "Her math survives", - "body": "Even though her enemies destroy much of her work, students copy what they remember and carry it abroad. Her commentaries on polygons and conic sections survive for 1,600 years — long enough for us to read them today." + "body": "Even though her enemies destroy much of her work, her students copy what they remember and carry it abroad to new schools. Her commentaries on polygons and conic sections survive for 1,600 years — long enough for us to read today." }, { "head": "Why she matters", - "body": "Hypatia proved that math has no gender, no nationality, no religion. A polygon is a polygon for anyone who studies it carefully. That idea is the foundation of every math class you'll ever take." + "body": "Hypatia proved that math has no gender, no nationality, and no religion. A polygon obeys the same rules for anyone who studies it carefully, and that fairness is the quiet foundation of every math class you will ever take." + }, + { + "head": "Polygon math you can do", + "body": "Here’s polygon math Hypatia knew: a hexagon splits into 6 identical triangles from its center. If each triangle has area 4, the hexagon’s area is 6 × 4 = 24. Split, solve, multiply." + }, + { + "head": "Pro tip: cut shapes apart", + "body": "Pro tip: when a shape looks hard, slice it into triangles and rectangles you already understand. Every polygon area formula — even the fancy ones — comes from clever cutting and re-adding." + }, + { + "head": "Trap: “regular” means special", + "body": "Trap: calling any six-sided shape a regular hexagon. Regular means ALL sides equal AND all angles equal. A stretched, lopsided hexagon is still a hexagon — but none of the neat regular-polygon rules apply." + }, + { + "head": "Her legacy in your app", + "body": "When you compute the area of a triangle or figure out a composite shape in the Geometry unit, you’re using tools Hypatia taught in a stone classroom sixteen centuries ago. Good math never expires." } ], "learned": "Polygons (3 sides, 4 sides, 6 sides…) are the LEGO bricks of geometry. Hypatia studied them 1,600 years ago and the same rules still work today.", @@ -239,19 +367,35 @@ "beats": [ { "head": "Suspicious king", - "body": "A Greek king gave his goldsmith pure gold for a crown. He suspects the smith mixed in cheap silver." + "body": "A Greek king gave his goldsmith a lump of pure gold to make a crown. When it came back, the king grew suspicious: had the smith secretly mixed in cheaper silver and pocketed some gold?" }, { "head": "How to test?", - "body": "The crown weighs the right amount. But silver is LIGHTER per volume than gold — so a fake would take up MORE space." + "body": "How could anyone test it? The crown weighs exactly the right amount. But silver is LIGHTER per volume than gold — so a fake crown of equal weight would have to take up MORE space." }, { "head": "Bath time", - "body": "Archimedes hops in a full tub and water spills over. He realizes: an object pushes out water equal to its OWN volume." + "body": "At bath time, Archimedes hops into a full tub and water spills over the edge. Eureka! He realizes an object pushes aside water equal to its OWN volume — a way to measure any shape." }, { "head": "Caught!", - "body": "He dunks the crown. It pushes out more water than pure gold would. The crown was a fake." + "body": "Caught! He dunks the crown and measures the overflow. It pushes out more water than an equal weight of pure gold would. More volume means silver inside — the crown was a fake." + }, + { + "head": "The numbers behind it", + "body": "Try it with numbers: 1,000 grams of gold fills about 52 mL, but 1,000 grams of silver fills about 95 mL. Same weight, nearly double the space — the overflow gap is easy to spot." + }, + { + "head": "Pro tip: volume by dunking", + "body": "Pro tip: you can measure ANY weird shape’s volume this way. Fill a measuring cup, submerge the object, and read how much the water rises. The rise IS the volume — no formula needed." + }, + { + "head": "Trap: weight vs volume", + "body": "Trap: thinking equal weight means equal size. Weight measures how heavy; volume measures how much SPACE. A kilogram of feathers and a kilogram of gold weigh the same but fill wildly different volumes." + }, + { + "head": "Density: the ratio", + "body": "Weight ÷ volume gives DENSITY, a ratio fingerprint for every material. Gold is about 19 g/mL, silver 10.5 g/mL, water exactly 1. Scientists still identify unknown materials with Archimedes’ bathtub idea." } ], "learned": "Volume = space something takes up. Water can measure it directly.", @@ -265,47 +409,63 @@ "beats": [ { "head": "Tehran, Iran, 1977", - "body": "Maryam Mirzakhani is born to a normal middle-class family in Tehran. As a kid, she WANTS to be a writer. She reads novels, writes stories, dreams of being the next Jane Austen." + "body": "Maryam Mirzakhani is born in 1977 to a normal middle-class family in Tehran, Iran. As a kid she WANTS to be a writer — she devours novels, writes stories, and dreams of being the next Jane Austen." }, { "head": "Math finds her", - "body": "At 13, Maryam fails her first math test. She HATES the subject. But the next year, a different teacher hands her a real puzzle. Maryam solves it… and falls in love." + "body": "At 13, Maryam fails her first math test and decides she HATES the subject. But the next year a different teacher hands her a genuine puzzle instead of a drill sheet. Maryam solves it… and falls completely in love." }, { "head": "Olympiad champion", - "body": "By age 17, Maryam wins gold at the International Math Olympiad — the world's hardest math contest for high schoolers. She's the first Iranian girl to make the team. The next year she wins gold AGAIN." + "body": "By age 17, Maryam wins gold at the International Math Olympiad — the world’s hardest math contest for high schoolers — as the first Iranian girl ever on the team. The next year she returns and wins gold AGAIN." }, { "head": "Off to Harvard", - "body": "She moves to America for grad school at Harvard. Her style is unusual: she draws GIANT doodles on huge sheets of paper. Her office floor is covered in them. Other professors think she's odd. They're wrong." + "body": "She moves to America for grad school at Harvard. Her working style is unusual: she draws GIANT doodles on huge sheets of paper spread across her office floor. Other professors think she’s odd. They are very wrong." }, { "head": "Her question", - "body": "Maryam studies SHAPES — but not flat ones. CURVED shapes like saddles, donuts, pretzels. She asks: what's the SURFACE AREA of a wavy shape? How does it bend?" + "body": "Maryam studies SHAPES — but not flat ones. She explores CURVED surfaces like saddles, donuts, and pretzels, asking questions like: what is the SURFACE AREA of a wavy shape, and how exactly does it bend and stretch?" }, { "head": "Nets, but curved", - "body": "In school you learn nets — the flat shape you fold to make a cube or pyramid. Maryam asks the wild version: what does the 'net' of a shape that BENDS look like?" + "body": "In school you learn nets — the flat pattern you fold up to make a cube or pyramid. Maryam asks the wild grown-up version of the same question: what does the “net” of a surface that BENDS everywhere look like?" }, { "head": "Why curves matter", - "body": "Curved surfaces appear everywhere in real life: planets, soap bubbles, eggshells, the universe itself. Knowing their surface area tells us about gravity, light, even how the universe began." + "body": "Curved surfaces appear all over real life: planets, soap bubbles, eggshells, even spacetime itself. Knowing their areas and curves tells scientists about gravity, light, and how the universe began — geometry at the largest possible scale." }, { "head": "The breakthrough", - "body": "After years of giant-paper doodling, Maryam proves something nobody could prove before — a math rule about how curved surfaces deform. Other mathematicians can't believe it. It opens a brand-new branch of math." + "body": "After years of giant-paper doodling, Maryam proves a theorem about how curved surfaces deform that nobody had cracked before. Other mathematicians can hardly believe it, and her proof opens a brand-new branch of geometry." }, { "head": "Fields Medal, 2014", - "body": "At age 37, Maryam becomes the FIRST woman EVER to win the Fields Medal — math's biggest prize. Only 60 people have won it in 90 years. Iran throws a national celebration." + "body": "In 2014, at age 37, Maryam becomes the FIRST woman EVER to win the Fields Medal — math’s biggest prize, given to only about 60 people in 90 years. Iran throws a national celebration in her honor." }, { "head": "Her secret", - "body": "Reporters ask her secret. She says: 'I find it more enjoyable when it's slow. The beauty comes when you give it time.' Math, for her, was art. Doodling was the work." + "body": "Reporters ask for her secret. She answers: “I find it more enjoyable when it’s slow. The beauty comes when you give it time.” For Maryam math was art, and the doodling WAS the work." }, { "head": "Why she matters", - "body": "Maryam died young in 2017, but her ideas live on. Today, kids around the world (especially girls in Iran) keep her photo on their walls. Math is for everyone — even the kid who failed her first test." + "body": "Maryam died young in 2017, but her ideas live on and keep growing. Kids around the world — especially girls in Iran — keep her photo on their walls as proof that math belongs to everyone, even the kid who failed her first test." + }, + { + "head": "Nets you can try", + "body": "Try Maryam’s starting idea today: unfold a cereal box into its flat net and add up the six rectangle areas. That total IS the surface area. Curved shapes work the same way — just with bendier pieces." + }, + { + "head": "Pro tip: go slow on purpose", + "body": "Pro tip: Maryam’s superpower was patience. When a problem feels impossible, slow down, draw it big, and stare. Fast answers win quizzes; slow, deep thinking wins Fields Medals." + }, + { + "head": "Trap: mixing up area and surface area", + "body": "Trap: confusing area with surface area. Area covers ONE flat face; surface area adds up EVERY face of a 3D object. A cube with 2-unit edges has faces of 4 — but a total surface area of 6 × 4 = 24." + }, + { + "head": "Her legacy in your app", + "body": "When you unfold nets and total up surface areas in the Geometry unit, you’re standing at the entrance of Maryam’s world. She simply kept walking — from cubes, to donuts, to the shape of the universe." } ], "learned": "Surface area + nets aren't just for cubes — they describe any shape, even curvy ones. Maryam Mirzakhani proved it.", @@ -319,19 +479,35 @@ "beats": [ { "head": "Inside a hive", - "body": "Honeybees build cells in PERFECT hexagons — every single one. They've been doing this for 100 million years." + "body": "Look inside any beehive and you’ll find cells built in PERFECT hexagons — every single one, six walls each. Bees have been building this exact shape for around 100 million years." }, { "head": "Why not squares?", - "body": "Squares tile fine. Circles waste tons of space. But hexagons use the LEAST wall material to enclose the same area." + "body": "Why not squares? Squares tile a surface just fine, and circles are strong but waste space between them. Among all shapes that tile perfectly, hexagons enclose the same area using the LEAST total wall material." }, { "head": "Why it matters", - "body": "Bees have to make wax — and wax is expensive! Less wall means more honey storage with less wax." + "body": "Why does wall material matter to a bee? Because bees must MAKE the wax themselves — eating about eight grams of honey to produce one gram of wax. Less wall means more honey stored for less costly wax." }, { "head": "Bees know math", - "body": "Without ever taking a class, evolution found the most EFFICIENT shape. Hexagons win." + "body": "Bees never took a geometry class, yet evolution found the most EFFICIENT shape by trial and error over millions of years. Mathematicians finally PROVED hexagons are optimal in 1999. The bees knew first." + }, + { + "head": "Compare the perimeters", + "body": "Check the efficiency yourself: to enclose an area of about 10 square units, a triangle needs roughly 15 units of wall, a square 12.6, and a hexagon only about 11.8. Six sides wins." + }, + { + "head": "Pro tip: only 3 shapes tile", + "body": "Pro tip: only three regular polygons can tile a flat surface with no gaps — triangles, squares, and hexagons. Their corner angles (60°, 90°, 120°) divide evenly into 360°, so corners meet perfectly." + }, + { + "head": "Trap: pentagons don’t fit", + "body": "Trap: assuming any shape can tile. Try regular pentagons: each corner is 108°, and 360 ÷ 108 isn’t a whole number, so gaps always appear. That’s why you never see pentagon honeycombs." + }, + { + "head": "Hexagons all around you", + "body": "Engineers copy the bees constantly: aircraft panels, cardboard packing, telescope mirrors, and soccer nets all use hexagonal patterns to get maximum strength from minimum material. Nature’s geometry became human technology." } ], "learned": "Shape choice matters. Hexagons pack space the most efficiently.", @@ -345,43 +521,59 @@ "beats": [ { "head": "Maryland, 1731", - "body": "Benjamin Banneker is born to a free Black father and a former slave mother in colonial Maryland. He gets only about six weeks of formal school — his family needs him on the tobacco farm." + "body": "Benjamin Banneker is born in 1731 to a free Black father and a formerly enslaved mother in colonial Maryland. He gets only about six weeks of formal schooling — his family needs his hands on the tobacco farm." }, { "head": "He teaches himself", - "body": "Benjamin borrows books from his neighbor — math books, astronomy books, surveying books. He reads them by candlelight after farm work. He works through every problem." + "body": "So Benjamin teaches himself. He borrows books from a kind neighbor — math books, astronomy books, surveying books — and reads them by candlelight after long days of farm work, patiently working through every single problem." }, { "head": "The wooden clock", - "body": "At 22, he borrows a pocket watch from a traveling salesman. He takes it apart, draws every gear, then carves an entire LIFE-SIZE clock out of WOOD. His clock keeps perfect time for 40 years." + "body": "At 22, he borrows a pocket watch from a traveling salesman, takes it apart, and draws every tiny gear. Then he carves an entire LIFE-SIZE striking clock out of WOOD. His homemade clock keeps accurate time for 40 years." }, { "head": "Stars on the ceiling", - "body": "Decades later, neighbors lend him an old telescope. Benjamin teaches himself ASTRONOMY — predicting the exact moment of a solar eclipse before any famous European does." + "body": "Decades later, neighbors lend him a telescope. Benjamin teaches himself ASTRONOMY from books and observation, eventually predicting the exact moment of a solar eclipse — beating the published forecasts of famous European astronomers." }, { "head": "The almanac", - "body": "He starts publishing an almanac — a yearly book of sunrise times, tide tables, weather predictions, moon phases. To make it, he has to compute thousands of DECIMAL numbers by hand. Down to the second." + "body": "He begins publishing an almanac — a yearly book of sunrise times, tide tables, weather predictions, and moon phases. Producing it means computing thousands of DECIMAL numbers entirely by hand, each one precise down to the second." }, { "head": "Why decimals matter", - "body": "Sunrise at 6.32 means 6 hours and just past 1/3 of the next hour. Each tiny decimal makes a big difference. Off by 0.05 means 3 minutes off — and a wrong fishing tide." + "body": "Why do decimals matter so much here? Sunrise at 6.32 means 6 hours plus 32 hundredths of an hour. Being off by just 0.05 — three minutes — could ruin a farmer’s planting plan or a fisherman’s tide window." }, { "head": "Surveying D.C.", - "body": "In 1791, President Washington picks Banneker to help mark the boundary of America's new capital city. Benjamin uses a telescope and decimal math to lay out the perfect square that becomes Washington, D.C." + "body": "In 1791, President Washington’s team picks Banneker to help survey the boundary of America’s new capital city. Using a telescope, the stars, and decimal arithmetic, he helps lay out the ten-mile square that becomes Washington, D.C." }, { "head": "The famous letter", - "body": "Around the same time, Banneker writes to Thomas Jefferson — author of the Declaration of Independence and slave owner. He sends Jefferson a copy of his almanac as PROOF that Black people can do math just as well as anyone." + "body": "Around the same time, Banneker writes boldly to Thomas Jefferson — author of the Declaration of Independence and a slave owner — enclosing his almanac as living PROOF that Black people possess every bit of mathematical genius." }, { "head": "Jefferson replies", - "body": "Jefferson writes back, admitting he's impressed. He shares the almanac with the French Academy of Sciences as evidence of African American genius. The letters are still studied today." + "body": "Jefferson writes back, admitting he is impressed, and forwards the almanac to the French Academy of Sciences as evidence of African American brilliance. Historians still study this exchange of letters today." }, { "head": "Decimals = precision", - "body": "Every calculation Banneker did — eclipses, tides, the angles of Washington — used DECIMALS. Add a decimal place, double the precision. Hidden behind every almanac entry is the same math you do today." + "body": "Every calculation Banneker made — eclipses, tides, the survey angles of Washington — ran on DECIMALS. Each extra decimal place multiplies the precision by ten. Behind every almanac entry is exactly the math you practice today." + }, + { + "head": "Decimal precision, worked out", + "body": "Feel the power of one decimal place: 6.3 hours could be anywhere in a six-minute window, but 6.32 pins it inside 36 seconds. Every digit you add divides the uncertainty by ten." + }, + { + "head": "Pro tip: estimate, then refine", + "body": "Pro tip: Banneker computed like this — rough answer first, then refine digit by digit. Estimate 6.3, check, adjust to 6.32. Working coarse-to-fine catches big errors before they poison hours of work." + }, + { + "head": "Trap: decimals aren’t minutes", + "body": "Trap: reading 6.32 hours as “6 hours 32 minutes.” It’s 6 hours plus 0.32 × 60 ≈ 19 minutes! Converting decimal hours to minutes means multiplying the decimal part by 60." + }, + { + "head": "Self-taught is still taught", + "body": "Banneker had six weeks of school and a candle. You have lessons, videos, and games in your pocket. His story’s real lesson: curiosity plus steady practice outruns any head start." } ], "learned": "Decimals turn 'about 6 hours' into 'exactly 6.32 hours'. Banneker used them by candlelight to predict the sky.", @@ -395,19 +587,35 @@ "beats": [ { "head": "Hospital visit", - "body": "Ramanujan was the world's greatest self-taught mathematician. His friend G.H. Hardy visited him in the hospital." + "body": "Srinivasa Ramanujan was the world’s greatest self-taught mathematician, famous for seeing patterns nobody else could. One day his friend and collaborator G.H. Hardy visited him in a London hospital." }, { "head": "Boring taxi", - "body": "Hardy said: 'I came in taxi #1729 — a rather dull number.' Ramanujan instantly disagreed." + "body": "Making small talk, Hardy said: “I came in taxi number 1729 — a rather dull number.” Ramanujan instantly disagreed, because to him no number was ever boring once you looked closely." }, { "head": "Two ways!", - "body": "'1729 is the smallest number that's the sum of TWO cubes in two different ways!' he said. 1³ + 12³ AND 9³ + 10³." + "body": "“1729 is the smallest number that is the sum of TWO cubes in two different ways!” he said. A cube means a number times itself twice: 1³ + 12³ works, AND so does 9³ + 10³." }, { "head": "Check it", - "body": "1 + 1728 = 1729. 729 + 1000 = 1729. Both. He saw it instantly." + "body": "Check it yourself: 1 + 1,728 = 1,729, and 729 + 1,000 = 1,729. Both routes land on the same number. He saw both decompositions instantly, from a hospital bed." + }, + { + "head": "Build the cubes", + "body": "Work the cubes step by step: 12³ means 12 × 12 × 12 = 144 × 12 = 1,728. And 9³ = 729 while 10³ = 1,000. Two totally different cube pairs, one shared sum." + }, + { + "head": "Pro tip: play with numbers", + "body": "Pro tip: Ramanujan filled notebooks by simply PLAYING — cubing numbers, adding pairs, hunting coincidences. Try it: list the cubes 1, 8, 27, 64, 125 and see which sums repeat. That’s real research." + }, + { + "head": "Trap: cubes aren’t triples", + "body": "Trap: confusing 12³ with 12 × 3. Cubing means multiplying a number by itself twice (12 × 12 × 12 = 1,728), not multiplying by three (36). Exponents count repeated multiplication." + }, + { + "head": "Taxicab numbers live on", + "body": "Mathematicians now call these “taxicab numbers” in honor of that hospital chat, and computers still hunt for bigger ones today. One casual joke about a dull number became a whole field of study." } ], "learned": "Numbers hide secrets. The deeper you look, the more patterns appear.", @@ -421,19 +629,35 @@ "beats": [ { "head": "No zero?!", - "body": "Most ancient cultures had no symbol for 'nothing'. Try doing math without zero — it's a nightmare." + "body": "Most ancient cultures had no symbol for “nothing” at all. Try doing math without zero — how do you tell 205 from 25, or mark an empty column? It’s a genuine nightmare." }, { "head": "Indian breakthrough", - "body": "A mathematician named Brahmagupta in India officially defined zero in 628 AD: a number that means 'nothing here'." + "body": "The breakthrough came from India: in 628 AD the mathematician Brahmagupta officially defined zero as a real number meaning “nothing here,” and wrote down rules for adding and multiplying with it." }, { "head": "Negatives unlocked", - "body": "Once you have zero, you can have NEGATIVE numbers — anything less than zero. Hello, integers!" + "body": "Once zero exists as a true anchor point, you can go BELOW it — NEGATIVE numbers, for debts, temperatures, and depths. Zero unlocked the whole family of integers stretching in both directions." }, { "head": "Modern math", - "body": "Every number line, every coordinate plane, every computer chip uses zero. Quietly the most important number ever." + "body": "Today every number line, every coordinate plane, every thermometer, and every computer chip is built on zero. Computers literally think in 1s and 0s. Quietly, zero became the most important number ever invented." + }, + { + "head": "Zero as placeholder", + "body": "Zero’s first job is holding places: in 507, the zero shouts “no tens here!” Without it, 57 and 507 would look identical. Place value only works because empty columns get their own symbol." + }, + { + "head": "Pro tip: anchor at zero", + "body": "Pro tip: when comparing integers, always picture zero as the anchor. Numbers right of zero are positive, left are negative, and −3 is LESS than −1 because it sits farther left." + }, + { + "head": "Trap: zero isn’t “nothing to do”", + "body": "Trap: treating zero like it does nothing in every operation. Adding 0 changes nothing, true — but multiplying by 0 wipes any number to 0, and dividing BY zero is forbidden entirely. Zero has sharp rules." + }, + { + "head": "From India to your phone", + "body": "Zero traveled from India through Arab mathematicians like al-Khwarizmi into Europe, arriving around 1200 AD with Fibonacci’s books. Eight centuries later, every app you open runs on oceans of zeros." } ], "learned": "Zero is the ANCHOR of the number line. Positives right, negatives left.", @@ -447,23 +671,39 @@ "beats": [ { "head": "Math superstar", - "body": "Katherine Johnson was a Black mathematician at NASA. She did some of the hardest math humans had ever attempted." + "body": "Katherine Johnson was a Black mathematician at NASA during the Space Race, hired as a human “computer.” She did some of the hardest and most important math humans had ever attempted — by hand." }, { "head": "Plotting a path", - "body": "She used the coordinate plane. Every point in space gets a label like (x, y). Earth here, Moon way over there." + "body": "Her canvas was the coordinate plane. Every point in space gets a label like (x, y): Earth sits here, the Moon way over there, and a spacecraft is just a moving point between them." }, { "head": "The trajectory", - "body": "Katherine calculated the EXACT curve a rocket would follow from Earth to Moon — every (x, y) point along the way." + "body": "Katherine calculated the EXACT curve a rocket must follow from Earth to the Moon — every (x, y) point along the path, accounting for gravity bending the route the entire way." }, { "head": "Astronaut's choice", - "body": "Astronaut John Glenn refused to fly unless Katherine personally checked the trajectory. The computers might be wrong — but she wouldn't be." + "body": "Astronaut John Glenn famously refused to fly his orbital mission unless Katherine personally re-checked the electronic computer’s trajectory numbers. The machines might be wrong — but her math wouldn’t be." }, { "head": "We made it", - "body": "Her work helped Apollo 11 land on the Moon in July 1969. The coordinate plane took humans to another world." + "body": "Her calculations helped Apollo 11 land on the Moon in July 1969 and — just as critically — return home safely. The humble coordinate plane carried humans to another world." + }, + { + "head": "Plot a mini-trajectory", + "body": "Try a tiny version: a ball’s path passes through (0, 0), (1, 4), (2, 6), (3, 6), (4, 4), (5, 0). Plot the points and connect them — you just graphed a trajectory, exactly Katherine’s core move." + }, + { + "head": "Pro tip: label your axes", + "body": "Pro tip: Katherine’s work only made sense because every axis had meaning — x might be downrange distance, y altitude. Always say what your axes measure; an unlabeled graph is a story with no characters." + }, + { + "head": "Trap: swapping x and y", + "body": "Trap: plotting (3, 5) by going UP 3 and ACROSS 5. Order matters: x comes first and runs horizontally. For a spacecraft, swapping coordinates wouldn’t be a small mistake — it would miss the Moon." + }, + { + "head": "Hidden Figures, real math", + "body": "Katherine’s story became the film Hidden Figures, but the math was no Hollywood prop: geometry, coordinates, and careful arithmetic. She received the Presidential Medal of Freedom at age 97 for that pencil-and-paper heroism." } ], "learned": "The coordinate plane pinpoints any location — even a spacecraft (x, y) million miles from home.", @@ -477,19 +717,35 @@ "beats": [ { "head": "Long, long ago", - "body": "Young Carl Gauss is in class. His teacher is grumpy and wants the kids to be quiet for an hour." + "body": "Long ago in Germany, young Carl Gauss sits in elementary school. His teacher is grumpy, the class is noisy, and the teacher wants everyone silently busy for a full hour." }, { "head": "The mean assignment", - "body": "She says: 'Add every number from 1 to 100.' She thinks that should take all day." + "body": "So she assigns the meanest problem she can think of: “Add every whole number from 1 to 100.” One hundred additions in a row — she expects it to take the class all day." }, { "head": "Gauss's trick", - "body": "Gauss sees 1+100 = 101, 2+99 = 101, 3+98 = 101. Each pair sums to 101 — and there are 50 pairs." + "body": "Gauss stares for a moment and sees a hidden structure: pair the ends! 1 + 100 = 101, 2 + 99 = 101, 3 + 98 = 101… every pair sums to 101, and 100 numbers make exactly 50 pairs." }, { "head": "30 seconds later", - "body": "Gauss walks up: 50 × 101 = 5050. The teacher's jaw drops." + "body": "About thirty seconds later, Gauss walks up with his slate: 50 × 101 = 5,050. The teacher’s jaw drops. One clever pairing replaced ninety-nine tedious additions with a single multiplication." + }, + { + "head": "Use the trick yourself", + "body": "Add 1 to 20 with Gauss’s trick: 1 + 20 = 21, and there are 10 pairs, so the total is 10 × 21 = 210. The general formula is n × (n + 1) ÷ 2." + }, + { + "head": "Pro tip: hunt for structure", + "body": "Pro tip: before grinding through a long calculation, pause and ask “is there a pattern that collapses this?” Pairing, grouping, and reordering are legal because addition doesn’t care about order." + }, + { + "head": "Trap: miscounting the pairs", + "body": "Trap: pairing 1 to 100 and claiming 100 pairs. Each pair uses TWO numbers, so 100 numbers form only 50 pairs. Halve the count, or the famous shortcut doubles your answer." + }, + { + "head": "Gauss grew up", + "body": "That schoolboy became the “Prince of Mathematicians,” reshaping algebra, geometry, astronomy, and statistics. The instinct was the same all his life: never brute-force what a pattern can finish in one line." } ], "learned": "Look for PATTERNS, not just brute force. Math is sneaky.", @@ -503,43 +759,59 @@ "beats": [ { "head": "Paris, winter 1637", - "body": "A French philosopher named René Descartes is in bed with the flu. He's bored out of his mind. To kill time, he stares at the ceiling above his bed." + "body": "Paris, winter 1637. The French philosopher René Descartes lies in bed with the flu, bored out of his mind. With nothing else to do, he stares at the ceiling above his bed." }, { "head": "Enter: the fly", - "body": "A fly lands on the ceiling and starts crawling around. Descartes watches it walk to one corner, then the other, then the middle. He gets curious." + "body": "Enter: the fly. It lands on the ceiling and starts crawling — to one corner, across the middle, back again. Descartes watches it wander and feels a question forming." }, { "head": "The question", - "body": "Can I describe EXACTLY where the fly is — without pointing? Could I write the fly's spot in a letter to a friend who can't see my ceiling?" + "body": "The question: can I describe EXACTLY where the fly is — without pointing at it? Could I write the fly’s position in a letter to a friend who has never seen my ceiling?" }, { "head": "His insight", - "body": "Pick any corner of the ceiling. Now I just need TWO numbers: how far ACROSS the fly is, and how far UP from that corner. Boom — exact location, no pointing required." + "body": "His insight: pick a corner of the ceiling as a starting point. Then just TWO numbers pin the fly down: how far ACROSS it is, and how far UP from that corner. Exact location, no pointing required." }, { "head": "x and y are born", - "body": "Descartes labels the across number 'x' and the up number 'y'. Every point on the ceiling — every point on ANY flat surface — can be named with just two numbers: (x, y)." + "body": "Descartes names the across-number “x” and the up-number “y.” Every point on the ceiling — every point on ANY flat surface — can now be named with an ordered pair of numbers: (x, y)." }, { "head": "The big leap", - "body": "If I can name a POINT with two numbers, I can name a whole LINE. And a CURVE. And a SHAPE. Anything geometric becomes pairs of numbers I can compute with." + "body": "Then the big leap: if a POINT is two numbers, a whole LINE is an equation relating x and y — and so is a curve, a circle, any shape. Geometry becomes something you can CALCULATE with." }, { "head": "Math fuses with geometry", - "body": "Before Descartes, math and geometry were separate subjects. He glued them together. Algebra problems became pictures; pictures became algebra. Game changer." + "body": "Before Descartes, algebra and geometry were separate school subjects. He glued them together forever: equations became pictures, pictures became equations. Mathematicians call it the greatest merger in math history." }, { "head": "Every screen, every map", - "body": "Every map app, every video game, every weather radar uses Descartes' idea. They all describe locations as pairs (x, y) — or, in 3D, triples (x, y, z)." + "body": "Every map app, video game, spreadsheet, and weather radar runs on his idea, describing every location as a pair (x, y) — or a triple (x, y, z) once you add height for 3D worlds." }, { "head": "Apollo and beyond", - "body": "300 years later, NASA used Descartes' coordinate plane to plot the path of Apollo 11 to the Moon. (Katherine Johnson did those calculations by hand!) Same idea, same math." + "body": "Three hundred years later, NASA plotted Apollo 11’s path to the Moon on Descartes’ coordinate plane — with Katherine Johnson doing those calculations by hand. Same fly-on-the-ceiling idea, scaled to the Moon." }, { "head": "Look around", - "body": "Look at any screen, any grid, any graph in your math book. The two axes — x going right, y going up — are Descartes' fly, ascended to the world of pure math." + "body": "Now look around: every screen, every grid, every graph in your math book carries two axes — x running right, y running up. That’s Descartes’ fly, immortalized in the world of pure math." + }, + { + "head": "Name the fly’s spot", + "body": "Play Descartes for a second: the fly sits 4 tiles right and 2 tiles up from the corner. Its address is (4, 2). Another fly at (2, 4) is at a completely DIFFERENT spot — order matters." + }, + { + "head": "Pro tip: run before you jump", + "body": "Pro tip: remember “run before you jump.” The first coordinate always runs horizontally, the second jumps vertically. Whisper it every time you plot and you will never reverse a point again." + }, + { + "head": "Trap: forgetting the origin", + "body": "Trap: coordinates mean nothing without an agreed starting corner — the ORIGIN (0, 0). Two people using different corners will describe the same fly with different numbers. Fix the origin first, then measure." + }, + { + "head": "From flu to framework", + "body": "One bored sick day produced the framework for graphs, GPS, animation, and rocket science. Keep a notebook when you’re curious — Descartes’ ceiling doodle became the backbone of modern mathematics." } ], "learned": "Any point on a plane = two numbers, (x, y). Descartes saw it first while watching a fly walk on his ceiling.", @@ -553,19 +825,35 @@ "beats": [ { "head": "A weird number", - "body": "A baseball announcer says 'he's batting three-hundred'. What does .300 even mean?" + "body": "A baseball announcer says a player is “batting three hundred” and the crowd nods along. But what does the mysterious number .300 actually mean? It isn’t three hundred of anything." }, { "head": "It's a rate", - "body": "Batting average = hits per at-bat. 150 hits in 500 tries is 150 ÷ 500 = 0.300." + "body": "It’s a RATE in disguise: batting average = hits ÷ at-bats. A player with 150 hits in 500 tries has 150 ÷ 500 = 0.300. The division turns two counts into one comparable number." }, { "head": "Per ONE", - "body": "0.300 means '0.3 hits per 1 at-bat' — a UNIT rate. We always scale down to per-one to compare." + "body": "That 0.300 means “0.3 hits per 1 at-bat” — a UNIT rate. Scaling everything down to per-ONE is what lets us fairly compare players with totally different numbers of at-bats." }, { "head": "Why it's good", - "body": "Most major leaguers hit around .250. Hitting .300 means succeeding 3 of every 10 tries — and that's elite!" + "body": "Why is .300 special? Most major leaguers hit around .250, or 1 hit in 4 tries. Batting .300 means succeeding 3 times in every 10 attempts — and in baseball, that’s elite." + }, + { + "head": "Compare two players", + "body": "Player A: 90 hits in 300 at-bats → 90 ÷ 300 = 0.300. Player B: 120 hits in 480 → 0.250. B has MORE hits, but A is the better hitter per try. Unit rates reveal it." + }, + { + "head": "Pro tip: per-one everything", + "body": "Pro tip: “per-one” thinking works everywhere — price per ounce at the store, points per game, kilometers per liter. Divide the total by the count and suddenly any two options become comparable." + }, + { + "head": "Trap: comparing raw totals", + "body": "Trap: judging by totals alone. 120 hits sounds better than 90 — until you notice the 480 tries behind it. Raw counts ignore opportunity; rates account for it. Always ask “out of how many?”" + }, + { + "head": "Decimals as percents", + "body": "Batting .300 is just 30% written as a decimal, since 0.300 × 100 = 30. Sports quietly train you to read decimals, rates, and percents — the exact skills in your Ratios unit." } ], "learned": "A UNIT RATE answers 'how much per ONE' — perfect for comparing.", @@ -579,19 +867,35 @@ "beats": [ { "head": "Unbreakable code", - "body": "In World War II, Germany used a machine called Enigma to scramble messages. Billions of possible settings." + "body": "In World War II, Germany scrambled its military messages with a machine called Enigma. With billions of possible settings that changed daily, everyone believed the code was completely unbreakable." }, { "head": "Frequency trick", - "body": "In English, the letter E shows up ~13% of the time, T about 9%, A about 8%. Every language has its own 'fingerprint'." + "body": "But language leaves fingerprints: in ordinary English text the letter E appears about 13% of the time, T about 9%, A about 8%. Every language has its own stable ratio pattern." }, { "head": "Pattern hunting", - "body": "Alan Turing built a machine that compared letter frequencies in coded messages to known patterns — until they matched." + "body": "Alan Turing and the team at Bletchley Park built machines that compared letter frequencies in coded messages against those known ratios — testing settings at superhuman speed until the fingerprint matched." }, { "head": "History changed", - "body": "Code-cracking shortened the war by years. Counting RATIOS literally saved lives." + "body": "Cracking Enigma is estimated to have shortened the war by two years or more. Counting letters and comparing RATIOS — humble statistics — literally saved millions of lives." + }, + { + "head": "Try frequency counting", + "body": "Test the fingerprint yourself: take any paragraph and tally its letters. In 100 letters you’ll find roughly 13 Es but only 1 or 2 Zs. Even short texts echo the language-wide ratios." + }, + { + "head": "Pro tip: big samples, steady ratios", + "body": "Pro tip: ratios stabilize as samples grow. Ten letters might fool you, but a thousand letters almost never lie. When using data, more observations mean the pattern you see is the pattern that’s real." + }, + { + "head": "Trap: tiny samples", + "body": "Trap: trusting a ratio from a tiny sample. The word “fizz” is 50% Z — but English isn’t! Codebreakers needed long messages for the frequencies to emerge. Small data makes loud, wrong claims." + }, + { + "head": "Statistics still guard secrets", + "body": "Modern cybersecurity still runs on Turing’s insight: computers detect spam, fraud, and hacked accounts by spotting when letter and number patterns drift from expected ratios. Statistical fingerprints never went out of style." } ], "learned": "A ratio (E : everything else) is a powerful clue, even in spy stuff.", @@ -605,19 +909,35 @@ "beats": [ { "head": "12 yards from goal", - "body": "A penalty kick is a one-on-one: just you and the keeper. Goals happen about 75% of the time." + "body": "A penalty kick puts the ball 12 yards from goal: just you against the keeper, whole stadium holding its breath. Across professional soccer, kickers score about 75% of the time." }, { "head": "Why so often?", - "body": "The keeper has to GUESS before you kick. If they guess wrong, you score easily." + "body": "Why do kickers win so often? The goal is huge and the ball flies fast, so the keeper must GUESS a direction and dive BEFORE the kick. Guess wrong, and the kicker scores easily." }, { "head": "3 out of 4 = 75%", - "body": "We can write that as a fraction OR a percent. Same thing — both mean 3 in every 4 attempts." + "body": "That 75% can be written as the fraction 3/4 or the percent 75% — the exact same quantity in two costumes. Both simply mean 3 successes in every 4 attempts." }, { "head": "Keeper's job", - "body": "About 25% of the time the keeper guesses right and saves. Tough job!" + "body": "The keeper’s side of the math: only about 25% of penalties are saved, mostly when the dive guesses correctly. One save in four attempts — a genuinely tough job description." + }, + { + "head": "Expected goals, worked out", + "body": "A team taking 8 penalties over a season at 75% expects 0.75 × 8 = 6 goals. Percents become predictions when you multiply the rate by the number of chances." + }, + { + "head": "Pro tip: percent ↔ fraction ↔ decimal", + "body": "Pro tip: master the outfit changes — 75% = 3/4 = 0.75. Use whichever form makes the arithmetic easy: fractions for shares, decimals for multiplying, percents for talking. They’re one number, three costumes." + }, + { + "head": "Trap: 75% isn’t a promise", + "body": "Trap: expecting exactly 3 goals in every 4 kicks. Percents describe LONG-RUN averages, not guarantees. A star can miss two in a row and still be a 75% kicker over the season." + }, + { + "head": "Data changes the game", + "body": "Real teams keep spreadsheets of every kicker’s favorite corner, and keepers study them before finals. Sports analytics is percents, ratios, and probability applied at full sprint — your math unit, on grass." } ], "learned": "Percent = how many out of 100. Useful for comparing chances.", @@ -631,19 +951,35 @@ "beats": [ { "head": "First move", - "body": "Watch any expert: they grab the CENTER square first, every time. Why?" + "body": "Watch any tic-tac-toe expert and you’ll spot the same opening: they grab the CENTER square first, every single time. Is that superstition, or is there real math behind the habit?" }, { "head": "Count the lines", - "body": "There are 8 ways to win: 3 rows, 3 columns, 2 diagonals. Every winning line goes through certain cells." + "body": "Count the ways to win: 3 rows, 3 columns, and 2 diagonals make exactly 8 winning lines. Every one of those lines passes through some specific set of three cells." }, { "head": "Center wins", - "body": "The center square is on 4 of the 8 lines. Corners are on 3. Edges only on 2." + "body": "Now score each square by the lines it touches: the center sits on 4 of the 8 winning lines, each corner on 3, and each edge square on only 2." }, { "head": "Most chances", - "body": "By taking center, you start in the cell with the MOST chances to win. It's a stats decision — find the spot with the most chances!" + "body": "By taking the center you start in the square with the MOST winning chances. It’s a counting decision, not luck — enumerate the options, then pick the spot with the highest count." + }, + { + "head": "Verify the center’s count", + "body": "Check the center’s 4 lines yourself: its row, its column, and BOTH diagonals all pass through it. A corner only catches one row, one column, and one diagonal — three lines, one fewer." + }, + { + "head": "Pro tip: count before you move", + "body": "Pro tip: in any game, rank moves by counting the future options each one keeps open. More open lines means more ways to threaten. Great players are quietly doing combinatorics every turn." + }, + { + "head": "Trap: edges feel safe", + "body": "Trap: grabbing an edge square because it “looks central enough.” Edges touch just 2 winning lines — the weakest cells on the board. Feelings lie; counts don’t. Corners beat edges every time." + }, + { + "head": "Solved games", + "body": "Tic-tac-toe is fully “solved”: with perfect play by both sides, every game ends in a draw. Mathematicians proved it by counting all 255,168 possible games — counting, at heroic scale." } ], "learned": "Counting OPTIONS helps you pick the smartest move.", @@ -657,19 +993,35 @@ "beats": [ { "head": "Make a guess", - "body": "Imagine a room. How many people do you need for a 50/50 chance that TWO of them share a birthday?" + "body": "Make a guess: how many people must be in a room for a 50/50 chance that at least TWO of them share the exact same birthday? Lock in your number before reading on." }, { "head": "Most people say 180", - "body": "Half of 365 sounds smart. But the answer is MUCH smaller — and surprises everyone." + "body": "Most people guess around 180, reasoning that it should take half of 365. But the true answer is dramatically smaller — and it surprises nearly everyone the first time they hear it." }, { "head": "Just 23!", - "body": "Why? With 23 people, there are 23×22÷2 = 253 PAIRS to check. Plenty of chances to match." + "body": "Just 23 people! The secret is that we’re matching PAIRS, not individuals: 23 people create 23 × 22 ÷ 2 = 253 different pairs, and each pair is a fresh chance to match." }, { "head": "The whole curve", - "body": "40 people: 89%. 60 people: 99%. Try this with your classroom!" + "body": "The curve climbs shockingly fast: with 40 people the chance of a shared birthday is 89%, and with 60 it passes 99%. Try the experiment with your own classroom!" + }, + { + "head": "Why pairs, worked out", + "body": "Each of 23 people can pair with 22 others, giving 23 × 22 = 506 orderings — but Ana-Ben and Ben-Ana are the same pair, so halve it: 253 pairs. That’s 253 lottery tickets for a match." + }, + { + "head": "Pro tip: flip the question", + "body": "Pro tip: mathematicians compute the chance of NO shared birthday first — multiplying 365/365 × 364/365 × 363/365… — then subtract from 100%. Flipping to the opposite event often makes impossible-looking problems easy." + }, + { + "head": "Trap: “it’s about MY birthday”", + "body": "Trap: hearing “someone shares MY birthday.” That’s a different, much rarer event needing 253 people for 50/50. The paradox asks about ANY two people matching — and pairs multiply much faster than people." + }, + { + "head": "Paradox with a job", + "body": "This isn’t just a party trick: computer scientists use “birthday attacks” to test password security, because random collisions appear far sooner than intuition expects. Counting pairs correctly protects your accounts." } ], "learned": "Counting PAIRS gets big fast — way faster than counting people.", @@ -683,47 +1035,63 @@ "beats": [ { "head": "London, 1820", - "body": "Florence Nightingale is born to a rich British family. Her parents expect her to marry a duke and host fancy parties. She has other plans." + "body": "Florence Nightingale is born in 1820 to a wealthy British family. Her parents expect her to marry a duke and host elegant parties. Florence, stubborn and brilliant, has entirely other plans." }, { "head": "Off to nursing school", - "body": "At age 16, Florence announces she wants to be a NURSE. Her parents are horrified — nursing is a low-paying, dirty job back then. She does it anyway." + "body": "At 16 she announces she will become a NURSE. Her parents are horrified — nursing then is considered dirty, low-paid work far beneath her class. She studies mathematics and nursing anyway." }, { "head": "War, 1854", - "body": "Britain is fighting a brutal war in Crimea, near modern Russia. Soldiers are dying by the thousands — but mostly NOT from battle wounds. Something else is killing them in the hospitals." + "body": "In 1854 Britain is fighting a brutal war in Crimea, near modern Russia. Soldiers are dying by the thousands — but mostly NOT from battle wounds. Something invisible is killing them inside the hospitals." }, { "head": "What she found", - "body": "Florence shows up to the war hospital with 38 nurses. It's a horror show: rats, no clean water, soldiers crammed in dirty rooms. She's furious. She starts WRITING DOWN every death." + "body": "Florence arrives at the war hospital with 38 nurses and finds a horror show: rats, filthy water, wounded men packed into dirty rooms. Furious, she starts systematically WRITING DOWN every single death and its cause." }, { "head": "The math nobody wanted", - "body": "Out of 4 soldiers who came to the hospital, ONE was dying — not from bullets, but from disease, infections, and bad food. Florence proves it with numbers." + "body": "Her ledger reveals the truth: of every 4 soldiers who entered the hospital, 1 was dying — not from bullets, but from disease, infection, and rotten food. Florence can prove it with numbers." }, { "head": "Nobody listens to numbers", - "body": "Florence sends report after report to British generals. They ignore her. Long lists of numbers don't move politicians. She needs something stronger." + "body": "She mails report after report to the British generals, packed with careful tables. They ignore her. Long columns of numbers don’t move busy politicians — she realizes she needs something they cannot look away from." }, { "head": "Her invention", - "body": "Florence invents a brand-new kind of chart: the ROSE DIAGRAM (also called a 'coxcomb'). Each wedge shows one month. The BIGGER the wedge, the MORE soldiers died that month." + "body": "So Florence invents a brand-new kind of chart: the ROSE DIAGRAM (also called a coxcomb). Each wedge is one month of the war, and the BIGGER the wedge, the MORE soldiers died that month." }, { "head": "RED for the truth", - "body": "She colors disease deaths RED and battle deaths a tiny blue sliver. One look and you can see it: the red wedges DWARF the blue. Disease — not the war — was the real killer." + "body": "She colors deaths from disease RED and battle deaths a thin blue sliver. One glance tells the whole story: the red utterly DWARFS the blue. Filth — not fighting — was the real killer." }, { "head": "Hospitals get fixed", - "body": "Florence sends her rose diagram to Queen Victoria and Parliament. Within a year, hospitals start cleaning up: fresh water, clean bandages, better food. Deaths drop from 42% to 2%." + "body": "Florence sends her rose diagram to Queen Victoria and Parliament. Within a year hospitals begin transforming: clean water, fresh bandages, decent food. The death rate collapses from 42% to just 2%." }, { "head": "First woman in the club", - "body": "In 1859, Florence becomes the first woman ever elected to the Royal Statistical Society. The men have to admit it: graphs that tell a clear story are math you can't argue with." + "body": "In 1859 Florence becomes the first woman ever elected to the Royal Statistical Society. The members concede what her diagram proved: a graph that tells a clear, honest story is math you cannot argue with." }, { "head": "Why she matters", - "body": "Every modern chart you see — bar graphs, pie charts, line charts, infographics — comes from Florence's idea: turn data into a picture and the truth jumps out." + "body": "Every modern chart you meet — bar graphs, pie charts, line plots, infographics — descends from Florence’s insight: turn raw data into the RIGHT picture and the truth jumps out where words and tables failed." + }, + { + "head": "Read her numbers", + "body": "Feel her data: in January 1855 alone, about 2,761 soldiers died of disease versus 83 of wounds — a ratio of roughly 33 to 1. No wonder her red wedges swallowed the blue slivers." + }, + { + "head": "Pro tip: match chart to question", + "body": "Pro tip: choose the chart that answers YOUR question. Comparing categories? Bars. Showing change over time? A line. Parts of a whole? Pie or rose. The right picture makes the answer obvious before any words." + }, + { + "head": "Trap: charts can lie", + "body": "Trap: a bad chart misleads as powerfully as a good one persuades. Watch for stretched axes, missing zero lines, and cherry-picked months. Florence’s power came from honest data honestly drawn — always check the scales." + }, + { + "head": "Data saves lives today", + "body": "Modern hospitals still run on Nightingale’s method: dashboards track infections, and health agencies graph outbreaks to decide where help goes first. When you read a data display in this unit, you’re training for that work." } ], "learned": "A good chart can tell a story numbers alone cannot. Florence proved it in 1854 and saved a million lives.", diff --git a/src/data/mathematicianDecks.ts b/src/data/mathematicianDecks.ts new file mode 100644 index 0000000..f262321 --- /dev/null +++ b/src/data/mathematicianDecks.ts @@ -0,0 +1,584 @@ +// Story-style slide decks for the Famous Mathematicians page. Each deck has +// 12–20 slides (~3 short sentences each) telling: their life → the big idea → +// how it works (worked mini-examples a 6th grader can follow) → why it matters +// today → how it ties to this app's units. `visual` is an emoji scene (2–4 +// emoji) rendered LARGE in the illustration pane, matching the app's art style. +export interface MathSlide { + head: string; + body: string; + visual: string; // 2–4 emoji drawn big in the right pane +} + +export interface MathematicianDeck { + id: string; // matches the name in Mathematicians.tsx + name: string; + era: string; + emoji: string; + tieIn: string; // which app unit(s) this connects to, shown on the title slide + slides: MathSlide[]; +} + +export const MATHEMATICIAN_DECKS: MathematicianDeck[] = [ + { + id: 'Euclid', + name: 'Euclid', + era: '300 BC', + emoji: '📐', + tieIn: '6.G · Geometry', + slides: [ + { + head: 'A teacher in Alexandria', + body: 'Around 300 BC, Euclid taught mathematics in Alexandria, Egypt — home of the most famous library of the ancient world. Scholars sailed there from everywhere to study. Euclid gathered everything the Greeks knew about shapes and numbers into one grand plan.', + visual: '🏛️📜🌊', + }, + { + head: 'No royal road', + body: 'A famous story says King Ptolemy asked Euclid for a shortcut to learn geometry. Euclid replied, "There is no royal road to geometry." Even kings have to practice step by step — just like you!', + visual: '👑🚫🛣️', + }, + { + head: 'The Elements', + body: 'Euclid wrote a set of 13 books called the Elements. It became the most successful textbook in history, studied for more than 2,000 years. Even Abraham Lincoln worked through it to sharpen his thinking.', + visual: '📚🕰️', + }, + { + head: 'Start with the obvious', + body: 'Euclid\'s big idea: begin with a few simple rules everyone agrees on, called axioms. For example: you can draw a straight line between any two points. From those tiny seeds, he grew all of geometry.', + visual: '🌱📏', + }, + { + head: 'Words with exact meanings', + body: 'Euclid carefully defined his building blocks first. A point is a location with no size at all. A line is perfectly straight and thin, and a circle is every point sitting the same distance from a center.', + visual: '⚫📏⭕', + }, + { + head: 'Prove it!', + body: 'Instead of saying "trust me," Euclid proved every fact with a chain of logic. Each step follows from the one before, like stepping stones across a river. If every step is solid, the conclusion must be true.', + visual: '🪜✅', + }, + { + head: 'A rope trick from Egypt', + body: 'Ancient Egyptian builders used a rope tied with 12 equally spaced knots. They stretched it into a triangle with sides of 3, 4, and 5 knots. Like magic, the corner between the 3 and 4 sides was a perfect right angle.', + visual: '🪢📐', + }, + { + head: 'Why 3-4-5 works', + body: 'Greek geometry proved the rule behind it: in a right triangle, the two short sides squared add up to the long side squared. Check it: 3 × 3 = 9 and 4 × 4 = 16. And 9 + 16 = 25.', + visual: '3️⃣4️⃣5️⃣', + }, + { + head: 'The perfect check', + body: 'Now square the long side: 5 × 5 = 25. It matches 9 + 16 exactly! Because the numbers fit the rule, the triangle must contain a right angle — perfect for building square walls and pyramids.', + visual: '✅🔺', + }, + { + head: 'Tear the corners', + body: 'Here\'s another gem from the Elements: the three angles of any triangle add up to 180°, a straight line. Try it — draw a triangle, tear off the corners, and line them up. They form a straight edge every time.', + visual: '🔺✂️➖', + }, + { + head: 'Geometry builds the world', + body: 'Architects, engineers, and carpenters still use Euclid\'s rules every single day. Bridges, skyscrapers, and even soccer balls depend on triangles and angles. Triangles are extra strong, which is why you see them in towers and cranes.', + visual: '🌉🏗️', + }, + { + head: 'Geometry in your pocket', + body: 'Video games draw every 3D world out of millions of tiny triangles. GPS finds your location using circles and distances, straight from Euclid\'s toolbox. Two-thousand-year-old math is running inside your phone right now.', + visual: '🎮📱🛰️', + }, + { + head: 'Your turn: 6.G Geometry', + body: 'Everything in this app\'s Geometry unit — areas of triangles, nets of 3D shapes, distances on grids — grows from Euclid\'s Elements. When you explain why a formula works, you\'re walking in his footsteps.', + visual: '📐🧒✨', + }, + ], + }, + { + id: 'Isaac Newton', + name: 'Isaac Newton', + era: '1642–1727', + emoji: '🍎', + tieIn: '6.RP · Rates of change', + slides: [ + { + head: 'A tiny baby on a farm', + body: 'Isaac Newton was born on Christmas Day, 1642, on a farm in Woolsthorpe, England. He was born so small that no one expected him to survive. He grew up quiet and curious, building model windmills and sundials.', + visual: '🏡🐑🌾', + }, + { + head: 'The plague years', + body: 'In 1665, sickness closed Cambridge University, so 22-year-old Newton went home to the farm. In under two years there he invented calculus, split sunlight with prisms, and puzzled out gravity. He called it his "year of wonders."', + visual: '🚪🌈🔭', + }, + { + head: 'The famous apple', + body: 'Sitting in his garden, Newton watched an apple fall and asked a wild question. If gravity pulls the apple down, could the same pull reach all the way up to the Moon? Nobody had ever connected the sky to the ground before.', + visual: '🍎🌳💫', + }, + { + head: 'The math of change', + body: 'Newton invented calculus, the mathematics of things that change. How fast is a rocket speeding up? How quickly does hot cocoa cool down? Calculus answers questions about change — and change is everywhere you look.', + visual: '🚀📈', + }, + { + head: 'One rule for everything', + body: 'His law of gravity says every object pulls on every other object. The same rule guides a falling apple, the Moon circling Earth, and Earth circling the Sun. One short equation explains the whole solar system.', + visual: '🌍🌙☀️', + }, + { + head: 'Three laws of motion', + body: 'Newton also wrote three famous laws of motion. Objects keep doing what they\'re doing unless a force acts, bigger forces mean faster speeding up, and every push gets an equal push back. Rockets literally fly on law number three.', + visual: '🎳➡️💥', + }, + { + head: 'Speed is a rate', + body: 'Newton\'s math starts with rates. If you bike 30 kilometers in 2 hours, your speed is 30 ÷ 2 = 15 kilometers per hour. A rate compares two changing things — here, distance and time.', + visual: '🚴⏱️', + }, + { + head: 'Picture it as a graph', + body: 'Plot distance against time and your journey becomes a line. A steep line means you covered lots of distance quickly — you were fast. A flat line means you stopped for a snack. Steepness IS speed.', + visual: '📈⛰️', + }, + { + head: 'Newton\'s zoom trick', + body: 'But what if your speed keeps changing, like a skateboard rolling downhill? Newton\'s trick: zoom in on one tiny instant and find the rate right there. That zooming idea is the heart of calculus — a speedometer is calculus in action.', + visual: '🛹🔎', + }, + { + head: 'To the Moon', + body: 'NASA used Newton\'s laws to steer astronauts to the Moon in 1969 — three centuries after he wrote them. His equations still guide every rocket, satellite, and space probe today. Not bad for ideas born on a quiet farm.', + visual: '🚀🌕', + }, + { + head: 'Newton in your day', + body: 'Weather forecasts, car safety tests, and roller coaster designs all run on Newton\'s math. Video game characters jump and fall using his laws of motion. Even the physics in your favorite games owes him a thank-you.', + visual: '🎢🎮🌦️', + }, + { + head: 'Your turn: 6.RP Rates', + body: 'In this app\'s Ratios and Rates unit, you\'re learning Newton\'s starting point: speed, unit rates, and comparing quantities that change together. Master rates now, and calculus will one day feel like the natural next step.', + visual: '🍎📈🧒', + }, + ], + }, + { + id: 'Leonhard Euler', + name: 'Leonhard Euler', + era: '1707–1783', + emoji: '📊', + tieIn: '6.EE · Exponents & graphs', + slides: [ + { + head: 'A boy from Basel', + body: 'Leonhard Euler was born in Basel, Switzerland, in 1707, the son of a pastor. He had an astonishing memory and could recite an entire epic poem by heart. He could also do enormous calculations entirely in his head.', + visual: '🏔️🧠', + }, + { + head: 'Math at the kitchen table', + body: 'Euler worked in the great cities of St. Petersburg and Berlin. He had thirteen children and often wrote world-changing papers with a baby on his lap. Family noise never slowed him down one bit.', + visual: '👨‍👩‍👧‍👦📝', + }, + { + head: 'Unstoppable', + body: 'Later in life Euler lost his eyesight, but he simply did the math in his head and spoke it aloud for helpers to write down. He produced more mathematics than anyone in history — over 850 books and papers.', + visual: '💡🗣️✍️', + }, + { + head: 'The seven bridges', + body: 'The city of Königsberg had seven bridges connecting its riverbanks and islands. Citizens wondered: could you take a walk that crosses every bridge exactly once? Nobody could do it, but nobody could explain why.', + visual: '🌉🌉🚶', + }, + { + head: 'Turn the city into dots', + body: 'Euler\'s genius move: ignore the buildings and distances. Draw each piece of land as a dot and each bridge as a line between dots. Suddenly a messy city map became a simple diagram — the very first "graph."', + visual: '⚫➖⚪', + }, + { + head: 'Count the connections', + body: 'Euler counted the lines touching each dot. To walk every bridge once, at most two dots may have an odd number of lines — your start and your finish. In Königsberg all four dots were odd, so the walk is impossible. Proven forever!', + visual: '🔢❌🚶', + }, + { + head: 'The power of doubling', + body: 'Euler loved powers, like 2¹⁰ — that means multiplying 2 by itself ten times. Watch it grow: 2, 4, 8, 16, 32. After just five doublings you\'ve already passed thirty.', + visual: '2️⃣✖️2️⃣', + }, + { + head: 'Doubling to 1,024', + body: 'Keep going: 64, 128, 256, 512, and finally 2¹⁰ = 1,024. Ten little doublings blew past one thousand! That explosive growth is why folding a paper just 42 times would, in theory, reach the Moon.', + visual: '📄🌕', + }, + { + head: 'The alphabet of math', + body: 'Euler invented much of the notation you\'ll use forever: f(x) for functions, the letter e for growth, and the symbol Σ for sums. He made π famous too. Clear symbols made hard ideas easy to write and share.', + visual: '🔤✨', + }, + { + head: 'Graphs run the internet', + body: 'Euler\'s dots and lines grew into graph theory, the math of networks. GPS apps find your fastest route by searching a graph of roads. Social networks, airline maps, and the internet itself are all Euler-style graphs.', + visual: '🗺️📍🛰️', + }, + { + head: 'Powers in your computer', + body: 'Computers count in powers of 2, which is why a kilobyte is exactly 1,024 bytes. Doubling also describes viral videos and growing colonies of bacteria. Euler\'s exponents are quietly working inside every device you own.', + visual: '💻🔢', + }, + { + head: 'Your turn: 6.EE', + body: 'In this app\'s Expressions unit, you\'re learning to read exponents like 2¹⁰ and to spot patterns in tables and graphs. Every time you evaluate a power or trace a network, give Euler a little nod.', + visual: '📊🧒✨', + }, + ], + }, + { + id: 'Carl Friedrich Gauss', + name: 'Carl Friedrich Gauss', + era: '1777–1855', + emoji: '👑', + tieIn: '6.EE · Clever sums', + slides: [ + { + head: 'A spark in Brunswick', + body: 'Carl Friedrich Gauss was born in 1777 in Brunswick, Germany, to a poor family. At age three, watching his father tally wages, little Carl spotted an arithmetic mistake — and he was right. Word of the wonder boy spread fast.', + visual: '👶🔢', + }, + { + head: 'The busy-work backfire', + body: 'One day the schoolmaster wanted a quiet hour, so he told the class to add every number from 1 to 100. The students began scribbling: 1 + 2 = 3, then + 3 = 6, then + 4 = 10... it would take ages.', + visual: '🏫✏️😮‍💨', + }, + { + head: 'Done in seconds', + body: 'Almost immediately, ten-year-old Gauss walked up and laid his slate on the desk. On it was a single number: 5,050. It was the only correct answer in the whole class. How did he do it so fast?', + visual: '🧒📋✨', + }, + { + head: 'Don\'t grind — find a pattern', + body: 'Gauss\'s secret wasn\'t speed; it was seeing structure. Instead of adding numbers one by one, he asked, "Can I rearrange this to make it easy?" Great mathematicians are lazy in the smartest possible way.', + visual: '🔍🧩', + }, + { + head: 'Make friendly pairs', + body: 'Here\'s the trick. Pair the first number with the last: 1 + 100 = 101. Then the next pair: 2 + 99 = 101. Then 3 + 98 = 101. Every single pair adds up to exactly 101!', + visual: '🤝💯', + }, + { + head: 'Count the pairs', + body: 'The numbers 1 to 100 form exactly 50 pairs, and each pair is worth 101. So the whole sum is 50 × 101 = 5,050. A boring hour of adding became one quick multiplication — the answer young Gauss wrote down.', + visual: '5️⃣0️⃣✖️', + }, + { + head: 'Try it yourself', + body: 'Test the trick on 1 to 10. The pairs are 1 + 10, 2 + 9, 3 + 8, 4 + 7, and 5 + 6 — five pairs of 11. So the sum is 5 × 11 = 55. Add the long way to check; it matches!', + visual: '🔟🤝✅', + }, + { + head: 'A formula for any number', + body: 'The pattern works for any ending number n: the sum equals n × (n + 1) ÷ 2. For 100, that\'s 100 × 101 ÷ 2 = 5,050. One tiny formula replaces a whole mountain of addition.', + visual: '🧮⛰️', + }, + { + head: 'Prince of Mathematicians', + body: 'The Duke of Brunswick heard about the boy and paid for his education. Gauss went on to transform algebra, geometry, statistics, and astronomy. Other mathematicians crowned him the "Prince of Mathematicians."', + visual: '👑🎓', + }, + { + head: 'Finding a lost planet', + body: 'In 1801, astronomers spotted the dwarf planet Ceres, then lost it behind the Sun. Using just a few observations and clever math, Gauss predicted exactly where it would reappear. Telescopes turned — and there it was.', + visual: '🔭🪐', + }, + { + head: 'Gauss all around you', + body: 'Gauss\'s bell curve helps scientists study everything from test scores to heights. His work on magnetism is honored in a unit called the "gauss." And his clever-sum thinking powers shortcuts inside every computer.', + visual: '🧲📊', + }, + { + head: 'Your turn: 6.EE', + body: 'In this app\'s Expressions unit, you rewrite expressions into easier equivalent forms — exactly Gauss\'s move on that school slate. Next time a problem looks long and boring, pause and hunt for the hidden pattern.', + visual: '👑🧒💡', + }, + ], + }, + { + id: 'Srinivasa Ramanujan', + name: 'Srinivasa Ramanujan', + era: '1887–1920', + emoji: '✨', + tieIn: '6.NS · The number system', + slides: [ + { + head: 'A boy in South India', + body: 'Srinivasa Ramanujan was born in 1887 in southern India and grew up in the temple town of Kumbakonam. His family had very little money. From early on, numbers fascinated him more than anything else in the world.', + visual: '🛕🌴', + }, + { + head: 'One book changed everything', + body: 'At fifteen, Ramanujan borrowed a book containing 5,000 math results with almost no explanations. He worked them all out himself, then went far beyond. He filled notebook after notebook with discoveries, recording only his final gems.', + visual: '📖💡✍️', + }, + { + head: 'A letter to England', + body: 'In 1913 he mailed nine pages of formulas to G. H. Hardy, a famous professor at Cambridge. Hardy was stunned — the results "must be true, because no one would have the imagination to invent them." He invited Ramanujan to England.', + visual: '✉️🚢', + }, + { + head: 'Numbers were his friends', + body: 'Ramanujan seemed to know numbers personally, the way you know your friends. He said his ideas often arrived in dreams, like gifts. His big idea: every number, if you look closely enough, has its own personality and secrets.', + visual: '🔢💫', + }, + { + head: 'The taxicab number', + body: 'Hardy once visited Ramanujan and mentioned his taxi\'s "boring" number: 1729. "No!" Ramanujan replied instantly. "It is the smallest number expressible as the sum of two cubes in two different ways." He saw it in a heartbeat.', + visual: '🚕✨', + }, + { + head: 'Check 1729, part one', + body: 'A cube means a number times itself three times. First way: 1³ + 12³. Compute 1 × 1 × 1 = 1, and 12 × 12 × 12 = 1,728. Add them: 1 + 1,728 = 1,729. It works!', + visual: '🧊➕', + }, + { + head: 'Check 1729, part two', + body: 'Second way: 9³ + 10³. Compute 9 × 9 × 9 = 729, and 10 × 10 × 10 = 1,000. Add them: 729 + 1,000 = 1,729 again! Two completely different cube pairs, one special number.', + visual: '9️⃣🔟✅', + }, + { + head: 'Counting partitions', + body: 'Ramanujan loved partitions: the ways to split a number into sums. For 4 there are five: 4, 3+1, 2+2, 2+1+1, and 1+1+1+1. Try 5 yourself — there are seven! He found astonishing patterns hiding in these counts.', + visual: '🍫✂️', + }, + { + head: 'Racing toward π', + body: 'He also discovered infinite series — sums that go on forever — that race toward π faster than anyone dreamed possible. Each extra term of his most famous series adds about eight more correct digits of π.', + visual: '🥧♾️', + }, + { + head: 'The notebooks live on', + body: 'Ramanujan became ill in England and returned home, passing away at just 32. But his notebooks were only the beginning. In 1976, a "lost notebook" of his final discoveries turned up in a library box — genuine buried treasure.', + visual: '📓🔍💎', + }, + { + head: 'Formulas of the future', + body: 'Today, computers use Ramanujan-style series to calculate π to trillions of digits. His "mock theta functions" even help physicists study black holes. A century later, scientists still mine his notebooks and find new mathematics.', + visual: '🌌💻', + }, + { + head: 'Your turn: 6.NS', + body: 'In this app\'s Number System unit, you explore factors, multiples, and how numbers fit together — Ramanujan\'s favorite playground. Keep a math notebook of your own; you never know which scribble becomes a treasure.', + visual: '✨🧒📓', + }, + ], + }, + { + id: 'Emmy Noether', + name: 'Emmy Noether', + era: '1882–1935', + emoji: '⭐', + tieIn: '6.EE · Structure & symmetry', + slides: [ + { + head: 'A girl who loved puzzles', + body: 'Emmy Noether was born in 1882 in Erlangen, Germany, where her father taught mathematics. At the time, girls weren\'t allowed to enroll at the university. Emmy sat in on classes anyway, one of only two women among hundreds of men.', + visual: '🏫👧', + }, + { + head: 'Working for free', + body: 'Noether earned her doctorate and became one of the best algebra experts alive. Yet for years the university refused to pay a woman, so she taught without a salary, sometimes under a man\'s name. She kept doing brilliant math anyway.', + visual: '📝🚫💰', + }, + { + head: 'Hilbert fights for Emmy', + body: 'The great mathematician David Hilbert demanded she be hired at Göttingen, arguing that talent is all that matters. He won. Later, in 1933, Noether moved to America and taught at Bryn Mawr College, beloved by her students.', + visual: '🤝🎓', + }, + { + head: 'What is symmetry?', + body: 'A symmetry is a change that leaves something looking the same. Rotate a square a quarter turn: still the same square. Slide a wallpaper pattern one tile over: identical. Noether saw symmetry as a deep clue about how the universe works.', + visual: '🔷🔄', + }, + { + head: 'Noether\'s theorem', + body: 'Her most famous discovery links symmetry to things that never change. Every symmetry in nature comes with a "conserved" quantity — something the universe keeps constant forever. Physicists call it one of the most beautiful ideas ever found.', + visual: '⚖️✨', + }, + { + head: 'Count a square\'s symmetries', + body: 'Try it: a square can be rotated 90°, 180°, 270°, or 360° and look unchanged — four rotations. It can also be flipped across four different lines. That\'s eight symmetries in total. You just did Noether-style algebra!', + visual: '🔲🔁', + }, + { + head: 'Symmetry in time', + body: 'Here\'s the physics magic. The laws of nature are the same today as tomorrow — a symmetry in time. Noether proved that this alone forces energy to be conserved: it can change form, but the total never disappears.', + visual: '⏰🔋', + }, + { + head: 'Same rules, easier math', + body: 'Symmetry lives in arithmetic too. Since 3 + 5 = 5 + 3, order doesn\'t matter — so compute 2 + 38 + 8 by regrouping: (2 + 8) + 38 = 48. Rules that stay the same let you rearrange problems into easy ones.', + visual: '🔀🧮', + }, + { + head: 'The shape of algebra', + body: 'Noether studied whole systems of numbers at once, called rings, asking what rules they all share. Instead of solving one equation, she revealed the structure behind millions of them. Mathematicians say she taught algebra to think big.', + visual: '💍🔢', + }, + { + head: 'Physics runs on Noether', + body: 'Every particle discovered at giant colliders was predicted using Noether\'s theorem. Einstein himself called her a creative genius. When physicists hunt for new laws of nature, symmetry is the flashlight — and Emmy built it.', + visual: '⚛️🔦', + }, + { + head: 'Hidden in your messages', + body: 'Her abstract algebra grew into the codes that protect passwords and repair scratched game discs. Error-correcting codes rebuild missing data using ring structure. Every text you send is quietly guarded by Noether\'s kind of math.', + visual: '🔐💬', + }, + { + head: 'Your turn: 6.EE', + body: 'In this app\'s Expressions unit, properties like the commutative and distributive laws are your first taste of mathematical structure. Every time you regroup numbers to make a problem easier, you\'re thinking like Emmy Noether.', + visual: '⭐🧒🔷', + }, + ], + }, + { + id: 'David Hilbert', + name: 'David Hilbert', + era: '1862–1943', + emoji: '🧩', + tieIn: 'Problem solving', + slides: [ + { + head: 'The boy from Königsberg', + body: 'David Hilbert was born in 1862 in Königsberg — the very city of Euler\'s seven bridges! In school he was slow at memorizing but unbeatable at understanding. "I hardly ever memorized," he said. "I always worked things out."', + visual: '🌉🏙️', + }, + { + head: 'The math capital', + body: 'Hilbert became a professor at Göttingen, then the math capital of the world. He thought while gardening and bicycling, and scribbled ideas on a huge blackboard in his backyard. Students crossed oceans just to hear him teach.', + visual: '🚲🌼🧠', + }, + { + head: 'The 23 problems', + body: 'In 1900, in Paris, Hilbert gave the most famous math talk ever. He listed 23 unsolved problems as homework for the entire twentieth century. Solving even one could make a mathematician famous — and everyone raced to try.', + visual: '🗼📜', + }, + { + head: 'We must know!', + body: 'Hilbert believed no question is forever unanswerable. His motto: "Wir müssen wissen — wir werden wissen," meaning "We must know — we will know." It is carved on his memorial stone, a battle cry for every curious kid.', + visual: '📣❓', + }, + { + head: 'The Infinite Hotel', + body: 'Hilbert\'s most famous thought experiment is a hotel with infinitely many rooms, numbered 1, 2, 3, and on forever. One night every single room is full. Then a new guest walks in. Is the hotel really out of space?', + visual: '🏨♾️', + }, + { + head: 'Room for one more', + body: 'The clever manager announces: everyone move up one room! Room 1 goes to 2, room 2 goes to 3, and room n goes to n + 1. Nobody falls off the end, because there is no end. Room 1 is now free!', + visual: '🚪➡️1️⃣', + }, + { + head: 'Room for infinitely more', + body: 'Then a bus with infinitely many passengers arrives. Still no problem: everyone moves to double their room number, so room 3 goes to room 6. Now all the odd rooms — 1, 3, 5, 7, and so on — are empty. Infinitely many free rooms!', + visual: '🚌♾️🔑', + }, + { + head: 'Hilbert\'s problem-solving moves', + body: 'Hilbert attacked hard problems with simple moves: try small cases first, hunt for a pattern, and simplify before you generalize. The art of mathematics, he said, is finding the special case that contains everything.', + visual: '🪜🔍', + }, + { + head: 'Try it: the handshake puzzle', + body: 'Five people all shake hands once — how many handshakes? Go small: 2 people make 1, 3 people make 3, 4 people make 6. The jumps are +2, then +3, so next comes +4, giving 10. Small cases cracked it!', + visual: '🤝🖐️', + }, + { + head: 'A century of chasing', + body: 'Mathematicians spent the 1900s chasing Hilbert\'s list. Some problems fell quickly, others took decades, and a few are still open today. The solvers became legends — proof that a great question is a gift to the world.', + visual: '🏆⏳', + }, + { + head: 'From logic to laptops', + body: 'Hilbert asked whether a machine could, in principle, answer every math question. Alan Turing tackled that puzzle — and invented the blueprint for the computer while doing it. "Hilbert spaces" also power today\'s quantum computers.', + visual: '💻⚛️', + }, + { + head: 'Your turn: Problem solving', + body: 'This app\'s problem-solving challenges train Hilbert\'s moves: start small, hunt patterns, and never give up on a good question. Remember his promise — we must know, we will know. That includes you.', + visual: '🧩🧒🔥', + }, + ], + }, + { + id: 'Georg Cantor', + name: 'Georg Cantor', + era: '1845–1918', + emoji: '♾️', + tieIn: '6.NS · Number sets & infinity', + slides: [ + { + head: 'A musical mathematician', + body: 'Georg Cantor was born in 1845 in St. Petersburg, Russia, and grew up in Germany. He was a talented violinist from a family full of musicians. He chose mathematics — but his math turned out as bold as any symphony.', + visual: '🎻🎼', + }, + { + head: 'The forbidden question', + body: 'As a professor in Halle, Germany, Cantor dared to ask a question most mathematicians avoided: how big is infinity? Can one infinity be bigger than another? People said infinity was only for philosophers. Cantor decided to measure it.', + visual: '♾️❓', + }, + { + head: 'Think in sets', + body: 'Cantor\'s tool was the set — simply a collection of things: the set of your socks, the set of even numbers. His genius idea: to compare two sets\' sizes, you don\'t need to count them. You just need to match them up.', + visual: '🧦🔢', + }, + { + head: 'The cupcake test', + body: 'Imagine cupcakes and kids at a party. Give each kid exactly one cupcake. If nothing is left over and no one is left out, the sets are the same size — even if you never counted either one. Matching beats counting!', + visual: '🧁🧒', + }, + { + head: 'Evens vs. all numbers', + body: 'Now the shocker. Match every counting number with its double: 1 pairs with 2, 2 pairs with 4, 3 pairs with 6, and n pairs with 2n. Every number gets exactly one partner, and none are missed.', + visual: '2️⃣4️⃣6️⃣', + }, + { + head: 'A part as big as the whole', + body: 'That perfect matching means the even numbers are exactly as numerous as ALL the counting numbers — even though evens seem like only half of them! With infinite sets, a part can equal the whole. Cantor proved it cleanly.', + visual: '🤯♾️', + }, + { + head: 'Even fractions line up', + body: 'Cantor arranged all the fractions in a giant grid and walked through it in a zigzag, giving each fraction a place in line: first, second, third... So even the fractions match the counting numbers. Same size of infinity again!', + visual: '🐍🔢', + }, + { + head: 'A bigger infinity!', + body: 'Then Cantor found the limit. The decimal numbers cannot all be listed: given any list, he could build a new decimal that differs from every entry, digit by digit. Decimals form a genuinely BIGGER infinity. Infinity comes in sizes!', + visual: '📏♾️♾️', + }, + { + head: 'Climbing the alephs', + body: 'Cantor named the sizes of infinity with the Hebrew letter aleph: first ℵ₀, then bigger and bigger, an endless tower of infinities. Mathematics suddenly had a whole new universe upstairs to explore.', + visual: '🪜🌌', + }, + { + head: 'Believing anyway', + body: 'Cantor\'s ideas were so strange that some famous mathematicians rejected them, which hurt him deeply. But he kept going, and the next generation embraced set theory. Hilbert declared, "No one shall expel us from the paradise Cantor created."', + visual: '🌈🏝️', + }, + { + head: 'Sets under everything', + body: 'Today set theory is the foundation stone of mathematics — nearly everything is defined using sets. Databases filter with unions and intersections, and search engines think in sets. Cantor\'s "strange" idea became everyone\'s toolbox.', + visual: '🗄️🔍', + }, + { + head: 'Knowing the limits', + body: 'Cantor\'s different infinities help computer scientists prove that some problems can never be solved by any program, no matter how clever. Knowing what is impossible saves us from impossible quests — deep wisdom from comparing infinities.', + visual: '💻🚧', + }, + { + head: 'Your turn: 6.NS', + body: 'In this app\'s Number System unit, you meet nested sets of numbers: whole numbers inside integers inside rationals. Every time you sort numbers into these families, you\'re doing Cantor\'s set theory — no infinite hotel required.', + visual: '♾️🧒🔢', + }, + ], + }, +]; diff --git a/src/routes/Mathematicians.tsx b/src/routes/Mathematicians.tsx index 35dc04f..1429978 100644 --- a/src/routes/Mathematicians.tsx +++ b/src/routes/Mathematicians.tsx @@ -1,11 +1,14 @@ +import { useState } from 'react'; import { Link } from 'react-router-dom'; +import { MATHEMATICIAN_DECKS, type MathematicianDeck } from '../data/mathematicianDecks'; +import { MathematicianDeckPlayer } from '../components/MathematicianDeck'; interface Mathematician { name: string; era: string; contribution: string; emoji: string; - /** videoSrc of a matching Math Story, if one exists. Makes the card a link. */ + /** videoSrc of a matching Math Story, if one exists. Adds a story link. */ storySrc?: string; } @@ -62,30 +65,12 @@ const MATHEMATICIANS: Mathematician[] = [ }, ]; -/** Inner card content, shared by the link and static variants. */ -function CardBody({ m }: { m: Mathematician }) { - return ( -
-
{m.emoji}
-
-
- {m.name} -
-
- {m.era} -
-
{m.contribution}
- {m.storySrc && ( -
- 🌟 Watch the story → -
- )} -
-
- ); -} +const deckFor = (name: string): MathematicianDeck | undefined => + MATHEMATICIAN_DECKS.find((d) => d.id === name); export function Mathematicians() { + const [open, setOpen] = useState(null); + return (
@@ -101,31 +86,53 @@ export function Mathematicians() {

Learn about the brilliant minds who shaped mathematics throughout - history. From ancient geometry to modern breakthroughs. Cards with a{' '} - 🌟 Watch the story badge open an animated lesson. + history — tap 📖 Their story for a slide-by-slide tale of what + they did, why it matters, and how it connects to what you're learning.

- {MATHEMATICIANS.map((m) => - m.storySrc ? ( - - - - ) : ( + {MATHEMATICIANS.map((m) => { + const deck = deckFor(m.name); + return (
- +
+
{m.emoji}
+
+
{m.name}
+
+ {m.era} +
+
{m.contribution}
+
+ {deck && ( + + )} + {m.storySrc && ( + + 🌟 Animated story + + )} +
+
+
- ), - )} + ); + })}
← Back home + + {open && setOpen(null)} />}
); } diff --git a/src/routes/Settings.tsx b/src/routes/Settings.tsx index 1681aec..bb37c78 100644 --- a/src/routes/Settings.tsx +++ b/src/routes/Settings.tsx @@ -302,7 +302,7 @@ function AdminPanel() { />
- In-game math challenges + Play time
setArcadeConfig({ challengeInterval: n })} - /> -
- setArcadeConfig({ challengeCount: n })} - /> -
- setArcadeConfig({ challengeLevel: n })} + value={config.gameMaxSeconds ?? 180} + onPick={(n) => setArcadeConfig({ gameMaxSeconds: n })} />
setArcadeConfig({ storyInterval: n })} + value={config.extendMinutes ?? 3} + onPick={(n) => setArcadeConfig({ extendMinutes: n })} />
+ setArcadeConfig({ extendCoinCost: n })} + /> +

+ At the cap, kids spend coins (earned from lessons) or do a lesson to add more time. +

+
+ +
+
+ Adaptive difficulty +
+

+ Games are never interrupted mid-play — math happens between games, at big in-game + milestones, and on each game’s end screen. +

Adaptive level & mastery
)} -
+ {/* Mario-style game grid — 3 across on phones so you can see more games. + One big icon that matches the game, chunky black borders, no subtitle. */} +
{visibleGames.map((g) => { const done = playedToday.includes(g.id); const price = PREMIUM_GAMES[g.id]; const locked = price != null && !unlockedGames.includes(g.id); - // A full lesson gates each game (handled by ArcadeGate on the route), - // so every unlocked tile stays clickable here. Locked premium games - // route to the Shop to unlock with coins instead. - if (locked) { - return ( - -
-
🔒
-
Unlock · 🪙{price}
-
-
{g.emoji}
-
{g.name}
-
{g.blurb}
- - ); - } + const tile = + `relative flex flex-col items-center justify-start text-center rounded-2xl border-4 border-slate-900 ` + + `bg-gradient-to-br ${g.gradient} text-white px-1.5 pt-3 pb-2 ` + + `shadow-[0_5px_0_0_rgba(15,23,42,0.9)] transition-transform active:translate-y-1 active:shadow-[0_2px_0_0_rgba(15,23,42,0.9)]`; + // A full lesson gates each game (handled by ArcadeGate on the route); + // locked premium games route to the Shop to unlock with coins instead. return ( - - {done && ( - - ✓ Played today - + + {done && !locked && ( + )} - - 📚 Lesson first + + {g.emoji} -
- - - - {g.emoji} -
-
{g.name}
-
{g.blurb}
+ + {g.name} + + {locked && ( +
+
🔒
+
🪙{price}
+
+ )} ); })} diff --git a/src/routes/arcade/ArcadeWarmup.tsx b/src/routes/arcade/ArcadeWarmup.tsx index 9168f33..afb71db 100644 --- a/src/routes/arcade/ArcadeWarmup.tsx +++ b/src/routes/arcade/ArcadeWarmup.tsx @@ -7,16 +7,14 @@ import { AnswerInput } from '../../components/AnswerInput'; import { Explanation } from '../../components/Explanation'; import { LessonCard } from '../../components/LessonCard'; import { LESSONS, type Lesson } from '../../data/lessons'; -import { useProgress, type ArcadeConfig } from '../../state/progress'; +import { useProgress, type ArcadeConfig, LESSON_COINS } from '../../state/progress'; import { useLessonClock } from '../../hooks/useLessonClock'; import { Link } from 'react-router-dom'; import { ArcadeHeader, ArcadeSessionContext, ARCADE_GAMES, PREMIUM_GAMES } from './shared'; -import { MidGameChallenge } from './MidGameChallenge'; import { HeroSplash, Countdown } from './HeroSplash'; import { HowToPlay } from './HowToPlay'; import { getHowTo } from './howto'; import { gameMascot } from './Mascots'; -import { MathBreak } from './MathBreak'; import { sfx, haptic, HAPTIC } from '../../utils/arcadeAV'; // The arcade "learn-to-play" gate. A full lesson + a hard difficulty-3 check @@ -24,7 +22,8 @@ import { sfx, haptic, HAPTIC } from '../../utils/arcadeAV'; // game session; the admin can require more than one via `lessonsPerSession`. // Lessons are always hard, never easy. Lesson time is tracked toward the // cumulative lesson:game balance, and (via `earnRatio`) earns game time. -// While unlocked, a mid-game math challenge can interrupt play at an interval. +// Play is NEVER interrupted mid-game: math happens between games (this gate), +// at big in-game milestones, and on each game's end card. function pick(a: T[]): T { return a[Math.floor(Math.random() * a.length)]; @@ -50,16 +49,19 @@ export function ArcadeGate({ title, children }: { title: string; children: React const cumArcade = useProgress((s) => s.cumArcadeSeconds); const cumLesson = useProgress((s) => s.cumLessonSeconds); const unlockedGames = useProgress((s) => s.unlockedGames); + const coins = useProgress((s) => s.coins); + const spendCoins = useProgress((s) => s.spendCoins); + const addCoins = useProgress((s) => s.addCoins); const [unlocked, setUnlocked] = useState(false); const [sessionKey, setSessionKey] = useState(0); const [lessonsDone, setLessonsDone] = useState(0); - const [challengeActive, setChallengeActive] = useState(false); - const [storyActive, setStoryActive] = useState(false); const [showSplash, setShowSplash] = useState(config.unlimited); const [showDirections, setShowDirections] = useState(config.unlimited); const [counting, setCounting] = useState(config.unlimited); - const playSecRef = useRef(0); - const storySecRef = useRef(0); + // Per-game time cap (default 3 min) + extend flow. + const sessionRef = useRef(0); + const [timeUp, setTimeUp] = useState(false); + const [extending, setExtending] = useState(false); // Count lesson time toward the balance only while the gate is showing. useLessonClock(unlocked); @@ -67,51 +69,38 @@ export function ArcadeGate({ title, children }: { title: string; children: React const need = Math.max(1, config.lessonsPerSession); const game = ARCADE_GAMES.find((g) => g.name === title); - // Time budget: you can't play more game time than your lessons have earned. - const overBudget = config.earnRatio > 0 && cumArcade >= cumLesson * config.earnRatio; + const cap = config.gameMaxSeconds ?? 180; + const extendMin = config.extendMinutes ?? 3; + const extendCost = config.extendCoinCost ?? 10; + const capOn = !config.unlimited && cap > 0; + + // Time budget (legacy): only enforced when the simpler per-game cap is OFF. + const overBudget = !capOn && config.earnRatio > 0 && cumArcade >= cumLesson * config.earnRatio; useEffect(() => { if (unlocked && !config.unlimited && overBudget) { setUnlocked(false); setLessonsDone(0); - setChallengeActive(false); } }, [unlocked, overBudget, config.unlimited]); - // Mid-game challenge timer — counts active play seconds while a game is up. + // Per-game session cap: count active play seconds; freeze at the cap. useEffect(() => { - if (!unlocked || challengeActive || config.challengeInterval <= 0) return; + if (!unlocked || !capOn || timeUp || extending) return; const id = window.setInterval(() => { - if (document.hidden || storyActive || counting) return; - playSecRef.current += 1; - if (playSecRef.current >= config.challengeInterval) { - playSecRef.current = 0; - setChallengeActive(true); - } + if (document.hidden || showSplash || showDirections || counting) return; + sessionRef.current += 1; + if (sessionRef.current >= cap) setTimeUp(true); }, 1000); return () => window.clearInterval(id); - }, [unlocked, challengeActive, storyActive, counting, config.challengeInterval]); + }, [unlocked, capOn, timeUp, extending, cap, showSplash, showDirections, counting]); - // Math-break timer — a forced math story / mathematician every N minutes. - useEffect(() => { - if (!unlocked || storyActive || config.storyInterval <= 0) return; - const id = window.setInterval(() => { - if (document.hidden || challengeActive || counting) return; - storySecRef.current += 1; - if (storySecRef.current >= config.storyInterval * 60) { - storySecRef.current = 0; - setStoryActive(true); - } - }, 1000); - return () => window.clearInterval(id); - }, [unlocked, storyActive, challengeActive, counting, config.storyInterval]); + const resetSession = () => { sessionRef.current = 0; setTimeUp(false); setExtending(false); }; + const buyTime = () => { if (spendCoins(extendCost)) resetSession(); }; const enterPlay = () => { setLessonsDone(0); setSessionKey((k) => k + 1); - playSecRef.current = 0; - storySecRef.current = 0; - setChallengeActive(false); - setStoryActive(false); + resetSession(); setShowSplash(true); setShowDirections(true); setCounting(true); @@ -125,12 +114,9 @@ export function ArcadeGate({ title, children }: { title: string; children: React }; const requestReplay = () => { + resetSession(); if (config.unlimited) { setSessionKey((k) => k + 1); // unlimited: just restart, no lesson - playSecRef.current = 0; - storySecRef.current = 0; - setChallengeActive(false); - setStoryActive(false); setShowSplash(true); setShowDirections(true); setCounting(true); @@ -138,7 +124,6 @@ export function ArcadeGate({ title, children }: { title: string; children: React } setUnlocked(false); setLessonsDone(0); - setChallengeActive(false); }; // Entry sequence overlays, in order. They only show when we have a game def; @@ -148,25 +133,30 @@ export function ArcadeGate({ title, children }: { title: string; children: React const countdownVisible = !splashVisible && !directionsVisible && counting; const playArea = ( - +
{children}
- {storyActive && ( - { - setStoryActive(false); - storySecRef.current = 0; - }} + {/* per-game time cap: freeze and offer a lesson / coins to extend */} + {timeUp && !extending && ( + setExtending(true)} /> )} - {challengeActive && config.challengeInterval > 0 && ( - { - setChallengeActive(false); - playSecRef.current = 0; - }} - /> + {extending && ( +
+ { addCoins(LESSON_COINS); resetSession(); }} + /> +
)} {splashVisible && game ? ( void; + onLesson: () => void; +}) { + const canAfford = coins >= cost; + return ( +
+
+
+
Time's up!
+

+ Great playing! Earn more time with math. +

+
+ 🪙 {coins} coins +
+ + + {!canAfford && ( +

+ Not enough coins — do a lesson to earn {LESSON_COINS}! +

+ )} + + + + + ← Back to the arcade + +
+
+ ); +} + function LessonGate({ title, emoji, diff --git a/src/routes/arcade/ChessPuzzle.tsx b/src/routes/arcade/ChessPuzzle.tsx index 7195e3b..b417575 100644 --- a/src/routes/arcade/ChessPuzzle.tsx +++ b/src/routes/arcade/ChessPuzzle.tsx @@ -1,15 +1,15 @@ -import { useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { motion } from 'framer-motion'; import { useProgress, type ArcadePlayOutcome } from '../../state/progress'; import { ArcadeHeader, ArcadeEndCard } from './shared'; import { useArcadeClock } from '../../hooks/useArcadeClock'; import { sfx, haptic, HAPTIC } from '../../utils/arcadeAV'; -// Checkmate Lab — curated "compelled win" endgames you PLAY OUT step by step. -// You choose each of your moves; the opponent's forced reply is auto-played, and -// the line runs to checkmate (or winning the queen). No chess engine: every line -// is hand-authored and verified, so the teaching is exact. A wrong move shows the -// refutation and restarts the line. +// Checkmate Lab — sharp "only-move" positions you PLAY OUT to the finish. Each turn +// you CHOOSE your move from a few candidates. The right move wins (often mates!); +// a WRONG move is punished — the computer plays on and CHECKMATES YOU, move by move, +// right on the board, then you can try again. No chess engine: every line is +// hand-authored and machine-verified with chess.js so the mates are exact. type Piece = { color: 'w' | 'b'; type: 'k' | 'q' | 'r' | 'b' | 'n' | 'p' }; type Board = (Piece | null)[][]; @@ -18,85 +18,118 @@ type Board = (Piece | null)[][]; // white pieces stay readable on light squares too. const SOLID: Record = { k: '♚', q: '♛', r: '♜', b: '♝', n: '♞', p: '♟' }; -interface Ply { +interface BustMove { from: string; to: string; says: string; you?: boolean } // you = auto-played forced White reply; else = computer (Black) +interface MoveOption { from: string; to: string; - hint: string; // what the player should do this step - reply?: { from: string; to: string; says: string }; // opponent's forced answer + label: string; // short move name, e.g. 'Nxh3' + desc: string; // the idea, shown on the button + because: string; // caption after choosing (why it works / why it loses) + correct?: boolean; + reply?: { from: string; to: string; says: string }; // opponent's forced answer on a correct, multi-move line + bust?: BustMove[]; // wrong move → the computer's forced mate, played to checkmate } +interface Ply { hint: string; options: MoveOption[] } interface Puzzle { concept: string; title: string; lesson: string; material: string; fen: string; // piece placement only (rank 8 → rank 1) - line: Ply[]; // your moves, in order; last one ends it - win: string; // shown when the whole line is completed - refute: string; // shown on any wrong move + plies: Ply[]; // usually one — your move + win: string; // shown when the whole line is solved } const PUZZLES: Puzzle[] = [ { - concept: 'ZUGZWANG', - title: 'The Compelled Win', - lesson: 'You are up a whole queen — but only ONE move wins. A careless move lets the lone king wriggle free (even stalemate!). More material means nothing if your move doesn’t land.', - material: 'You: King + Queen (+2 pawns) · Foe: lone King', - fen: '7k/8/6K1/8/8/8/2PP4/1Q6', - line: [ - { from: 'b1', to: 'b8', hint: 'Pin the king to the back rank with the queen — your own king already guards g7 and h7.' }, + concept: 'DEFENCE', + title: 'Snatch the Attacker', + lesson: 'Black’s queen is one move from ...Qxh2#. You have exactly ONE move that saves you — and it wins the queen! Pick wrong and the computer mates you.', + material: 'You: King + Knight (+3 pawns) · Foe: King + Queen + 2 Bishops', + fen: '6k1/2b2ppp/b7/6N1/8/7q/5PPP/6K1', + plies: [ + { + hint: 'Black threatens ...Qxh2# (the bishop on a6 covers the f1 escape). Remove the mating queen.', + options: [ + { from: 'g5', to: 'h3', label: 'Nxh3', desc: 'Knight grabs the queen', correct: true, because: 'The knight snaps off the mating queen — the attack is over and you’re up a queen.' }, + { from: 'g5', to: 'e4', label: 'Ne4', desc: 'Centralise the knight', because: 'Too slow — you ignored the threat.', bust: [{ from: 'h3', to: 'h2', says: 'Qxh2#! The bishop on a6 covers f1 — the king has nowhere to run.' }] }, + { from: 'g1', to: 'h1', label: 'Kh1', desc: 'Hide in the corner', because: 'The corner is no safer.', bust: [{ from: 'h3', to: 'h2', says: 'Qxh2#! Checkmate in the corner.' }] }, + ], + }, ], - win: 'Qb8#! The queen seals the 8th rank while your king covers the escape squares. Checkmate.', - refute: 'Any other move and the cornered king slips to g8/h7 — or you stalemate it and throw the win.', + win: 'Nxh3! You grab the mating queen and the whole attack collapses.', }, { - concept: 'BACK RANK', - title: 'The Trapped King', - lesson: 'The enemy king is boxed in by its own pawns — outnumbered on the back rank. One rook is all it takes.', - material: 'You: King + Rook (+3 pawns) · Foe: King + 3 pawns', - fen: '6k1/5ppp/8/8/8/8/5PPP/R5K1', - line: [ - { from: 'a1', to: 'a8', hint: 'The king’s own f7/g7/h7 pawns wall it in — swing the rook to the 8th rank.' }, + concept: 'RACE', + title: 'Mate in One — First!', + lesson: 'Both kings are in danger — it’s a race. You have a mate in one, and so does Black. Whoever strikes first wins. Find YOUR mate!', + material: 'You: King + Queen (+3 pawns) · Foe: King + Queen + Knight + Bishop', + fen: '6k1/5ppp/b7/8/6nq/8/4QPPP/6K1', + plies: [ + { + hint: 'You have a checkmate right now. Deliver it before Black plays ...Qxh2#.', + options: [ + { from: 'e2', to: 'e8', label: 'Qe8#', desc: 'Check on the back rank', correct: true, because: 'Checkmate! Black’s king is walled in by its own f7/g7/h7 pawns.' }, + { from: 'g1', to: 'h1', label: 'Kh1', desc: 'Dodge to the corner', because: 'You blinked — now Black strikes.', bust: [{ from: 'h4', to: 'h2', says: 'Qxh2#! Supported by the knight on g4, with the bishop covering f1.' }] }, + { from: 'e2', to: 'e3', label: 'Qe3', desc: 'Guard the third rank', because: 'Too slow — you had mate and missed it.', bust: [{ from: 'h4', to: 'h2', says: 'Qxh2#! Black got there first.' }] }, + ], + }, ], - win: 'Ra8#! The king is mated on the back rank by its own pawns.', - refute: 'Waste a tempo and the king makes luft with ...g6/...h6 and escapes. The computer consolidates.', + win: 'Qe8#! You struck first — the back-rank mate lands before Black’s.', }, { - concept: 'QUEEN SACRIFICE', - title: 'Game of the Century', - lesson: 'Sometimes you GIVE UP your queen to force mate. In 1956 a 13-year-old Bobby Fischer stunned Donald Byrne with a queen offer. Here a queen sac forces a smothered mate.', - material: 'You: King + Queen + Knight · Foe: King + Rook + 2 pawns', - fen: '5r1k/6pp/7N/8/8/1Q6/8/6K1', - line: [ - { from: 'b3', to: 'g8', hint: 'Offer the queen with check on g8. The king can’t take (your knight guards g8) — so the rook must.', reply: { from: 'f8', to: 'g8', says: '…Rxg8 — forced. The rook is dragged onto g8, smothering its own king.' } }, - { from: 'h6', to: 'f7', hint: 'Now spring the smothered mate — leap the knight in.' }, + concept: 'ARABIAN MATE', + title: 'Break the Arabian Net', + lesson: 'A rook and knight weave the deadly “Arabian mate” in the corner: Black threatens ...Rxh2#, with the knight on f3 guarding h2 and g1. One capture breaks the net.', + material: 'You: King + Queen (+3 pawns) · Foe: King + Rook + Knight', + fen: '6kr/p4pp1/8/8/8/5n2/P5PP/Q6K', + plies: [ + { + hint: 'Black threatens ...Rxh2# (the knight on f3 supports h2 and covers g1). Take the knight that glues the mate together.', + options: [ + { from: 'g2', to: 'f3', label: 'gxf3', desc: 'Pawn takes the knight', correct: true, because: 'The knight was the glue — now ...Rxh2+ is simply Kxh2. You’re winning.' }, + { from: 'a2', to: 'a3', label: 'a3', desc: 'Push a queenside pawn', because: 'You ignored the mate.', bust: [{ from: 'h8', to: 'h2', says: 'Rxh2#! The Arabian mate — the rook mates, the knight covers g1.' }] }, + { from: 'a1', to: 'b1', label: 'Qb1', desc: 'Reposition the queen', because: 'Wrong side of the board.', bust: [{ from: 'h8', to: 'h2', says: 'Rxh2#! Your queen was a mile from your king.' }] }, + ], + }, ], - win: 'Nf7#! Buried by its own rook and pawns — the immortal smothered mate.', - refute: 'Without the queen sacrifice the king escapes to g8 and your attack fizzles; the extra rook takes over.', + win: 'gxf3! You capture the knight and the Arabian net falls apart.', }, { - concept: '3 MINORS vs QUEEN', - title: 'Death by a Thousand Cuts', - lesson: 'Three minor pieces can out-coordinate a lone queen. A knight forks the king and queen at once — the queen is worth more, but it can’t be everywhere.', - material: 'You: King + Knight + 2 Bishops · Foe: King + Queen + 3 pawns', - fen: '2q3k1/5ppp/8/3N4/8/8/1B6/5BK1', - line: [ - { from: 'd5', to: 'e7', hint: 'Find the royal fork — check the king AND hit the queen with one knight move.', reply: { from: 'g8', to: 'f8', says: '…the king must step out of check, abandoning the queen.' } }, - { from: 'e7', to: 'c8', hint: 'Collect Her Majesty!' }, + concept: 'SMOTHERED MATE', + title: 'Stop the Smother', + lesson: 'Your own rook and pawns box your king in — a knight on f2 would be a SMOTHERED mate! Black’s knight is one hop away. Capture it before it lands.', + material: 'You: King + Queen + Rook (+3 pawns) · Foe: King + Rook + Knight', + fen: '2r3k1/p4ppp/8/8/4n3/1Q1P4/P5PP/6RK', + plies: [ + { + hint: 'Black threatens ...Nf2# (your king is smothered by Rg1 and the g2/h2 pawns). Take the knight!', + options: [ + { from: 'd3', to: 'e4', label: 'dxe4', desc: 'Pawn takes the knight', correct: true, because: 'The smothering knight is gone — your king can breathe and you’re up material.' }, + { from: 'a2', to: 'a3', label: 'a3', desc: 'Push a pawn', because: 'A quiet move loses on the spot.', bust: [{ from: 'e4', to: 'f2', says: 'Nf2#! The classic smothered mate — your own pieces trap your king.' }] }, + { from: 'b3', to: 'b7', label: 'Qb7', desc: 'Swing the queen out', because: 'Wandering off — and mate is instant.', bust: [{ from: 'e4', to: 'f2', says: 'Nf2#! Smothered while your queen went sightseeing.' }] }, + ], + }, ], - win: 'Nxc8! Three little pieces just won the queen — the one fork she couldn’t escape.', - refute: 'Any quiet move and the queen swings in with check; one piece can’t hold against Her Majesty.', + win: 'dxe4! You remove the smothering knight before it can spring the trap.', }, { - concept: 'SUPPORTED MATE', - title: 'Queen & Bishop Duet', - lesson: 'A queen alone can’t mate — but with one friend covering the escape squares, it’s lights out. Find the partner.', - material: 'You: King + Queen + Bishop · Foe: King + 2 pawns', - fen: '6k1/5p1p/8/8/8/8/1B6/3Q2K1', - line: [ - { from: 'd1', to: 'd8', hint: 'Your bishop on b2 already covers g7 and h8 — bring the queen to the back rank with check.' }, + concept: 'LONG DIAGONAL', + title: 'Guard the Long Diagonal', + lesson: 'Black’s queen on b7 and knight on f4 both aim at g2 — ...Qxg2# is threatened. Take the knight that supports the mating square.', + material: 'You: King + Rook + Knight (+3 pawns) · Foe: King + Queen + Rook', + fen: '2r3k1/pq3ppp/8/8/5n2/7N/P4PPP/R5K1', + plies: [ + { + hint: 'Black threatens ...Qxg2# (the knight on f4 supports g2). Capture the supporting knight.', + options: [ + { from: 'h3', to: 'f4', label: 'Nxf4', desc: 'Knight takes knight', correct: true, because: 'Without its support, ...Qxg2+ is just Kxg2. The threat is gone.' }, + { from: 'h3', to: 'g5', label: 'Ng5', desc: 'Leap toward the king', because: 'You left f4 alone — mate follows.', bust: [{ from: 'b7', to: 'g2', says: 'Qxg2#! Supported by the knight on f4 — the king can’t escape.' }] }, + { from: 'a2', to: 'a3', label: 'a3', desc: 'Push a pawn', because: 'Doing nothing loses instantly.', bust: [{ from: 'b7', to: 'g2', says: 'Qxg2#! The long diagonal was left wide open.' }] }, + ], + }, ], - win: 'Qd8#! The bishop guards g7/h8, the queen takes f8 and checks — no square left.', - refute: 'Without the bishop’s help the king strolls to g7/h8. Burn a move and the computer defends.', + win: 'Nxf4! You eliminate the knight guarding g2 and the mate threat vanishes.', }, ]; @@ -128,72 +161,94 @@ export function ChessPuzzle() { const [idx, setIdx] = useState(0); const puzzle = PUZZLES[idx]; const [board, setBoard] = useState(() => parseFEN(puzzle.fen)); - const [sel, setSel] = useState(null); const [step, setStep] = useState(0); - const [status, setStatus] = useState<'play' | 'reply' | 'solved' | 'wrong'>('play'); - const [replyNote, setReplyNote] = useState(''); + const [status, setStatus] = useState<'play' | 'solved' | 'busted'>('play'); + const [picked, setPicked] = useState(null); // chosen option index + const [bustNote, setBustNote] = useState(''); // live caption during the mate playback + const [bustDone, setBustDone] = useState(false); // true once the mate has landed + const [lastMove, setLastMove] = useState<{ from: string; to: string } | null>(null); const [showHint, setShowHint] = useState(false); const [solvedCount, setSolvedCount] = useState(0); const [outcome, setOutcome] = useState(null); useArcadeClock(!!outcome); const buzz = (p: number | number[]) => { if (hapticsOn) haptic(p); }; - const ply = puzzle.line[step]; + // cancelable timers (fixes the old no-cleanup setTimeout during playback) + const timers = useRef([]); + const clearTimers = () => { timers.current.forEach((t) => clearTimeout(t)); timers.current = []; }; + const later = (fn: () => void, ms: number) => { const id = window.setTimeout(fn, ms); timers.current.push(id); return id; }; + useEffect(() => clearTimers, []); + + const ply = puzzle.plies[step]; const loadPuzzle = (i: number) => { + clearTimers(); setBoard(parseFEN(PUZZLES[i].fen)); - setSel(null); setStep(0); setStatus('play'); - setReplyNote(''); + setPicked(null); + setBustNote(''); + setBustDone(false); + setLastMove(null); setShowHint(false); }; - const tryMove = (from: string, to: string) => { - if (status !== 'play') return; - const cur = puzzle.line[step]; - if (from === cur.from && to === cur.to) { - setBoard((b) => applyMove(b, from, to)); - setSel(null); - setShowHint(false); + const choose = (optIdx: number) => { + if (status !== 'play' || picked !== null) return; + const opt = ply.options[optIdx]; + setPicked(optIdx); + setShowHint(false); + const afterMove = applyMove(board, opt.from, opt.to); + setBoard(afterMove); + setLastMove({ from: opt.from, to: opt.to }); + + if (opt.correct) { sfx.step(); buzz(HAPTIC.tap); - const isLast = step === puzzle.line.length - 1; + const isLast = step === puzzle.plies.length - 1; if (isLast) { setStatus('solved'); setSolvedCount((n) => n + 1); - sfx.win(); buzz(HAPTIC.win); - } else if (cur.reply) { - setStatus('reply'); - setReplyNote(cur.reply.says); - const reply = cur.reply; - const nextStep = step + 1; - window.setTimeout(() => { + later(() => { sfx.win(); buzz(HAPTIC.win); }, 260); + } else if (opt.reply) { + // (reserved for future multi-move lines) auto-play the forced reply + const reply = opt.reply; + setBustNote(reply.says); + later(() => { setBoard((b) => applyMove(b, reply.from, reply.to)); - setStep(nextStep); - setStatus('play'); + setLastMove({ from: reply.from, to: reply.to }); + setStep((s) => s + 1); + setPicked(null); sfx.pickup(); }, 950); } - } else { - setStatus('wrong'); - setSel(null); - setShowHint(false); - sfx.lose(); buzz(HAPTIC.death); + return; } - }; - const onSquare = (r: number, c: number) => { - if (status !== 'play') return; - const sq = rcSq(r, c); - const piece = board[r][c]; - if (sel) { - if (sq === sel) { setSel(null); return; } - if (piece && piece.color === 'w') { setSel(sq); return; } - tryMove(sel, sq); - } else if (piece && piece.color === 'w') { - setSel(sq); - sfx.pickup(); - } + // WRONG: the computer plays on and mates you, move by move, to the end. + setStatus('busted'); + setBustNote(opt.because); + sfx.lose(); buzz(HAPTIC.heavy); + const bust = opt.bust ?? []; + let work = afterMove; + bust.forEach((mv, i) => { + later(() => { + work = applyMove(work, mv.from, mv.to); + setBoard(work); + setLastMove({ from: mv.from, to: mv.to }); + setBustNote(mv.says); + const isFinal = i === bust.length - 1; + if (isFinal) { + sfx.boss(); + later(() => { sfx.explode(); buzz(HAPTIC.explode); }, 220); + setBustDone(true); + } else if (mv.you) { + sfx.step(); buzz(HAPTIC.tap); + } else { + sfx.hurt(); buzz(HAPTIC.light); + } + }, 900 * (i + 1)); + }); + if (bust.length === 0) setBustDone(true); }; const next = () => { @@ -210,6 +265,7 @@ export function ChessPuzzle() { const retry = () => loadPuzzle(idx); const reset = () => { + clearTimers(); setIdx(0); loadPuzzle(0); setSolvedCount(0); @@ -224,16 +280,16 @@ export function ChessPuzzle() { gameId="chess" outcome={outcome} win={solvedCount >= PUZZLES.length} - scoreLine={`${solvedCount}/${PUZZLES.length} endgames cracked!`} + scoreLine={`${solvedCount}/${PUZZLES.length} mates found!`} onReplay={reset} />
); } - const hintFrom = showHint && status === 'play' ? ply.from : null; - const hintTo = showHint && status === 'play' ? ply.to : null; - const multi = puzzle.line.length > 1; + const correctOpt = ply.options.find((o) => o.correct); + const hintFrom = showHint && status === 'play' ? correctOpt?.from : null; + const hintTo = showHint && status === 'play' ? correctOpt?.to : null; return (
@@ -251,28 +307,26 @@ export function ChessPuzzle() {

⚖️ {puzzle.material}

- {/* board */} + {/* board (display only — you move by choosing below) */}
{board.map((row, r) => row.map((piece, c) => { const sq = rcSq(r, c); const dark = (r + c) % 2 === 1; - const isSel = sel === sq; const isHintFrom = hintFrom === sq; const isHintTo = hintTo === sq; - const ring = isSel - ? 'outline outline-4 -outline-offset-4 outline-yellow-400' - : isHintFrom - ? 'outline outline-4 -outline-offset-4 outline-amber-400' - : isHintTo - ? 'outline outline-4 -outline-offset-4 outline-emerald-400' + const isLast = lastMove && (lastMove.from === sq || lastMove.to === sq); + const ring = isHintFrom + ? 'outline outline-4 -outline-offset-4 outline-amber-400' + : isHintTo + ? 'outline outline-4 -outline-offset-4 outline-emerald-400' + : isLast + ? 'outline outline-4 -outline-offset-4 outline-sky-400/80' : ''; return ( - +
); }), )}
- {(status === 'solved' || status === 'wrong') && ( + {(status === 'solved' || status === 'busted') && ( )}
- {/* status + controls */} -
- {(status === 'play' || status === 'reply') && ( + {/* status + move choices */} +
+ {status === 'play' && ( <> - {multi && ( -
- Your move {step + 1} of {puzzle.line.length} -
- )} - {status === 'reply' ? ( -

{replyNote}

- ) : ( - <> -

{ply.hint}

+

{ply.hint}

+
+ {ply.options.map((o, i) => ( - - )} + ))} +
+ )} + {status === 'solved' && ( - <> +

✔ {puzzle.win}

- +
)} - {status === 'wrong' && ( - <> -

✘ {puzzle.refute}

- - + + {status === 'busted' && ( +
+

+ {bustDone ? '☠ ' : '⚠ '}{bustNote} +

+ {bustDone && ( + <> + + ☠ Checkmate — the computer beat you! + + + + )} +
)}
diff --git a/src/routes/arcade/CritterCottage.tsx b/src/routes/arcade/CritterCottage.tsx new file mode 100644 index 0000000..59bbdca --- /dev/null +++ b/src/routes/arcade/CritterCottage.tsx @@ -0,0 +1,740 @@ +import { useRef, useState } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { useProgress, type ArcadePlayOutcome } from '../../state/progress'; +import { ArcadeHeader, ArcadeEndCard } from './shared'; +import { useArcadeClock } from '../../hooks/useArcadeClock'; +import { Mascot as CharMascot, type MascotKind, type MascotExpr } from './Mascots'; +import { MilestoneQuiz } from './MilestoneQuiz'; +import { ProblemAidDrawer } from './ProblemAid'; +import { useShake } from './fx'; +import { sfx, haptic, HAPTIC } from '../../utils/arcadeAV'; + +// Critter Cottage — an 8-level carpentry builder that teaches AREA (rectangle L×W, +// square s·s, triangle ½·b·h, circle π·r²), AREA SUBTRACTION (siding = wall − window), +// and ANGLES (90/180/45/15/270). Mario-style thick borders. You measure (tap a chip), +// then SWIPE to saw the board, and the piece snaps onto the cottage. A Big Bad Wolf +// tests the build's sturdiness (Level 7), then you size a SQUARE trapdoor and spring a +// dramatic capture (Level 8) — and cute raccoons move in. Relates to the 6.G Geometry +// unit (answers recorded under '6.G'). + +const BUILDERS: MascotKind[] = ['raccoon', 'fox', 'bull', 'panda', 'turtle', 'cow']; +const STROKES_NEEDED = 3; +// Circle answers use a kid-friendly π ≈ 3 (real π ≈ 3.14, noted in the help drawer). + +interface QA { + prompt: string; + answer: number; + choices: number[]; + unit: string; // 'sq units' | '°' + aid?: string; // prompt handed to ProblemAidDrawer (rect/triangle auto-explained) + hint?: string; // inline hint for circle / angle / subtraction + goldilocks?: boolean; // sizing judgment: too small / too big / just right +} +interface Phase { + key: string; + title: string; + emoji: string; + wolf?: boolean; + trap?: boolean; + steps: QA[]; +} + +const PHASES: Phase[] = [ + { + key: 'floor', title: 'Foundation & Floor', emoji: '🪵', + steps: [ + { prompt: 'Measure the floor: length 6, width 4.\nArea = length × width = ?', answer: 24, choices: [20, 24, 28, 32], unit: 'sq units', aid: 'A rectangle is 6 wide and 4 tall. What is its AREA?' }, + ], + }, + { + key: 'walls', title: 'Two-Story Walls', emoji: '🧱', + steps: [ + { prompt: 'A tall wall is 5 wide and 8 high.\nArea = length × width = ?', answer: 40, choices: [40, 13, 35, 45], unit: 'sq units', aid: 'A rectangle is 5 wide and 8 tall. What is its AREA?' }, + { prompt: 'Every corner of the frame is a square corner.\nWhat angle is a square corner?', answer: 90, choices: [45, 90, 180, 30], unit: '°', hint: 'A square (right-angle) corner is exactly 90°.' }, + ], + }, + { + key: 'trim', title: 'Trim & Siding', emoji: '📐', + steps: [ + { prompt: 'Siding covers the wall EXCEPT the window.\nWall 8×5 = 40, window 2×3 = 6.\nSiding = 40 − 6 = ?', answer: 34, choices: [34, 46, 32, 40], unit: 'sq units', hint: 'Find each area, then SUBTRACT: 40 − 6 = 34. Leftover is what you cover.' }, + { prompt: 'The window sill lies perfectly flat — a straight line.\nA straight line is what angle?', answer: 180, choices: [90, 120, 180, 270], unit: '°', hint: 'A straight line is a half turn = 180°.' }, + ], + }, + { + key: 'roof', title: 'Roof', emoji: '🔺', + steps: [ + { prompt: 'The triangle roof face has base 8, height 5.\nArea = ½ × base × height = ?', answer: 20, choices: [40, 20, 13, 26], unit: 'sq units', aid: 'A triangle has base 8 and height 5. Its area = ½ × base × height = ?' }, + { prompt: 'Set the saw for the roof pitch — a nice slanted cut.\nWhich is the 45° pitch angle?', answer: 45, choices: [15, 45, 90, 180], unit: '°', hint: 'A 45° cut is halfway between flat (0°) and straight-up (90°).' }, + { prompt: 'Trim the eave with a gentle, shallow cut.\nWhich is the smallest, gentlest angle?', answer: 15, choices: [15, 45, 90, 270], unit: '°', hint: 'The smallest angle here is 15° — barely a tilt.' }, + ], + }, + { + key: 'chimney', title: 'Chimney & Round Window', emoji: '🪟', + steps: [ + { prompt: 'Build the chimney: 2 wide, 6 tall.\nArea = length × width = ?', answer: 12, choices: [8, 12, 16, 10], unit: 'sq units', aid: 'A rectangle is 2 wide and 6 tall. What is its AREA?' }, + { prompt: 'Cut a ROUND window, radius 4.\nCircle area = π × r × r (use π ≈ 3) = ?', answer: 48, choices: [24, 48, 12, 64], unit: 'sq units', hint: 'π × r × r ≈ 3 × 4 × 4 = 48. (Real π ≈ 3.14.)' }, + ], + }, + { + key: 'yard', title: 'Yard, Fence & Mailbox', emoji: '🏡', + steps: [ + { prompt: 'Lay a ROUND yard, radius 6.\nCircle area = π × r × r (use π ≈ 3) = ?', answer: 108, choices: [108, 36, 96, 120], unit: 'sq units', hint: 'π × r × r ≈ 3 × 6 × 6 = 108.' }, + { prompt: 'Spin the mailbox flag a three-quarter turn.\nHow many degrees is ¾ of a full 360° turn?', answer: 270, choices: [180, 240, 270, 300], unit: '°', hint: '¾ × 360 = 270°. (A full turn is 360°.)' }, + ], + }, + { + key: 'wolf', title: 'Big Bad Wolf!', emoji: '🐺', wolf: true, + steps: [ + { prompt: 'The Big Bad Wolf huffs and puffs! 💨\nStrong walls meet at sturdy SQUARE corners.\nWhat angle makes the sturdiest corner?', answer: 90, choices: [15, 45, 90, 180], unit: '°', hint: 'Square corners (90°) brace the frame — the sturdiest build!' }, + ], + }, + { + key: 'trap', title: 'Set the Trap', emoji: '🕳️', trap: true, + steps: [ + { prompt: 'To stop the wolf, dig a SQUARE trapdoor, side 5.\nA square is a rectangle with equal sides.\nArea = side × side = ?', answer: 25, choices: [10, 20, 25, 30], unit: 'sq units', aid: 'A rectangle is 5 wide and 5 tall. What is its AREA?', hint: 'A square: side × side = 5 × 5 = 25.' }, + { prompt: "The wolf's paw needs a trap of about 36 sq units.\nPick the JUST-RIGHT square trap —\nnot too small, not too big!", answer: 36, choices: [9, 25, 36, 100], unit: 'sq units', goldilocks: true, hint: 'Square areas: 3×3=9, 5×5=25, 6×6=36, 10×10=100. You want 36.' }, + ], + }, +]; + +// which house pieces are visible = number of fully-built phases +function House({ built, wolf, trap, caged, movedIn, hero }: { built: number; wolf: boolean; trap?: boolean; caged?: boolean; movedIn: boolean; hero: MascotKind }) { + const S = { stroke: '#0f172a', strokeWidth: 4, strokeLinejoin: 'round' as const, strokeLinecap: 'round' as const }; + const show = (n: number) => built >= n; // n = 1-based phase number + return ( + + {/* sky/ground */} + + + + + {/* yard + fence + mailbox (phase 6) */} + {show(6) && ( + + + + {/* mailbox */} + + + + + )} + + {/* floor slab (phase 1) */} + {show(1) && } + + {/* two-storey walls (phase 2) */} + {show(2) && ( + + + + + )} + + {/* siding trim: door + square window opening (phase 3) */} + {show(3) && ( + + + + + + )} + + {/* roof gable + rafters (phase 4) */} + {show(4) && ( + + + + + + )} + + {/* chimney + round window (phase 5) */} + {show(5) && ( + + + + + + + )} + + {/* circular trap pad in the front yard (phase 8) */} + {trap && ( + + + + 🍂 + + )} + + {/* the Big Bad Wolf — huffing (phase 7) or caged in the trap (phase 8) */} + {wolf && !movedIn && !caged && ( + + 🐺 + 💨 + + )} + {caged && ( + + 🐺 + + + + + + + )} + + {/* raccoons moved in — peeking from the door/window */} + {movedIn && ( + <> + + + ❤️ + + )} + + ); +} + +// Swipe (or tap) the plank back and forth to saw it. Each stroke rasps + buzzes; +// a few strokes cut it clean. +function SawBar({ onDone, buzz }: { onDone: () => void; buzz: (p: number | number[]) => void }) { + const [strokes, setStrokes] = useState(0); + const activeRef = useRef(false); + const lastX = useRef(null); + const lastDir = useRef(0); + const doneRef = useRef(false); + + const stroke = () => { + if (doneRef.current) return; + setStrokes((s) => { + const n = s + 1; + if (n >= STROKES_NEEDED) { + doneRef.current = true; + sfx.cut(); buzz(HAPTIC.heavy); + window.setTimeout(onDone, 260); + } else { + sfx.saw(); buzz([0, 40, 15, 40]); + } + return n; + }); + }; + + const onMove = (x: number) => { + if (!activeRef.current || doneRef.current) return; + if (lastX.current == null) { lastX.current = x; return; } + const dx = x - lastX.current; + if (Math.abs(dx) < 14) return; + const dir = Math.sign(dx); + if (dir !== 0 && dir !== lastDir.current) { + lastDir.current = dir; + stroke(); + } + lastX.current = x; + }; + + const pct = Math.min(100, (strokes / STROKES_NEEDED) * 100); + return ( +
+
🪚 Swipe back & forth to saw the board!
+
{ activeRef.current = true; lastX.current = e.clientX; }} + onPointerMove={(e) => onMove(e.clientX)} + onPointerUp={() => { activeRef.current = false; lastX.current = null; }} + onPointerLeave={() => { activeRef.current = false; lastX.current = null; }} + onClick={stroke} + role="button" + aria-label="Saw the board" + > + {/* wood grain */} +
+ {/* dashed cut line */} +
+ {/* the saw, sliding with progress */} +
🪚
+
stroke {Math.min(strokes, STROKES_NEEDED)} / {STROKES_NEEDED}
+
+
+ ); +} + +// Pull-up REFERENCE + WORKSHEET drawer: the area formulas (with worked examples), +// the angle guide, and a scratchpad to work problems out. Always available. +function GuideDrawer({ open, onClose }: { open: boolean; onClose: () => void }) { + const [scratch, setScratch] = useState(''); + const AREAS: [string, string, string][] = [ + ['▭ Rectangle', 'Area = length × width', 'e.g. 6 × 4 = 24'], + ['◼ Square (trap)', 'Area = side × side', 'e.g. 6 × 6 = 36'], + ['🔺 Triangle (roof)', 'Area = ½ × base × height', 'e.g. ½ × 8 × 5 = 20'], + ['⭕ Circle (window/yard)', 'Area = π × r × r (π ≈ 3)', 'e.g. 3 × 4 × 4 = 48'], + ['✂️ Trim / siding', 'SUBTRACT: wall − window', 'e.g. 40 − 6 = 34'], + ]; + const ANGLES: [string, string][] = [ + ['15°', 'a gentle tilt — the eave trim'], + ['45°', 'roof pitch — half of a right angle'], + ['90°', 'a square corner (right angle)'], + ['180°', 'a straight line — a half turn'], + ['270°', 'a three-quarter turn'], + ]; + return ( + + {open && ( + <> + + +
+
+

📐 Builder's guide

+ +
+ +
Area formulas
+
+ {AREAS.map(([t, f, ex]) => ( +
+
{t}
+
{f}
+
{ex}
+
+ ))} +
+ +
Angle guide
+
+ {ANGLES.map(([a, d]) => ( +
+ {a} + {d} +
+ ))} +
+ +
+
✏️ Worksheet — work it out here
+