Files
tiennm99 f51306add1 v0.0.4.0 feat(module-2): tam giác đồng dạng (lớp 8, scale slider) (#4)
* feat(component): similarity-scale slider controller

Single-slider similarity demo for Module 2. Fixed △ABC, scaled △A'B'C' computed
each frame as `centroid_target + k · (vertex − centroid_ABC)` for k ∈ [0.5, 2].
The slider's input event is the only event listener — no Pointer Events here
(we're not dragging vertices in this MVP). AbortController teardown on
astro:before-swap as before.

The renderTicks helper is duplicated from congruence-sss.ts for now — when
Module 4 lands we'll factor it out into a shared module. Premature
abstraction would force a circular import structure for one helper.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(module-2): tam giác đồng dạng (lớp 8) with scale slider

Page at /lop-8/tam-giac-dong-dang/. △ABC fixed on the left at scalene scale-72.8 / 83.2 / 93.4 sides. △A'B'C' is the runtime scaled image, controlled by a
single range input k ∈ [0.5, 2] step 0.05.

Live readout table shows all six side lengths and all three ratios. The killer
moment: drag the slider, watch all 3 ratios stay numerically equal to each
other (= 1/k). That equality IS the definition of similarity, made visible.

Tick marks per Decision D3: 1/2/3 ticks color-paired (#D7263D / #1B998B /
#F46036). Triangle 1 ticks rendered once on mount; triangle 2 ticks redrawn
on every slider input.

Hub: lớp 8 card flips to live status. All 3 grade cards now active —
the autoplan 3-module hero set is complete.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore: VERSION 0.0.4.0 + CHANGELOG + TODOS update

v0.0.4.0 = scaffold + Module 3 (góc nội tiếp) + Module 1 (tam giác bằng nhau)
+ Module 2 (tam giác đồng dạng). All three MVP modules from autoplan now live.

Move 2 P1 items to Completed (scale slider, ratio readout) and reduce Module 2
remaining items to P2 (free-drag mode) + P3 (numeric angle readouts).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 00:25:08 +07:00

157 lines
8.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TODOS
Tracked work, organized by component then priority (P0 highest → P4 lowest). See `~/.gstack/projects/tiennm99-try-gstack/tiennm99-main-design-20260429-160610.md` for the full plan.
## Distribution & Validation (Phase 0, pre-build)
- **Phase 0 SERP audit**
**Priority:** P0
**What:** 2-hour Google.com.vn / YouTube VN / TikTok VN audit on `góc nội tiếp`, `tam giác bằng nhau`, `tam giác đồng dạng`. Document positions 110 + dominant content type.
**Why:** Determines whether text page can win SERP or whether we pivot to video-first.
**Output:** `competitive-landscape.md` companion file.
- **Phase 0 TikTok / Shorts validation**
**Priority:** P0
**What:** 5 short videos (1030s) of mock drag interactions (Figma + Lottie + screen-record). Post to test the visual-wow thesis BEFORE writing module code.
**Why:** If videos flop, the entire visualizer wedge is dead before a weekend is invested.
- **Vetted Facebook group entry**
**Priority:** P1
**What:** Join "Hỏi đáp Toán THCS", "Toán học vui", "Giáo viên Toán". Post one helpful, non-self-promotional answer in each. Earn standing.
**Why:** Distribution plan depends on these groups; founder must have presence before the launch post.
## TheoremCanvas primitive (weekend 1, before any module)
- **Build TheoremCanvas as single HTML file first**
**Priority:** P1
**What:** `<TheoremCanvas mode="..." initial={...} client:visible />` API. SVG canvas + Pointer Events drag + setPointerCapture per vertex. AbortController teardown. Per autoplan eng decision E1.
**Where:** prototype as standalone `prototype.html`, then port into `src/components/TheoremCanvas.astro` once API feels right.
- **Vertex drag affordance + 48px hit-target**
**Priority:** P1
**What:** 14px filled circle, 2px white stroke, 4px drop shadow, 48px transparent square hit-target, `tabindex=0`, focused = 3px #D7263D ring. Per Design Decision D1.
- **Keyboard navigation for vertices**
**Priority:** P1
**What:** Tab cycles vertices; arrows ±4px; shift+arrow ±16px; Enter snaps to nearest interesting position. Per Design F6.1.
## Module 3 — Lớp 9 Góc nội tiếp (weekend 2, hero module)
- **Theorem panel + 3 worked SGK-style examples**
**Priority:** P1
**Status:** PARTIAL — v0.0.2.0 ships theorem panel + 1 worked example. 2 more examples remain.
- **First-load coaching state** (per Design F2.2)
**Priority:** P2
**What:** Animated ghost-finger gesture for 1.5s, "Kéo điểm M để khám phá" caption, dismissible, persisted in localStorage.
- **ARIA-live announcements on dragend**
**Priority:** P2
**What:** "Góc AMB bằng 47 độ" announced via `aria-live="polite"`. Per Design F6.4.
- **Multi-toggle theorem variants**
**Priority:** P2
**What:** Toggle between "góc nội tiếp" / "góc nội tiếp chắn nửa đường tròn = 90°" / "góc tạo bởi tiếp tuyến và dây cung". Each variant uses the same canvas with different fixed-point setup.
- **KaTeX inline rendering for theorem text**
**Priority:** P3
**What:** Currently uses Unicode (∠AMB, °) which renders fine in Be Vietnam Pro. Switch to KaTeX when notation gets richer (cung, đường tròn (O), etc.).
## Module 1 — Lớp 7 Tam giác bằng nhau
- **SAS / ASA / AAS / cạnh huyền-góc nhọn / cạnh huyền-cạnh góc vuông toggles**
**Priority:** P2
**What:** SSS shipped in v0.0.3.0. Add the other 5 cases as toggles on the same canvas — toggling switches which sides/angles get the matched encoding and which detector runs.
- **More worked examples (Module 1)**
**Priority:** P3
**What:** v0.0.3.0 ships 1 example. SGK textbook has many. Add 2 more.
## Module 2 — Lớp 8 Tam giác đồng dạng
- **Free-vertex-drag mode (AA / SAS / SSS đồng dạng detectors)**
**Priority:** P2
**What:** v0.0.4.0 ships scale-slider mode. Add a toggle to switch into free-drag mode where both triangles' vertices can be moved independently and the detector identifies which similarity case (if any) holds. Adds `src/geom-engine/similarity.ts`.
- **Numeric angle readouts on the canvas**
**Priority:** P3
**What:** Currently angles are pinned conceptually in prose. Add live numeric readouts (∠A, ∠B, ∠C and primes) so students see "the angles don't change" empirically.
## Testing & CI infrastructure (with first canvas module)
- **fast-check property tests**
**Priority:** P1
**What:** `∀ M on arc, |∠AMB ∠AM₀B| < 0.5°` (inscribed-angle invariance). `∀ pointer, dist(projectToCircle(p, c), c.center) = c.r ± ε`.
- **Playwright e2e + multi-touch tests**
**Priority:** P1
**What:** Per-module happy-path + keyboard-path + multi-touch-path. Use `device: 'Pixel 5'` for touch profiles. Per autoplan test plan.
- **size-limit bundle gate**
**Priority:** P2
**What:** 200KB gz JS / 50KB gz CSS / 80KB woff2 fonts. CI fail-fast.
- **Lighthouse-CI gate**
**Priority:** P2
**What:** Mobile preset, ≥90 Perf + A11y. Run against `bun preview`.
- **axe-playwright a11y tests**
**Priority:** P2
**What:** Zero axe-violations on every module page.
- **Visual regression for tick-marks + Vietnamese diacritics**
**Priority:** P2
**What:** Argos / Playwright snapshot baselines.
## Retention & Distribution (post-MVP)
- **Zalo / Telegram subscribe CTA on every module**
**Priority:** P2
**What:** "Nhận theorem mới mỗi tuần" — turns hub into sequence. Per CEO finding (theme 4).
- **Lớp-9 course-spine "next theorem" footer card**
**Priority:** P2
**What:** Each lớp-9 module links forward to next theorem. Per Design F3.5.
- **OpenGraph image generation per module**
**Priority:** P2
**What:** Pre-rendered SVG-to-PNG of canvas hero state. Critical for FB / Zalo shares.
- **Schema.org `LearningResource` meta**
**Priority:** P3
**What:** Per-module structured data for Google rich results.
## Domain & infra (post-validation trigger)
- **Buy `.vn` / `.com.vn` domain**
**Priority:** P1
**What:** TRIGGER: 500 sessions/30d OR 1 organic teacher share OR ≥5 modules shipped (per RUNBOOK). VN registration takes 714 days.
- **Cloudflare Web Analytics**
**Priority:** P2
**What:** JS-injected, no cookies, no consent banner. Activate after first 50 daily sessions.
- **`PUBLIC_VERSION` env wiring**
**Priority:** P3
**What:** Currently `index.astro` reads `import.meta.env.PUBLIC_VERSION ?? '0.0.1.0'` — env never set. Wire it from CI build (read VERSION file) so footer doesn't rot on bump.
## Out of scope (deferred indefinitely or to v2)
- English / bilingual support
- Embed-as-iframe API (CSP frame-ancestors work)
- Comments via Giscus
- Account / auth / email capture
- Browser extension overlay (out of static scope)
- Anki-style spaced-repetition deck (different product shape)
- Print → digital QR bridge (distribution experiment, not engineering)
- Teacher-tool / B2B2C demo mode (build after Module 3 ships)
## Completed
- **Drag M around circle, project to circle constraint** — `src/components/inscribed-angle.ts` + `src/geom-engine/circle.ts:projectToCircle`. **Completed:** v0.0.2.0 (2026-04-29)
- **TheoremCanvas primitive first cut** — vanilla TS in Astro `<script>` tag, AbortController teardown on `astro:before-swap`. **Completed:** v0.0.2.0 (2026-04-29). Note: built directly in Astro rather than as a single HTML prototype first; the inscribed-angle pattern proved the shape, and the next module (lớp 7 / 8) will reuse this pattern.
- **SSS detector** — `src/geom-engine/triangle.ts:congruentSSS` with position-strict semantics. 10 unit tests including symmetry and EPSILON tolerance. **Completed:** v0.0.3.0 (2026-04-30)
- **SGK tick-mark encoding** — 1/2/3 ticks paired with the locked 3-color palette, rendered live during drag. Wired in Module 1 (Tam giác bằng nhau). **Completed:** v0.0.3.0 (2026-04-30). Tick rendering helper in `src/components/congruence-sss.ts:renderTicks` is reusable for future modules.
- **Scale slider clamped to [0.5, 2.0]** — `src/components/similarity-scale.ts` step 0.05. Cannot reach 0. **Completed:** v0.0.4.0 (2026-04-30)
- **Similarity ratio readout** — three ratio readouts (AB/AB, BC/BC, CA/CA) showing all-equal under scaling. **Completed:** v0.0.4.0 (2026-04-30) as part of Module 2.