Enhance curriculum catalog functionality: Update CONTRIBUTING.md to reflect changes in curriculum structure, including the introduction of curriculumCoverage for frameworks. Modify frontend components to support a new comparison view for Mathematics, allowing users to compare curricula. Update catalog data to include "Common Core" and improve curriculum filtering logic. Enhance styles for better visual representation of curriculum badges and Mermaid diagrams. Adjust TypeScript types to accommodate new features and ensure backward compatibility with legacy curriculum data.

This commit is contained in:
Hananoshika Yomaru 2026-05-20 14:02:29 -07:00
parent ede9a7aa63
commit 5175811579
34 changed files with 3702 additions and 176 deletions

View file

@ -0,0 +1,461 @@
/**
* One-off helper: merge research-based curriculumCoverage into math-curriculum.json.
* Run: bun scripts/apply-math-coverage.ts
*/
import { readFileSync, writeFileSync } from "node:fs";
import path from "node:path";
type Role = "core" | "extension" | "related";
type Coverage = Partial<Record<string, Role>>;
const ROOT = path.join(import.meta.dir, "..");
const JSON_PATH = path.join(ROOT, "data/math-curriculum.json");
/** slug → framework label → role */
const COVERAGE_BY_SLUG: Record<string, Coverage> = {
"counting-and-numbers": {
Foundation: "core",
IGCSE: "core",
"Common Core": "core",
Singapore: "core",
"UK GCSE": "core",
DSE: "related",
IB: "related",
"A-Level": "related",
AP: "related",
Gaokao: "related",
},
"basic-math-notation": {
Foundation: "core",
IGCSE: "core",
"Common Core": "core",
Singapore: "core",
"UK GCSE": "core",
DSE: "related",
IB: "related",
"A-Level": "related",
AP: "related",
Gaokao: "related",
},
"properties-of-operations": {
Foundation: "core",
IGCSE: "core",
"Common Core": "core",
Singapore: "core",
"UK GCSE": "core",
DSE: "related",
IB: "related",
"A-Level": "related",
AP: "related",
Gaokao: "related",
},
"written-calculation": {
Foundation: "core",
IGCSE: "core",
"Common Core": "core",
Singapore: "core",
"UK GCSE": "core",
DSE: "related",
IB: "related",
"A-Level": "related",
AP: "related",
Gaokao: "related",
},
"integer-foundations": {
Foundation: "core",
IGCSE: "core",
"Common Core": "core",
Singapore: "core",
"UK GCSE": "core",
IB: "related",
"A-Level": "related",
AP: "related",
DSE: "related",
Gaokao: "related",
},
"integer-arithmetic": {
Foundation: "core",
IGCSE: "core",
"Common Core": "core",
Singapore: "core",
"UK GCSE": "core",
IB: "related",
"A-Level": "related",
AP: "related",
DSE: "related",
Gaokao: "related",
},
"rational-number-operations": {
Foundation: "core",
IGCSE: "core",
"Common Core": "core",
Singapore: "core",
"UK GCSE": "core",
IB: "related",
"A-Level": "related",
AP: "related",
DSE: "related",
Gaokao: "related",
},
"percentage-applications": {
Foundation: "core",
IGCSE: "core",
"Common Core": "core",
Singapore: "core",
"UK GCSE": "core",
IB: "related",
"A-Level": "related",
AP: "related",
DSE: "related",
Gaokao: "related",
},
"ratios-and-rates-foundation": {
Foundation: "core",
IGCSE: "core",
"Common Core": "core",
Singapore: "core",
"UK GCSE": "core",
IB: "related",
"A-Level": "related",
AP: "related",
DSE: "related",
Gaokao: "related",
},
"directed-numbers-rates": {
DSE: "core",
IGCSE: "core",
"Common Core": "core",
Singapore: "core",
"UK GCSE": "core",
Foundation: "related",
IB: "related",
"A-Level": "related",
AP: "related",
Gaokao: "related",
},
"polynomials-expansion-factorisation": {
DSE: "core",
IGCSE: "core",
IB: "core",
"A-Level": "core",
"Common Core": "core",
Singapore: "core",
"UK GCSE": "core",
Gaokao: "core",
Foundation: "related",
AP: "related",
},
"algebraic-fractions-formulas": {
DSE: "core",
IGCSE: "core",
IB: "core",
"A-Level": "core",
"Common Core": "related",
Singapore: "related",
"UK GCSE": "core",
Gaokao: "related",
Foundation: "related",
AP: "related",
},
"linear-equations-two-unknowns": {
DSE: "core",
IGCSE: "core",
IB: "core",
"A-Level": "core",
"Common Core": "core",
Singapore: "core",
"UK GCSE": "core",
Gaokao: "core",
AP: "related",
Foundation: "related",
},
"linear-inequalities-one-unknown": {
DSE: "core",
IGCSE: "core",
"Common Core": "core",
"UK GCSE": "core",
IB: "related",
"A-Level": "related",
AP: "related",
Singapore: "related",
Gaokao: "related",
},
"laws-of-indices": {
DSE: "core",
IGCSE: "core",
IB: "core",
"A-Level": "core",
AP: "core",
"Common Core": "core",
"UK GCSE": "core",
Singapore: "core",
Gaokao: "core",
Foundation: "related",
},
"quadratic-equations": {
DSE: "core",
IGCSE: "core",
IB: "core",
"A-Level": "core",
AP: "core",
"Common Core": "core",
"UK GCSE": "core",
Singapore: "core",
Gaokao: "core",
Foundation: "related",
},
"factor-remainder-theorems": {
DSE: "extension",
IB: "extension",
"A-Level": "extension",
IGCSE: "related",
Gaokao: "related",
AP: "related",
},
"complex-numbers": {
DSE: "extension",
IB: "extension",
"A-Level": "extension",
Gaokao: "related",
IGCSE: "related",
AP: "related",
},
"functions-graphs": {
DSE: "core",
IGCSE: "core",
IB: "core",
"A-Level": "core",
AP: "core",
"Common Core": "core",
"UK GCSE": "core",
Singapore: "core",
Gaokao: "core",
Foundation: "related",
},
"exponential-logarithmic": {
DSE: "extension",
IGCSE: "core",
IB: "core",
"A-Level": "core",
AP: "core",
"Common Core": "core",
"UK GCSE": "core",
Gaokao: "core",
Singapore: "related",
Foundation: "related",
},
"sequences-series": {
DSE: "core",
IGCSE: "core",
IB: "core",
"A-Level": "core",
"Common Core": "related",
"UK GCSE": "core",
AP: "related",
Gaokao: "core",
Singapore: "related",
Foundation: "related",
},
"variations": {
DSE: "core",
IB: "related",
"A-Level": "related",
IGCSE: "related",
"Common Core": "related",
Singapore: "related",
},
"linear-programming": {
DSE: "extension",
IB: "extension",
"A-Level": "related",
AP: "related",
IGCSE: "related",
},
"coordinate-geometry-foundations": {
DSE: "core",
IGCSE: "core",
"Common Core": "core",
"UK GCSE": "core",
IB: "core",
"A-Level": "related",
Singapore: "core",
AP: "related",
Gaokao: "related",
},
"deductive-geometry": {
DSE: "core",
IGCSE: "core",
"UK GCSE": "core",
"Common Core": "core",
Singapore: "core",
IB: "related",
"A-Level": "related",
Gaokao: "related",
},
"congruence-similarity": {
DSE: "core",
IGCSE: "core",
"UK GCSE": "core",
"Common Core": "core",
Singapore: "core",
IB: "related",
"A-Level": "related",
Gaokao: "related",
},
"pythagoras-theorem": {
DSE: "core",
IGCSE: "core",
"UK GCSE": "core",
"Common Core": "core",
Singapore: "core",
IB: "core",
"A-Level": "related",
Gaokao: "core",
AP: "related",
},
"introduction-trigonometry": {
DSE: "core",
IGCSE: "core",
"UK GCSE": "core",
"Common Core": "core",
Singapore: "core",
IB: "core",
"A-Level": "related",
Gaokao: "core",
AP: "related",
},
"mensuration-3d": {
DSE: "core",
IGCSE: "core",
"UK GCSE": "core",
"Common Core": "core",
Singapore: "core",
IB: "related",
"A-Level": "related",
Gaokao: "related",
},
"coordinate-circles": {
DSE: "core",
IGCSE: "related",
IB: "extension",
"A-Level": "extension",
Gaokao: "related",
"UK GCSE": "related",
AP: "related",
},
"advanced-trigonometry": {
DSE: "extension",
IGCSE: "core",
IB: "core",
"A-Level": "core",
AP: "core",
"UK GCSE": "core",
Gaokao: "core",
"Common Core": "related",
Singapore: "related",
},
"circle-properties": {
DSE: "extension",
IGCSE: "core",
"UK GCSE": "core",
IB: "related",
"A-Level": "related",
Gaokao: "related",
Singapore: "related",
},
"loci": {
DSE: "extension",
IGCSE: "related",
"A-Level": "related",
IB: "related",
"UK GCSE": "related",
},
"statistical-charts-averages": {
DSE: "core",
IGCSE: "core",
IB: "core",
"Common Core": "core",
"UK GCSE": "core",
Singapore: "core",
AP: "related",
Gaokao: "related",
"A-Level": "related",
},
"measures-dispersion": {
DSE: "core",
IGCSE: "core",
IB: "core",
"A-Level": "related",
AP: "related",
"Common Core": "core",
"UK GCSE": "core",
Singapore: "related",
Gaokao: "related",
},
"basic-probability": {
DSE: "core",
IGCSE: "core",
IB: "core",
"Common Core": "core",
"UK GCSE": "core",
Singapore: "core",
AP: "related",
"A-Level": "related",
Gaokao: "related",
},
"permutations-combinations-probability": {
DSE: "extension",
IGCSE: "extension",
IB: "core",
"A-Level": "core",
AP: "related",
Gaokao: "related",
"Common Core": "related",
},
"normal-distribution-z-scores": {
DSE: "extension",
IB: "core",
"A-Level": "core",
AP: "related",
IGCSE: "related",
Gaokao: "related",
"Common Core": "related",
},
"statistical-literacy": {
DSE: "core",
IB: "related",
"Common Core": "related",
IGCSE: "related",
AP: "related",
"A-Level": "related",
Singapore: "related",
},
};
type Chapter = {
slug: string;
curriculums?: string[];
curriculumCoverage?: Coverage;
[key: string]: unknown;
};
type Catalog = {
strands: { chapters: Chapter[] }[];
[key: string]: unknown;
};
const catalog = JSON.parse(readFileSync(JSON_PATH, "utf8")) as Catalog;
for (const strand of catalog.strands) {
for (const chapter of strand.chapters) {
const coverage = COVERAGE_BY_SLUG[chapter.slug];
if (!coverage) {
throw new Error(`Missing coverage map for slug: ${chapter.slug}`);
}
chapter.curriculumCoverage = coverage;
delete chapter.curriculums;
}
}
writeFileSync(JSON_PATH, `${JSON.stringify(catalog, null, 2)}\n`);
console.log(`Updated ${Object.keys(COVERAGE_BY_SLUG).length} chapters in math-curriculum.json`);