mirror of
https://github.com/HananoshikaYomaru/openfreebooks.git
synced 2026-11-13 21:15:54 +00:00
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:
parent
ede9a7aa63
commit
5175811579
34 changed files with 3702 additions and 176 deletions
|
|
@ -487,7 +487,7 @@
|
|||
|
||||
:global(.catalog-mermaid-view__svg .node rect),
|
||||
:global(.catalog-mermaid-view__svg .node polygon),
|
||||
:global(.catalog-mermaid-view__svg .cluster rect) {
|
||||
:global(.catalog-mermaid-view__svg .cluster > rect:not(.catalog-mermaid-strand-header)) {
|
||||
fill: color-mix(in srgb, var(--paper) 92%, transparent);
|
||||
stroke: color-mix(in srgb, var(--card-border) 88%, var(--line));
|
||||
stroke-width: 1.3px;
|
||||
|
|
@ -533,7 +533,7 @@
|
|||
}
|
||||
|
||||
:global(.catalog-mermaid-view__svg .plannedNode .catalog-badge:not(.book-chapter-badge--planned)) {
|
||||
opacity: 0.55;
|
||||
opacity: 0.72;
|
||||
}
|
||||
|
||||
:global(.catalog-mermaid-view__svg .edge-path path) {
|
||||
|
|
@ -541,9 +541,57 @@
|
|||
stroke-width: 1.8px;
|
||||
}
|
||||
|
||||
:global(.catalog-mermaid-view__svg .cluster rect) {
|
||||
fill: color-mix(in srgb, var(--paper) 78%, transparent);
|
||||
stroke: color-mix(in srgb, var(--accent) 26%, var(--line));
|
||||
/* Strand cluster fills come from Mermaid themeVariables (clusterBkg / secondaryColor), not CSS. */
|
||||
|
||||
:global(.catalog-mermaid-view__svg g.cluster.catalog-mermaid-strand-cluster > rect.catalog-mermaid-strand-header) {
|
||||
stroke: none;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
:global(.catalog-mermaid-view__svg .catalog-mermaid-strand-header__rule) {
|
||||
stroke-width: 1px;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
:global(.catalog-mermaid-view__svg foreignObject.catalog-mermaid-strand-label-fo) {
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
:global(.catalog-mermaid-view__svg g.cluster.catalog-mermaid-strand-cluster .cluster-label foreignObject),
|
||||
:global(.catalog-mermaid-view__svg g.cluster.catalog-mermaid-strand-cluster .cluster-label foreignObject div),
|
||||
:global(.catalog-mermaid-view__svg g.cluster.catalog-mermaid-strand-cluster .cluster-label foreignObject span),
|
||||
:global(.catalog-mermaid-view__svg g.cluster.catalog-mermaid-strand-cluster .cluster-label foreignObject header),
|
||||
:global(.catalog-mermaid-view__svg g.cluster.catalog-mermaid-strand-cluster .cluster-label .nodeLabel),
|
||||
:global(.catalog-mermaid-view__svg g.cluster.catalog-mermaid-strand-cluster .cluster-label .label) {
|
||||
overflow: visible !important;
|
||||
border: none !important;
|
||||
border-radius: 0 !important;
|
||||
background: transparent !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
:global(.catalog-mermaid-view__svg g.cluster.catalog-mermaid-strand-cluster .cluster-label .catalog-mermaid-strand__header) {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
:global(.catalog-mermaid-view__svg g.cluster.catalog-mermaid-strand-cluster .cluster-label .catalog-mermaid-strand__title) {
|
||||
display: block;
|
||||
margin: 0;
|
||||
padding: 2px 0 4px;
|
||||
font-family: var(--font-heading);
|
||||
font-size: 0.95rem;
|
||||
font-weight: 400;
|
||||
line-height: 1.35;
|
||||
letter-spacing: 0.01em;
|
||||
color: var(--ink);
|
||||
white-space: nowrap;
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
:global(.catalog-mermaid-node) {
|
||||
|
|
@ -589,7 +637,7 @@
|
|||
[data-theme="dark"] .catalog-mermaid-view {
|
||||
:global(.catalog-mermaid-view__svg .node rect),
|
||||
:global(.catalog-mermaid-view__svg .node polygon),
|
||||
:global(.catalog-mermaid-view__svg .cluster rect) {
|
||||
:global(.catalog-mermaid-view__svg .cluster > rect:not(.catalog-mermaid-strand-header)) {
|
||||
stroke: color-mix(in srgb, var(--accent) 78%, #ffffff 22%);
|
||||
}
|
||||
|
||||
|
|
@ -733,7 +781,7 @@
|
|||
}
|
||||
|
||||
.catalog-badge:not(.book-chapter-badge--planned) {
|
||||
opacity: 0.5;
|
||||
opacity: 0.72;
|
||||
}
|
||||
|
||||
.book-chapter-badge--planned {
|
||||
|
|
@ -819,6 +867,76 @@ a.catalog-chapter-card {
|
|||
// Badges & empty state
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
@mixin catalog-badge-tokens-dark {
|
||||
--badge-foundation-fg: #5eead4;
|
||||
--badge-foundation-bg: rgba(45, 212, 191, 0.22);
|
||||
--badge-foundation-border: rgba(94, 234, 212, 0.45);
|
||||
--badge-dse-fg: #93c5fd;
|
||||
--badge-dse-bg: rgba(96, 165, 250, 0.22);
|
||||
--badge-dse-border: rgba(147, 197, 253, 0.45);
|
||||
--badge-ib-fg: #c4b5fd;
|
||||
--badge-ib-bg: rgba(167, 139, 250, 0.22);
|
||||
--badge-ib-border: rgba(196, 181, 253, 0.45);
|
||||
--badge-a-level-fg: #6ee7b7;
|
||||
--badge-a-level-bg: rgba(52, 211, 153, 0.2);
|
||||
--badge-a-level-border: rgba(110, 231, 183, 0.42);
|
||||
--badge-ap-fg: #fcd34d;
|
||||
--badge-ap-bg: rgba(251, 191, 36, 0.2);
|
||||
--badge-ap-border: rgba(252, 211, 77, 0.45);
|
||||
--badge-igcse-fg: #fda4af;
|
||||
--badge-igcse-bg: rgba(251, 113, 133, 0.2);
|
||||
--badge-igcse-border: rgba(253, 164, 175, 0.45);
|
||||
--badge-common-core-fg: #93c5fd;
|
||||
--badge-common-core-bg: rgba(59, 130, 246, 0.22);
|
||||
--badge-common-core-border: rgba(147, 197, 253, 0.45);
|
||||
--badge-extension-fg: #fdba74;
|
||||
--badge-extension-bg: rgba(251, 146, 60, 0.22);
|
||||
--badge-extension-border: rgba(253, 186, 116, 0.45);
|
||||
--badge-default-fg: #e7e5e0;
|
||||
--badge-default-bg: rgba(236, 234, 228, 0.1);
|
||||
--badge-default-border: rgba(236, 234, 228, 0.28);
|
||||
}
|
||||
|
||||
:root {
|
||||
--badge-foundation-fg: #0f766e;
|
||||
--badge-foundation-bg: rgba(20, 184, 166, 0.12);
|
||||
--badge-foundation-border: rgba(20, 184, 166, 0.28);
|
||||
--badge-dse-fg: #1d4ed8;
|
||||
--badge-dse-bg: rgba(59, 130, 246, 0.12);
|
||||
--badge-dse-border: rgba(59, 130, 246, 0.25);
|
||||
--badge-ib-fg: #6d28d9;
|
||||
--badge-ib-bg: rgba(139, 92, 246, 0.12);
|
||||
--badge-ib-border: rgba(139, 92, 246, 0.25);
|
||||
--badge-a-level-fg: #047857;
|
||||
--badge-a-level-bg: rgba(16, 185, 129, 0.12);
|
||||
--badge-a-level-border: rgba(16, 185, 129, 0.25);
|
||||
--badge-ap-fg: #b45309;
|
||||
--badge-ap-bg: rgba(245, 158, 11, 0.12);
|
||||
--badge-ap-border: rgba(245, 158, 11, 0.25);
|
||||
--badge-igcse-fg: #be123c;
|
||||
--badge-igcse-bg: rgba(244, 63, 94, 0.12);
|
||||
--badge-igcse-border: rgba(244, 63, 94, 0.25);
|
||||
--badge-common-core-fg: #1e40af;
|
||||
--badge-common-core-bg: rgba(37, 99, 235, 0.1);
|
||||
--badge-common-core-border: rgba(37, 99, 235, 0.25);
|
||||
--badge-extension-fg: #9a3412;
|
||||
--badge-extension-bg: rgba(234, 88, 12, 0.1);
|
||||
--badge-extension-border: rgba(234, 88, 12, 0.28);
|
||||
--badge-default-fg: var(--soft-ink);
|
||||
--badge-default-bg: var(--paper);
|
||||
--badge-default-border: var(--line);
|
||||
}
|
||||
|
||||
[data-theme="dark"] {
|
||||
@include catalog-badge-tokens-dark;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root:not([data-theme="light"]) {
|
||||
@include catalog-badge-tokens-dark;
|
||||
}
|
||||
}
|
||||
|
||||
.catalog-badge {
|
||||
padding: 4px 8px;
|
||||
border: 1px solid transparent;
|
||||
|
|
@ -830,51 +948,57 @@ a.catalog-chapter-card {
|
|||
text-transform: uppercase;
|
||||
|
||||
&--foundation {
|
||||
color: #0f766e;
|
||||
background: rgba(20, 184, 166, 0.12);
|
||||
border-color: rgba(20, 184, 166, 0.28);
|
||||
color: var(--badge-foundation-fg);
|
||||
background: var(--badge-foundation-bg);
|
||||
border-color: var(--badge-foundation-border);
|
||||
}
|
||||
|
||||
&--dse {
|
||||
color: #1d4ed8;
|
||||
background: rgba(59, 130, 246, 0.12);
|
||||
border-color: rgba(59, 130, 246, 0.25);
|
||||
color: var(--badge-dse-fg);
|
||||
background: var(--badge-dse-bg);
|
||||
border-color: var(--badge-dse-border);
|
||||
}
|
||||
|
||||
&--ib {
|
||||
color: #6d28d9;
|
||||
background: rgba(139, 92, 246, 0.12);
|
||||
border-color: rgba(139, 92, 246, 0.25);
|
||||
color: var(--badge-ib-fg);
|
||||
background: var(--badge-ib-bg);
|
||||
border-color: var(--badge-ib-border);
|
||||
}
|
||||
|
||||
&--a-level {
|
||||
color: #047857;
|
||||
background: rgba(16, 185, 129, 0.12);
|
||||
border-color: rgba(16, 185, 129, 0.25);
|
||||
color: var(--badge-a-level-fg);
|
||||
background: var(--badge-a-level-bg);
|
||||
border-color: var(--badge-a-level-border);
|
||||
}
|
||||
|
||||
&--ap {
|
||||
color: #b45309;
|
||||
background: rgba(245, 158, 11, 0.12);
|
||||
border-color: rgba(245, 158, 11, 0.25);
|
||||
color: var(--badge-ap-fg);
|
||||
background: var(--badge-ap-bg);
|
||||
border-color: var(--badge-ap-border);
|
||||
}
|
||||
|
||||
&--igcse {
|
||||
color: #be123c;
|
||||
background: rgba(244, 63, 94, 0.12);
|
||||
border-color: rgba(244, 63, 94, 0.25);
|
||||
color: var(--badge-igcse-fg);
|
||||
background: var(--badge-igcse-bg);
|
||||
border-color: var(--badge-igcse-border);
|
||||
}
|
||||
|
||||
&--common-core {
|
||||
color: var(--badge-common-core-fg);
|
||||
background: var(--badge-common-core-bg);
|
||||
border-color: var(--badge-common-core-border);
|
||||
}
|
||||
|
||||
&--extension {
|
||||
color: #9a3412;
|
||||
background: rgba(234, 88, 12, 0.1);
|
||||
border-color: rgba(234, 88, 12, 0.28);
|
||||
color: var(--badge-extension-fg);
|
||||
background: var(--badge-extension-bg);
|
||||
border-color: var(--badge-extension-border);
|
||||
}
|
||||
|
||||
&--default {
|
||||
color: var(--soft-ink);
|
||||
background: var(--paper);
|
||||
border-color: var(--line);
|
||||
color: var(--badge-default-fg);
|
||||
background: var(--badge-default-bg);
|
||||
border-color: var(--badge-default-border);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -903,6 +1027,171 @@ a.catalog-chapter-card {
|
|||
color: var(--soft-ink);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Compare doc (mathematics curricula)
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
.catalog-shell--compare .catalog-content {
|
||||
padding-top: 8px;
|
||||
}
|
||||
|
||||
.catalog-compare-doc {
|
||||
max-width: 56rem;
|
||||
padding: 8px 24px 48px;
|
||||
}
|
||||
|
||||
.catalog-compare-doc__lead {
|
||||
margin: 0 0 24px;
|
||||
font-size: 1.05rem;
|
||||
line-height: 1.6;
|
||||
color: var(--soft-ink);
|
||||
}
|
||||
|
||||
.catalog-compare-doc__section {
|
||||
margin-top: 32px;
|
||||
}
|
||||
|
||||
.catalog-compare-doc__heading {
|
||||
margin: 0 0 12px;
|
||||
font-family: var(--font-heading);
|
||||
font-size: 1.35rem;
|
||||
color: var(--ink);
|
||||
}
|
||||
|
||||
.catalog-compare-doc__subheading {
|
||||
margin: 20px 0 8px;
|
||||
font-family: var(--font-heading);
|
||||
font-size: 1.1rem;
|
||||
color: var(--ink);
|
||||
}
|
||||
|
||||
.catalog-compare-doc__legend {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 12px 20px;
|
||||
font-size: 0.88rem;
|
||||
color: var(--soft-ink);
|
||||
}
|
||||
|
||||
.catalog-compare-doc__table-wrap {
|
||||
overflow-x: auto;
|
||||
margin-top: 12px;
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 12px;
|
||||
background: var(--paper);
|
||||
}
|
||||
|
||||
.catalog-compare-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
font-size: 0.82rem;
|
||||
line-height: 1.45;
|
||||
|
||||
th,
|
||||
td {
|
||||
padding: 10px 12px;
|
||||
border-bottom: 1px solid var(--line);
|
||||
vertical-align: top;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
thead th {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
background: var(--card-bg);
|
||||
font-family: var(--mono);
|
||||
font-size: 0.62rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.05em;
|
||||
text-transform: uppercase;
|
||||
color: var(--muted);
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
tbody th[scope="row"] {
|
||||
font-weight: 600;
|
||||
color: var(--ink);
|
||||
min-width: 10rem;
|
||||
}
|
||||
|
||||
&__caption {
|
||||
padding: 12px 14px;
|
||||
text-align: left;
|
||||
font-size: 0.8rem;
|
||||
color: var(--muted);
|
||||
caption-side: top;
|
||||
}
|
||||
|
||||
&__chapter a {
|
||||
color: var(--accent);
|
||||
text-decoration: none;
|
||||
|
||||
&:hover,
|
||||
&:focus-visible {
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
|
||||
&__cell {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
.catalog-compare-cell {
|
||||
display: inline-block;
|
||||
min-width: 2.25rem;
|
||||
padding: 2px 6px;
|
||||
border-radius: 4px;
|
||||
font-family: var(--mono);
|
||||
font-size: 0.62rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.04em;
|
||||
text-transform: uppercase;
|
||||
|
||||
&--core {
|
||||
color: var(--badge-foundation-fg);
|
||||
background: var(--badge-foundation-bg);
|
||||
border: 1px solid var(--badge-foundation-border);
|
||||
}
|
||||
|
||||
&--ext {
|
||||
color: var(--badge-dse-fg);
|
||||
background: var(--badge-dse-bg);
|
||||
border: 1px solid var(--badge-dse-border);
|
||||
}
|
||||
|
||||
&--rel {
|
||||
color: var(--badge-ib-fg);
|
||||
background: var(--badge-ib-bg);
|
||||
border: 1px solid var(--badge-ib-border);
|
||||
}
|
||||
|
||||
&--none {
|
||||
color: var(--muted);
|
||||
background: transparent;
|
||||
}
|
||||
}
|
||||
|
||||
.catalog-compare-doc__refs {
|
||||
margin: 12px 0 0;
|
||||
padding-left: 1.25rem;
|
||||
line-height: 1.6;
|
||||
|
||||
a {
|
||||
color: var(--accent);
|
||||
}
|
||||
}
|
||||
|
||||
.catalog-compare-doc__updated {
|
||||
margin: 20px 0 0;
|
||||
font-size: 0.85rem;
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Responsive
|
||||
// -----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
@import "tokens";
|
||||
@import "particle-background";
|
||||
@import "grain";
|
||||
// @import "grain";
|
||||
@import "layout";
|
||||
@import "components";
|
||||
@import "why-sections";
|
||||
|
|
|
|||
|
|
@ -40,5 +40,9 @@
|
|||
</div>
|
||||
</noscript>
|
||||
|
||||
<template id="catalog-compare-template" hidden>
|
||||
{% include "partials/math-curricula-compare.html" %}
|
||||
</template>
|
||||
|
||||
<div id="catalog-app" class="catalog-page"></div>
|
||||
{% endblock content %}
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ content/{subject}/{slug}/ → live page (one folder)
|
|||
<ul>
|
||||
<li><strong>List</strong> — numbered cards; live chapters link from the whole card.</li>
|
||||
<li><strong>Map</strong> (<code>?view=tree</code>) — Mermaid map with strand columns; live chapters link from the <strong>title</strong> only (<code>→</code> + hover underline).</li>
|
||||
<li><strong>Compare</strong> (<code>?view=compare</code>, Mathematics only) — curricula comparison doc (HTML partial, not JSON).</li>
|
||||
<li>Curriculum names (DSE, IB, …) appear <strong>only in the catalog</strong>, never inside lesson prose.</li>
|
||||
<li>Every chapter needs a <code>description</code> (1–2 sentences; map clamps to three lines).</li>
|
||||
</ul>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,240 @@
|
|||
{# Requires math_catalog in parent template scope #}
|
||||
<div class="catalog-compare-doc__inner book-prose">
|
||||
<p class="catalog-compare-doc__lead">
|
||||
Open Free Books maps chapters to popular school and exam frameworks worldwide. This page summarises
|
||||
how those curricula differ in philosophy and pacing, and how our catalog chapters align. Curriculum
|
||||
labels appear only here and in catalog filters — not inside lesson pages.
|
||||
</p>
|
||||
|
||||
<section class="catalog-compare-doc__section" aria-labelledby="compare-legend">
|
||||
<h2 id="compare-legend" class="catalog-compare-doc__heading">Legend</h2>
|
||||
<ul class="catalog-compare-doc__legend">
|
||||
<li><span class="catalog-compare-cell catalog-compare-cell--core">core</span> — explicit unit in that framework at this level</li>
|
||||
<li><span class="catalog-compare-cell catalog-compare-cell--ext">ext</span> — extension, elective, or higher tier only</li>
|
||||
<li><span class="catalog-compare-cell catalog-compare-cell--rel">rel</span> — related supporting topic, not a named syllabus unit</li>
|
||||
<li><span class="catalog-compare-cell catalog-compare-cell--none">—</span> — not mapped for this chapter</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section class="catalog-compare-doc__section" aria-labelledby="compare-frameworks">
|
||||
<h2 id="compare-frameworks" class="catalog-compare-doc__heading">Framework comparison</h2>
|
||||
<div class="catalog-compare-doc__table-wrap">
|
||||
<table class="catalog-compare-table catalog-compare-table--frameworks">
|
||||
<caption class="catalog-compare-table__caption">
|
||||
Philosophy, pacing, and distinguishing features across frameworks covered in our research.
|
||||
</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Dimension</th>
|
||||
<th scope="col">Foundation (OFB)</th>
|
||||
<th scope="col">DSE / HKDSE</th>
|
||||
<th scope="col">IGCSE</th>
|
||||
<th scope="col">A-Level</th>
|
||||
<th scope="col">AP (US)</th>
|
||||
<th scope="col">IB AA</th>
|
||||
<th scope="col">IB AI</th>
|
||||
<th scope="col">Common Core</th>
|
||||
<th scope="col">Singapore</th>
|
||||
<th scope="col">UK GCSE</th>
|
||||
<th scope="col">Gaokao</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th scope="row">Philosophy</th>
|
||||
<td>Prerequisite-first bridge from arithmetic to secondary topics; CPA-friendly sequencing.</td>
|
||||
<td>Exam-focused compulsory syllabus (S4–S6); applied contexts in Number & Algebra.</td>
|
||||
<td>Cambridge international; broad Number, Algebra, Geometry, Statistics.</td>
|
||||
<td>Two-year depth in Pure, Statistics, Mechanics; proof and abstraction.</td>
|
||||
<td>Elective acceleration; AP Calculus AB/BC in Grade 12 for many students.</td>
|
||||
<td>Pure, theoretical; proofs, calculus, abstract reasoning for STEM.</td>
|
||||
<td>Applied modelling; statistics, technology, real-world interpretation.</td>
|
||||
<td>Conceptual understanding + mathematical practices across K–12.</td>
|
||||
<td>Mastery; “teach less, learn more”; CPA and bar models.</td>
|
||||
<td>Key Stages; mandatory GCSE at 16; tiered papers.</td>
|
||||
<td>National entrance exam; extreme rigour and time pressure.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">Pacing</th>
|
||||
<td>Split integers vs rationals/proportion before synthesis chapter.</td>
|
||||
<td>Compulsory part bundles secondary algebra after junior foundation.</td>
|
||||
<td>Linear progression to IGCSE at ~16.</td>
|
||||
<td>Slower two-year HL/AL build than single-year AP calculus.</td>
|
||||
<td>Algebra I → Geometry → Algebra II; calculus optional via AP.</td>
|
||||
<td>SL/HL tracks; AA emphasises theory.</td>
|
||||
<td>SL/HL tracks; AI emphasises data and modelling.</td>
|
||||
<td>More topics per year than Singapore; grade-level benchmarks.</td>
|
||||
<td>Deep focus on fewer topics per level.</td>
|
||||
<td>KS3 then GCSE; optional A-Level.</td>
|
||||
<td>Integrated secondary syllabus toward one high-stakes exam.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">Distinctive focus</th>
|
||||
<td>Explicit graph prerequisites; global labels in catalog only.</td>
|
||||
<td>Three strands: Number & Algebra, Measures/Shape/Space, Data Handling.</td>
|
||||
<td>International portability; strong algebra and trig base.</td>
|
||||
<td>Complex numbers, induction, mechanics optional components.</td>
|
||||
<td>Standardised AP exams; college credit pathway.</td>
|
||||
<td>Formal proofs and advanced calculus preparation.</td>
|
||||
<td>Calculator-forward statistics and function modelling.</td>
|
||||
<td>Reasoning, modelling, precision in standards.</td>
|
||||
<td>Number bonds, mental strategies, visualisation.</td>
|
||||
<td>Tiered foundation/higher GCSE content.</td>
|
||||
<td>Multi-step synthesis under exam conditions.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="catalog-compare-doc__section" aria-labelledby="compare-elaboration">
|
||||
<h2 id="compare-elaboration" class="catalog-compare-doc__heading">Framework notes</h2>
|
||||
|
||||
<h3 class="catalog-compare-doc__subheading">Foundation (Open Free Books)</h3>
|
||||
<p>
|
||||
Our Foundation track is not a national syllabus — it is the pre-secondary path in this catalog.
|
||||
Research on middle-years progression (integers, rational numbers, proportion) showed a gap between
|
||||
whole-number written calculation and secondary “directed numbers & rates” work. Five planned
|
||||
chapters now sit in the prerequisite graph before the live synthesis chapter.
|
||||
</p>
|
||||
|
||||
<h3 class="catalog-compare-doc__subheading">Hong Kong DSE (compulsory)</h3>
|
||||
<p>
|
||||
The HKDSE compulsory mathematics curriculum organises secondary topics into Number & Algebra,
|
||||
Measures, Shape and Space, and Data Handling. Our chapter graph and strand layout follow that shape
|
||||
while remaining usable for learners outside Hong Kong.
|
||||
</p>
|
||||
|
||||
<h3 class="catalog-compare-doc__subheading">Singapore Mathematics</h3>
|
||||
<p>
|
||||
Emphasises mastery through the Concrete–Pictorial–Abstract sequence, number bonds, and bar modelling.
|
||||
Fewer topics per year, deeper fluency — a useful contrast to broader spiral systems.
|
||||
</p>
|
||||
|
||||
<h3 class="catalog-compare-doc__subheading">Common Core (United States)</h3>
|
||||
<p>
|
||||
Shifts K–12 toward conceptual understanding and mathematical practices (reasoning, modelling,
|
||||
precision). High school often follows Algebra I, Geometry, Algebra II; calculus is commonly via AP
|
||||
rather than mandated in the core standards.
|
||||
</p>
|
||||
|
||||
<h3 class="catalog-compare-doc__subheading">IGCSE, GCSE, A-Level (UK / Cambridge)</h3>
|
||||
<p>
|
||||
GCSE and IGCSE provide broad 14–16 coverage; A-Level allows two years for pure mathematics,
|
||||
statistics, and mechanics — generally more time for abstraction than a single-year AP calculus course.
|
||||
</p>
|
||||
|
||||
<h3 class="catalog-compare-doc__subheading">International Baccalaureate</h3>
|
||||
<p>
|
||||
Students choose Analysis & Approaches (theory, proofs, calculus) or Applications &
|
||||
Interpretation (statistics, modelling, technology). The catalog uses one <code>IB</code> filter chip;
|
||||
this page separates AA and AI for comparison.
|
||||
</p>
|
||||
|
||||
<h3 class="catalog-compare-doc__subheading">Gaokao (China)</h3>
|
||||
<p>
|
||||
The national college entrance mathematics paper integrates advanced algebra, calculus, probability,
|
||||
and coordinate geometry under high-stakes time limits — typically more synthesis per item than many
|
||||
Western school-leaving exams.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section class="catalog-compare-doc__section" aria-labelledby="compare-chapters">
|
||||
<h2 id="compare-chapters" class="catalog-compare-doc__heading">Chapter coverage</h2>
|
||||
<p>
|
||||
Each cell comes from <code>curriculumCoverage</code> in
|
||||
<code>math-curriculum.json</code> (per-framework <code>core</code>,
|
||||
<code>extension</code>, or <code>related</code>). Catalog filter chips still match any
|
||||
framework with a non-empty mapping. List and map badges show framework labels only.
|
||||
</p>
|
||||
<div class="catalog-compare-doc__table-wrap">
|
||||
<table class="catalog-compare-table catalog-compare-table--chapters">
|
||||
<caption class="catalog-compare-table__caption">
|
||||
Open Free Books mathematics chapters vs catalog curriculum labels.
|
||||
</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">Chapter</th>
|
||||
<th scope="col">Foundation</th>
|
||||
<th scope="col">DSE</th>
|
||||
<th scope="col">IGCSE</th>
|
||||
<th scope="col">A-Level</th>
|
||||
<th scope="col">AP</th>
|
||||
<th scope="col">IB</th>
|
||||
<th scope="col">Common Core</th>
|
||||
<th scope="col">Singapore</th>
|
||||
<th scope="col">UK GCSE</th>
|
||||
<th scope="col">Gaokao</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for strand in math_catalog.strands %}
|
||||
{% for chapter in strand.chapters %}
|
||||
<tr>
|
||||
<th scope="row" class="catalog-compare-table__chapter">
|
||||
{% if chapter.status == "live" %}
|
||||
<a href="{{ get_url(path='/math/' ~ chapter.slug ~ '/') | safe }}">{{ chapter.title }}</a>
|
||||
{% else %}
|
||||
{{ chapter.title }}
|
||||
{% endif %}
|
||||
</th>
|
||||
{% for col in ["Foundation", "DSE", "IGCSE", "A-Level", "AP", "IB", "Common Core", "Singapore", "UK GCSE", "Gaokao"] %}
|
||||
<td class="catalog-compare-table__cell">
|
||||
{% set role = chapter.curriculumCoverage[col] | default(value="") %}
|
||||
{% if role == "core" %}
|
||||
<span class="catalog-compare-cell catalog-compare-cell--core" title="Core topic in this framework">core</span>
|
||||
{% elif role == "extension" %}
|
||||
<span class="catalog-compare-cell catalog-compare-cell--ext" title="Extension, elective, or higher tier only">ext</span>
|
||||
{% elif role == "related" %}
|
||||
<span class="catalog-compare-cell catalog-compare-cell--rel" title="Related supporting topic, not a named unit">rel</span>
|
||||
{% else %}
|
||||
<span class="catalog-compare-cell catalog-compare-cell--none" aria-label="Not mapped">—</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="catalog-compare-doc__section" aria-labelledby="compare-references">
|
||||
<h2 id="compare-references" class="catalog-compare-doc__heading">References</h2>
|
||||
<p>Official and secondary sources used when mapping frameworks (verify links periodically).</p>
|
||||
<ul class="catalog-compare-doc__refs">
|
||||
<li>
|
||||
<a href="https://www.hkeaa.edu.hk/en/hkdse/assessment/subject_information_category.html" rel="noopener noreferrer">HKEAA — HKDSE subject information</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://www.cambridgeinternational.org/programmes-and-qualifications/cambridge-igcse-mathematics-0580/" rel="noopener noreferrer">Cambridge International — IGCSE Mathematics (0580)</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://www.cambridgeinternational.org/programmes-and-qualifications/cambridge-international-as-and-a-level-mathematics-9709/" rel="noopener noreferrer">Cambridge International — A Level Mathematics (9709)</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://apstudents.collegeboard.org/courses/ap-calculus-ab" rel="noopener noreferrer">College Board — AP Calculus AB</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://www.ibo.org/programmes/diploma-programme/curriculum/mathematics/" rel="noopener noreferrer">IBO — Diploma Programme mathematics</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://www.thecorestandards.org/Math/" rel="noopener noreferrer">Common Core State Standards — Mathematics</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://www.moe.gov.sg/primary/mathematics" rel="noopener noreferrer">Singapore MOE — Primary mathematics</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://www.gov.uk/government/collections/national-curriculum" rel="noopener noreferrer">UK Government — National curriculum</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://www.guruforu.com/blog/math/math-curriculum-global-guide" rel="noopener noreferrer">Global curriculum overview (guruforu.com)</a>
|
||||
</li>
|
||||
</ul>
|
||||
<p class="catalog-compare-doc__updated">
|
||||
Research notes migrated from project curriculum gap analysis (2025–2026). Graph prerequisites follow
|
||||
integer / rational / proportion scaffolding before the live directed-numbers synthesis chapter.
|
||||
</p>
|
||||
</section>
|
||||
</div>
|
||||
Loading…
Add table
Add a link
Reference in a new issue