Remove English curriculum content and associated styles: Deleted the English curriculum files, including the main index, reading comprehension foundations, and related styles. Updated catalog JSON to remove references to English chapters and contributors, ensuring a clean slate for future curriculum updates.

This commit is contained in:
Hananoshika Yomaru 2026-05-21 10:10:13 -07:00
parent 81c6614722
commit f28ad660dd
13 changed files with 452 additions and 280 deletions

View file

@ -1,5 +0,0 @@
+++
title = "English"
description = "Browse English chapters in the curriculum catalog."
sort_by = "weight"
+++

View file

@ -1,60 +0,0 @@
+++
title = "Reading comprehension foundations"
description = "Find the main idea, key details, and evidence in short texts."
template = "chapter.html"
weight = 1
[extra]
subject = "english"
chapter_id = "reading-comprehension-foundations"
strand = "Reading & Writing Foundations"
+++
<div class="book-prose">
<p>
Reading comprehension means understanding what a text says directly and what it suggests
indirectly. In this chapter you will practice spotting the
<span class="english-key-term">main idea</span>, finding
<span class="english-key-term">supporting details</span>, and selecting
<span class="english-key-term">text evidence</span>.
</p>
<h2 id="main-idea" class="book-prose__heading">Main idea and key details</h2>
<p>
The <strong>main idea</strong> is the most important message in a paragraph or passage.
<strong>Key details</strong> are specific facts or examples that support that message.
</p>
<div class="book-callout" role="note">
<p class="book-callout__label">Quick strategy</p>
<p>
Ask: “If I had to summarize this paragraph in one sentence, what would I say?” Then check
which details in the text prove your sentence.
</p>
</div>
<h2 id="evidence" class="book-prose__heading">Use evidence, not guesses</h2>
<p>
Good answers point to exact words or phrases in the passage. You can quote directly or
paraphrase, but your answer should always connect back to the text.
</p>
<details class="book-question">
<summary class="book-question__prompt">Checkpoint: main idea</summary>
<div class="book-question__solution">
<p>
Read this sentence: “After weeks of practice, the choir finally sang in harmony during the
final rehearsal.” What is the main idea, and which words are the strongest evidence?
</p>
</div>
</details>
<details class="book-question">
<summary class="book-question__prompt">Checkpoint: evidence</summary>
<div class="book-question__solution">
<p>
A student writes: “The character is brave.” Improve this answer by adding one short quote
from the text and explaining how that quote proves bravery.
</p>
</div>
</details>
</div>

View file

@ -1,49 +0,0 @@
<div class="book-prose">
<p>
Reading comprehension means understanding what a text says directly and what it suggests
indirectly. In this chapter you will practice spotting the
<span class="english-key-term">main idea</span>, finding
<span class="english-key-term">supporting details</span>, and selecting
<span class="english-key-term">text evidence</span>.
</p>
<h2 id="main-idea" class="book-prose__heading">Main idea and key details</h2>
<p>
The <strong>main idea</strong> is the most important message in a paragraph or passage.
<strong>Key details</strong> are specific facts or examples that support that message.
</p>
<div class="book-callout" role="note">
<p class="book-callout__label">Quick strategy</p>
<p>
Ask: “If I had to summarize this paragraph in one sentence, what would I say?” Then check
which details in the text prove your sentence.
</p>
</div>
<h2 id="evidence" class="book-prose__heading">Use evidence, not guesses</h2>
<p>
Good answers point to exact words or phrases in the passage. You can quote directly or
paraphrase, but your answer should always connect back to the text.
</p>
<details class="book-question">
<summary class="book-question__prompt">Checkpoint: main idea</summary>
<div class="book-question__solution">
<p>
Read this sentence: “After weeks of practice, the choir finally sang in harmony during the
final rehearsal.” What is the main idea, and which words are the strongest evidence?
</p>
</div>
</details>
<details class="book-question">
<summary class="book-question__prompt">Checkpoint: evidence</summary>
<div class="book-question__solution">
<p>
A student writes: “The character is brave.” Improve this answer by adding one short quote
from the text and explaining how that quote proves bravery.
</p>
</div>
</details>
</div>

View file

@ -1,10 +0,0 @@
// Shared styles for English chapters.
// Keep chapter-specific rules in each chapter folder's chapter.scss.
.english-key-term {
padding: 0.05rem 0.32rem;
border-radius: 4px;
background: color-mix(in srgb, var(--accent) 12%, transparent);
font-family: var(--mono);
font-size: 0.85em;
}

View file

@ -3,9 +3,36 @@
"subtitle": "Browse chapters by subject and curriculum",
"curriculums": ["Foundation", "DSE", "IB", "A-Level", "AP", "IGCSE", "Common Core"],
"subjects": [
{ "id": "math", "name": "Mathematics", "banner": "/catalog/banners/math.webp" },
{ "id": "english", "name": "English" },
{ "id": "physics", "name": "Physics", "banner": "/catalog/banners/physics.jpg" },
{
"id": "math",
"name": "Mathematics",
"banner": "/catalog/banners/math.webp",
"contributors": [
{
"id": "man-lung-yeung",
"name": "Man Lung Yeung",
"avatar": "/contributors/manlung.png",
"job_title": "EdTech specialist / software engineer",
"education": "BEng in Computer Science (HKUST) + BBA (HKUST)",
"contributions": ["Project Creator", "Math textbook", "Physics textbook"]
}
]
},
{
"id": "physics",
"name": "Physics",
"banner": "/catalog/banners/physics.jpg",
"contributors": [
{
"id": "man-lung-yeung",
"name": "Man Lung Yeung",
"avatar": "/contributors/manlung.png",
"job_title": "EdTech specialist / software engineer",
"education": "BEng in Computer Science (HKUST) + BBA (HKUST)",
"contributions": ["Project Creator", "Math textbook", "Physics textbook"]
}
]
},
{ "id": "science", "name": "Science" },
{ "id": "humanities", "name": "Humanities" },
{ "id": "computing", "name": "Computing" }

View file

@ -34,11 +34,21 @@ export type CatalogGraph = {
edges: CatalogGraphEdge[];
};
export type CatalogSubjectContributor = {
id: string;
name: string;
avatar: string;
job_title?: string;
education?: string;
contributions?: string[];
};
export type CatalogSubject = {
id: string;
name: string;
/** Root-relative URL, e.g. /catalog/banners/math.webp */
banner?: string;
contributors?: CatalogSubjectContributor[];
strands: CatalogStrand[];
graph?: CatalogGraph;
};

View file

@ -1,39 +0,0 @@
{
"title": "English",
"intro": "Build reading, writing, speaking, and analysis skills through progressive chapter pathways.",
"graph": {
"edges": []
},
"strands": [
{
"id": "reading-writing-foundations",
"title": "Reading & Writing Foundations",
"chapters": [
{
"slug": "reading-comprehension-foundations",
"title": "Reading comprehension foundations",
"description": "Find main ideas, supporting details, and text evidence in short passages.",
"status": "live",
"curriculumCoverage": {
"Foundation": "core",
"IGCSE": "core",
"Common Core": "core",
"IB": "related"
}
},
{
"slug": "paragraph-writing-basics",
"title": "Paragraph writing basics",
"description": "Write focused paragraphs with a clear topic sentence, evidence, and explanation.",
"status": "planned",
"curriculumCoverage": {
"Foundation": "core",
"IGCSE": "core",
"Common Core": "core",
"IB": "related"
}
}
]
}
]
}

View file

@ -8,6 +8,7 @@ import type {
CatalogChapter,
CatalogData,
CatalogStrand,
CatalogSubjectContributor,
CatalogSubject,
CatalogViewMode,
} from "../../../data/catalog.types";
@ -33,6 +34,7 @@ function normalizeChapter(chapter: CatalogChapter): CatalogChapter {
function normalizeSubject(subject: CatalogSubject): CatalogSubject {
return {
...subject,
contributors: subject.contributors ?? [],
strands: (subject.strands ?? []).map((strand) => ({
...strand,
chapters: (strand.chapters ?? []).map(normalizeChapter),
@ -94,6 +96,20 @@ function syncUrl(subjectId: string, viewMode: CatalogViewMode) {
window.history.replaceState(null, "", url);
}
function openDialogById(id: string) {
const dialog = document.getElementById(id);
if (dialog instanceof HTMLDialogElement) {
dialog.showModal();
}
}
function closeDialogById(id: string) {
const dialog = document.getElementById(id);
if (dialog instanceof HTMLDialogElement) {
dialog.close();
}
}
export function CatalogApp() {
const data = readCatalogData();
if (!data) {
@ -141,6 +157,37 @@ export function CatalogApp() {
return `Showing ${count} ${filterText} chapter${count === 1 ? "" : "s"}`;
});
const subjectContributors = createMemo<CatalogSubjectContributor[]>(
() => currentSubject()?.contributors ?? []
);
const contributorsPickerDialogId = createMemo(
() => `catalog-contributors-picker-dialog-${currentSubjectId()}`
);
const contributorDialogId = (contributorId: string) =>
`catalog-contributor-dialog-${currentSubjectId()}-${contributorId}`;
const openContributorsPickerDialog = () => {
openDialogById(contributorsPickerDialogId());
};
const openContributorDialog = (contributorId: string) => {
openDialogById(contributorDialogId(contributorId));
};
const openContributorFromPicker = (contributorId: string) => {
closeDialogById(contributorsPickerDialogId());
openDialogById(contributorDialogId(contributorId));
};
const closeContributorsDialogOnBackdrop = (event: MouseEvent) => {
if (!(event.currentTarget instanceof HTMLDialogElement)) return;
if (event.target === event.currentTarget) {
event.currentTarget.close();
}
};
const selectSubject = (subjectId: string) => {
if (subjectId !== "math" && viewMode() === "compare") {
setViewMode("linear");
@ -244,6 +291,151 @@ export function CatalogApp() {
<div class="catalog-header__intro">
<h1 class="catalog-header__title">{currentSubject()?.name ?? "Catalog"}</h1>
<p class="catalog-header__stats">{statsLabel()}</p>
<Show when={subjectContributors().length > 0}>
<div class="catalog-subject-contributors">
<ul
class="catalog-avatar-group"
role="list"
aria-label={`${currentSubject()?.name ?? "Subject"} contributors`}
>
<For each={subjectContributors()}>
{(person) => (
<li class="catalog-avatar-group__item">
<button
type="button"
class="catalog-avatar-group__button"
aria-label={`View contributor: ${person.name}`}
aria-haspopup="dialog"
aria-controls={contributorDialogId(person.id)}
onClick={() => openContributorDialog(person.id)}
>
<img
src={person.avatar}
alt={person.name}
width={36}
height={36}
loading="lazy"
decoding="async"
/>
</button>
</li>
)}
</For>
</ul>
<button
type="button"
class="catalog-subject-contributors__info"
aria-haspopup="dialog"
aria-controls={contributorsPickerDialogId()}
onClick={openContributorsPickerDialog}
>
Contributors
</button>
<dialog
id={contributorsPickerDialogId()}
class="contributor-dialog catalog-contributors-dialog"
onClick={closeContributorsDialogOnBackdrop}
>
<form
method="dialog"
class="contributor-dialog-panel catalog-contributors-dialog__panel"
>
<button
type="submit"
class="contributor-dialog-close"
aria-label="Close contributors dialog"
>
×
</button>
<div class="contributor-dialog-header">
<h2 class="catalog-contributors-dialog__title">
{currentSubject()?.name} contributors
</h2>
</div>
<div class="catalog-contributors-dialog__contributions">
<span class="contributor-meta-label">Contributors</span>
<ul class="catalog-contributors-dialog__list" role="list">
<For each={subjectContributors()}>
{(person) => (
<li>
<button
type="button"
class="catalog-contributors-dialog__item"
aria-controls={contributorDialogId(person.id)}
onClick={() => openContributorFromPicker(person.id)}
>
<img
class="catalog-contributors-dialog__avatar"
src={person.avatar}
alt=""
width={40}
height={40}
loading="lazy"
decoding="async"
/>
<span>{person.name}</span>
</button>
</li>
)}
</For>
</ul>
</div>
<div class="contributor-dialog-connect" />
</form>
</dialog>
<For each={subjectContributors()}>
{(person) => (
<dialog
id={contributorDialogId(person.id)}
class="contributor-dialog catalog-contributors-dialog"
onClick={closeContributorsDialogOnBackdrop}
>
<form method="dialog" class="contributor-dialog-panel">
<button
type="submit"
class="contributor-dialog-close"
aria-label={`Close ${person.name} dialog`}
>
×
</button>
<div class="contributor-dialog-header">
<img
class="contributor-dialog-avatar"
src={person.avatar}
alt=""
width={80}
height={80}
decoding="async"
/>
<div class="contributor-dialog-identity">
<h2 class="contributor-dialog-name">{person.name}</h2>
<Show when={person.job_title}>
<p class="contributor-dialog-job">{person.job_title}</p>
</Show>
</div>
</div>
<Show when={person.education}>
<p class="contributor-dialog-meta">
<span class="contributor-meta-label">Education</span>
{person.education}
</p>
</Show>
<Show when={person.contributions && person.contributions.length > 0}>
<div class="contributor-dialog-contributions">
<span class="contributor-meta-label">Contributes</span>
<ul class="contributor-contribution-list" role="list">
<For each={person.contributions}>
{(item) => <li>{item}</li>}
</For>
</ul>
</div>
</Show>
</form>
</dialog>
)}
</For>
</div>
</Show>
</div>
<div class="catalog-view-toggle" role="tablist" aria-label="Chapter layout">
<button

View file

@ -4,119 +4,119 @@
<title>Open Free Books</title>
<link>https://openfreebooks.org/</link>
<description>Recent updates to Open Free Books pages and live chapters.</description>
<lastBuildDate>Thu, 21 May 2026 16:43:43 GMT</lastBuildDate>
<lastBuildDate>Thu, 21 May 2026 16:54:30 GMT</lastBuildDate>
<item>
<title>Loci</title>
<link>https://openfreebooks.org/math/loci/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/loci/</guid>
<pubDate>Thu, 21 May 2026 16:43:43 GMT</pubDate>
<description>Describe and construct loci in the plane, linking geometric constraints to algebraic equations.</description>
<title>Advanced trigonometry</title>
<link>https://openfreebooks.org/math/advanced-trigonometry/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/advanced-trigonometry/</guid>
<pubDate>Thu, 21 May 2026 16:54:30 GMT</pubDate>
<description>Use sine and cosine rules, radians, and trigonometric graphs in 2D and 3D applications.</description>
</item>
<item>
<title>Basic probability</title>
<link>https://openfreebooks.org/math/basic-probability/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/basic-probability/</guid>
<pubDate>Thu, 21 May 2026 16:54:30 GMT</pubDate>
<description>Calculate theoretical and experimental probabilities for simple events and complements.</description>
</item>
<item>
<title>Properties of circles</title>
<link>https://openfreebooks.org/math/circle-properties/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/circle-properties/</guid>
<pubDate>Thu, 21 May 2026 16:54:30 GMT</pubDate>
<description>Apply chord, tangent, and angle theorems in circles to prove results and solve geometry problems.</description>
</item>
<item>
<title>Congruence &amp; similarity</title>
<link>https://openfreebooks.org/math/congruence-similarity/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/congruence-similarity/</guid>
<pubDate>Thu, 21 May 2026 16:54:30 GMT</pubDate>
<description>Apply congruence and similarity criteria to justify properties of triangles and scale figures.</description>
</item>
<item>
<title>Coordinate geometry of circles</title>
<link>https://openfreebooks.org/math/coordinate-circles/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/coordinate-circles/</guid>
<pubDate>Thu, 21 May 2026 16:54:30 GMT</pubDate>
<description>Find equations of circles, tangents, and intersections using coordinate methods and distance.</description>
</item>
<item>
<title>Coordinate geometry foundations</title>
<link>https://openfreebooks.org/math/coordinate-geometry-foundations/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/coordinate-geometry-foundations/</guid>
<pubDate>Thu, 21 May 2026 16:54:30 GMT</pubDate>
<description>Plot points, find distances and midpoints, and work with slopes of lines in the Cartesian plane.</description>
</item>
<item>
<title>Deductive geometry</title>
<link>https://openfreebooks.org/math/deductive-geometry/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/deductive-geometry/</guid>
<pubDate>Thu, 21 May 2026 16:54:30 GMT</pubDate>
<description>Prove angle and side relationships for intersecting lines, triangles, and polygons.</description>
</item>
<item>
<title>Introduction to trigonometry</title>
<link>https://openfreebooks.org/math/introduction-trigonometry/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/introduction-trigonometry/</guid>
<pubDate>Thu, 21 May 2026 16:43:43 GMT</pubDate>
<pubDate>Thu, 21 May 2026 16:54:30 GMT</pubDate>
<description>Define sine, cosine, and tangent ratios and solve right-angled triangle problems.</description>
</item>
<item>
<title>Permutations, combinations &amp; probability</title>
<link>https://openfreebooks.org/math/permutations-combinations-probability/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/permutations-combinations-probability/</guid>
<pubDate>Thu, 21 May 2026 16:43:43 GMT</pubDate>
<description>Count outcomes with permutations and combinations, then compute probabilities in finite sample spaces.</description>
<title>Loci</title>
<link>https://openfreebooks.org/math/loci/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/loci/</guid>
<pubDate>Thu, 21 May 2026 16:54:30 GMT</pubDate>
<description>Describe and construct loci in the plane, linking geometric constraints to algebraic equations.</description>
</item>
<item>
<title>Measures of dispersion</title>
<link>https://openfreebooks.org/math/measures-dispersion/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/measures-dispersion/</guid>
<pubDate>Thu, 21 May 2026 16:54:30 GMT</pubDate>
<description>Interpret range, interquartile range, variance, and standard deviation for comparing data sets.</description>
</item>
<item>
<title>Mensuration in 3D</title>
<link>https://openfreebooks.org/math/mensuration-3d/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/mensuration-3d/</guid>
<pubDate>Thu, 21 May 2026 16:43:43 GMT</pubDate>
<pubDate>Thu, 21 May 2026 16:54:30 GMT</pubDate>
<description>Find volumes and surface areas of prisms, cylinders, pyramids, cones, and spheres.</description>
</item>
<item>
<title>Normal distribution &amp; z-scores</title>
<link>https://openfreebooks.org/math/normal-distribution-z-scores/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/normal-distribution-z-scores/</guid>
<pubDate>Thu, 21 May 2026 16:43:43 GMT</pubDate>
<pubDate>Thu, 21 May 2026 16:54:30 GMT</pubDate>
<description>Model continuous data with the normal curve, standardise with z-scores, and read probabilities from tables.</description>
</item>
<item>
<title>Coordinate geometry foundations</title>
<link>https://openfreebooks.org/math/coordinate-geometry-foundations/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/coordinate-geometry-foundations/</guid>
<pubDate>Thu, 21 May 2026 16:43:43 GMT</pubDate>
<description>Plot points, find distances and midpoints, and work with slopes of lines in the Cartesian plane.</description>
<title>Permutations, combinations &amp; probability</title>
<link>https://openfreebooks.org/math/permutations-combinations-probability/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/permutations-combinations-probability/</guid>
<pubDate>Thu, 21 May 2026 16:54:30 GMT</pubDate>
<description>Count outcomes with permutations and combinations, then compute probabilities in finite sample spaces.</description>
</item>
<item>
<title>Measures of dispersion</title>
<link>https://openfreebooks.org/math/measures-dispersion/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/measures-dispersion/</guid>
<pubDate>Thu, 21 May 2026 16:43:43 GMT</pubDate>
<description>Interpret range, interquartile range, variance, and standard deviation for comparing data sets.</description>
</item>
<item>
<title>Advanced trigonometry</title>
<link>https://openfreebooks.org/math/advanced-trigonometry/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/advanced-trigonometry/</guid>
<pubDate>Thu, 21 May 2026 16:43:43 GMT</pubDate>
<description>Use sine and cosine rules, radians, and trigonometric graphs in 2D and 3D applications.</description>
</item>
<item>
<title>Properties of circles</title>
<link>https://openfreebooks.org/math/circle-properties/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/circle-properties/</guid>
<pubDate>Thu, 21 May 2026 16:43:43 GMT</pubDate>
<description>Apply chord, tangent, and angle theorems in circles to prove results and solve geometry problems.</description>
</item>
<item>
<title>Deductive geometry</title>
<link>https://openfreebooks.org/math/deductive-geometry/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/deductive-geometry/</guid>
<pubDate>Thu, 21 May 2026 16:43:43 GMT</pubDate>
<description>Prove angle and side relationships for intersecting lines, triangles, and polygons.</description>
</item>
<item>
<title>Coordinate geometry of circles</title>
<link>https://openfreebooks.org/math/coordinate-circles/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/coordinate-circles/</guid>
<pubDate>Thu, 21 May 2026 16:43:43 GMT</pubDate>
<description>Find equations of circles, tangents, and intersections using coordinate methods and distance.</description>
</item>
<item>
<title>Basic probability</title>
<link>https://openfreebooks.org/math/basic-probability/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/basic-probability/</guid>
<pubDate>Thu, 21 May 2026 16:43:43 GMT</pubDate>
<description>Calculate theoretical and experimental probabilities for simple events and complements.</description>
<title>Pythagoras&apos; theorem</title>
<link>https://openfreebooks.org/math/pythagoras-theorem/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/pythagoras-theorem/</guid>
<pubDate>Thu, 21 May 2026 16:54:30 GMT</pubDate>
<description>Use Pythagoras&apos; theorem and its converse in 2D problems and coordinate settings.</description>
</item>
<item>
<title>Charts &amp; averages</title>
<link>https://openfreebooks.org/math/statistical-charts-averages/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/statistical-charts-averages/</guid>
<pubDate>Thu, 21 May 2026 16:43:43 GMT</pubDate>
<pubDate>Thu, 21 May 2026 16:54:30 GMT</pubDate>
<description>Organise data with tables and charts and calculate mean, median, and mode.</description>
</item>
<item>
<title>Statistical literacy</title>
<link>https://openfreebooks.org/math/statistical-literacy/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/statistical-literacy/</guid>
<pubDate>Thu, 21 May 2026 16:43:43 GMT</pubDate>
<pubDate>Thu, 21 May 2026 16:54:30 GMT</pubDate>
<description>Evaluate claims in media and research: sampling bias, correlation versus causation, and misleading charts.</description>
</item>
<item>
<title>Congruence &amp; similarity</title>
<link>https://openfreebooks.org/math/congruence-similarity/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/congruence-similarity/</guid>
<pubDate>Thu, 21 May 2026 16:43:43 GMT</pubDate>
<description>Apply congruence and similarity criteria to justify properties of triangles and scale figures.</description>
</item>
<item>
<title>Pythagoras&apos; theorem</title>
<link>https://openfreebooks.org/math/pythagoras-theorem/</link>
<guid isPermaLink="true">https://openfreebooks.org/math/pythagoras-theorem/</guid>
<pubDate>Thu, 21 May 2026 16:43:43 GMT</pubDate>
<description>Use Pythagoras&apos; theorem and its converse in 2D problems and coordinate settings.</description>
</item>
<item>
<title>Complex numbers</title>
<link>https://openfreebooks.org/math/complex-numbers/</link>
@ -201,20 +201,6 @@
<pubDate>Thu, 21 May 2026 05:05:38 GMT</pubDate>
<description>Add, subtract, multiply, and divide whole numbers using vertical written form: align columns, regroup, and read the result.</description>
</item>
<item>
<title>English</title>
<link>https://openfreebooks.org/english/</link>
<guid isPermaLink="true">https://openfreebooks.org/english/</guid>
<pubDate>Thu, 21 May 2026 02:10:55 GMT</pubDate>
<description>Browse English chapters in the curriculum catalog.</description>
</item>
<item>
<title>Reading comprehension foundations</title>
<link>https://openfreebooks.org/english/reading-comprehension-foundations/</link>
<guid isPermaLink="true">https://openfreebooks.org/english/reading-comprehension-foundations/</guid>
<pubDate>Thu, 21 May 2026 02:10:55 GMT</pubDate>
<description>Find the main idea, key details, and evidence in short texts.</description>
</item>
<item>
<title>FAQ</title>
<link>https://openfreebooks.org/faq/</link>

View file

@ -20,14 +20,6 @@
<loc>https://openfreebooks.org/credits/</loc>
<lastmod>2026-05-19T05:33:20.000Z</lastmod>
</url>
<url>
<loc>https://openfreebooks.org/english/</loc>
<lastmod>2026-05-21T02:10:55.000Z</lastmod>
</url>
<url>
<loc>https://openfreebooks.org/english/reading-comprehension-foundations/</loc>
<lastmod>2026-05-21T02:10:55.000Z</lastmod>
</url>
<url>
<loc>https://openfreebooks.org/faq/</loc>
<lastmod>2026-05-21T02:10:55.000Z</lastmod>
@ -38,7 +30,7 @@
</url>
<url>
<loc>https://openfreebooks.org/math/advanced-trigonometry/</loc>
<lastmod>2026-05-21T16:43:43.537Z</lastmod>
<lastmod>2026-05-21T16:54:30.000Z</lastmod>
</url>
<url>
<loc>https://openfreebooks.org/math/algebraic-fractions-formulas/</loc>
@ -50,11 +42,11 @@
</url>
<url>
<loc>https://openfreebooks.org/math/basic-probability/</loc>
<lastmod>2026-05-21T16:43:43.535Z</lastmod>
<lastmod>2026-05-21T16:54:30.000Z</lastmod>
</url>
<url>
<loc>https://openfreebooks.org/math/circle-properties/</loc>
<lastmod>2026-05-21T16:43:43.537Z</lastmod>
<lastmod>2026-05-21T16:54:30.000Z</lastmod>
</url>
<url>
<loc>https://openfreebooks.org/math/complex-numbers/</loc>
@ -62,15 +54,15 @@
</url>
<url>
<loc>https://openfreebooks.org/math/congruence-similarity/</loc>
<lastmod>2026-05-21T16:43:43.137Z</lastmod>
<lastmod>2026-05-21T16:54:30.000Z</lastmod>
</url>
<url>
<loc>https://openfreebooks.org/math/coordinate-circles/</loc>
<lastmod>2026-05-21T16:43:43.536Z</lastmod>
<lastmod>2026-05-21T16:54:30.000Z</lastmod>
</url>
<url>
<loc>https://openfreebooks.org/math/coordinate-geometry-foundations/</loc>
<lastmod>2026-05-21T16:43:43.663Z</lastmod>
<lastmod>2026-05-21T16:54:30.000Z</lastmod>
</url>
<url>
<loc>https://openfreebooks.org/math/counting-and-numbers/</loc>
@ -78,7 +70,7 @@
</url>
<url>
<loc>https://openfreebooks.org/math/deductive-geometry/</loc>
<lastmod>2026-05-21T16:43:43.537Z</lastmod>
<lastmod>2026-05-21T16:54:30.000Z</lastmod>
</url>
<url>
<loc>https://openfreebooks.org/math/directed-numbers-rates/</loc>
@ -98,7 +90,7 @@
</url>
<url>
<loc>https://openfreebooks.org/math/introduction-trigonometry/</loc>
<lastmod>2026-05-21T16:43:43.931Z</lastmod>
<lastmod>2026-05-21T16:54:30.000Z</lastmod>
</url>
<url>
<loc>https://openfreebooks.org/math/laws-of-indices/</loc>
@ -118,23 +110,23 @@
</url>
<url>
<loc>https://openfreebooks.org/math/loci/</loc>
<lastmod>2026-05-21T16:43:43.932Z</lastmod>
<lastmod>2026-05-21T16:54:30.000Z</lastmod>
</url>
<url>
<loc>https://openfreebooks.org/math/measures-dispersion/</loc>
<lastmod>2026-05-21T16:43:43.662Z</lastmod>
<lastmod>2026-05-21T16:54:30.000Z</lastmod>
</url>
<url>
<loc>https://openfreebooks.org/math/mensuration-3d/</loc>
<lastmod>2026-05-21T16:43:43.798Z</lastmod>
<lastmod>2026-05-21T16:54:30.000Z</lastmod>
</url>
<url>
<loc>https://openfreebooks.org/math/normal-distribution-z-scores/</loc>
<lastmod>2026-05-21T16:43:43.798Z</lastmod>
<lastmod>2026-05-21T16:54:30.000Z</lastmod>
</url>
<url>
<loc>https://openfreebooks.org/math/permutations-combinations-probability/</loc>
<lastmod>2026-05-21T16:43:43.799Z</lastmod>
<lastmod>2026-05-21T16:54:30.000Z</lastmod>
</url>
<url>
<loc>https://openfreebooks.org/math/polynomials-expansion-factorisation/</loc>
@ -146,7 +138,7 @@
</url>
<url>
<loc>https://openfreebooks.org/math/pythagoras-theorem/</loc>
<lastmod>2026-05-21T16:43:43.137Z</lastmod>
<lastmod>2026-05-21T16:54:30.000Z</lastmod>
</url>
<url>
<loc>https://openfreebooks.org/math/quadratic-equations/</loc>
@ -158,11 +150,11 @@
</url>
<url>
<loc>https://openfreebooks.org/math/statistical-charts-averages/</loc>
<lastmod>2026-05-21T16:43:43.394Z</lastmod>
<lastmod>2026-05-21T16:54:30.000Z</lastmod>
</url>
<url>
<loc>https://openfreebooks.org/math/statistical-literacy/</loc>
<lastmod>2026-05-21T16:43:43.394Z</lastmod>
<lastmod>2026-05-21T16:54:30.000Z</lastmod>
</url>
<url>
<loc>https://openfreebooks.org/math/variations/</loc>

View file

@ -265,6 +265,120 @@
color: var(--muted);
}
.catalog-subject-contributors {
display: flex;
align-items: center;
gap: 10px;
}
.catalog-avatar-group {
display: inline-flex;
align-items: center;
margin: 0;
padding: 0;
list-style: none;
}
.catalog-avatar-group__item {
width: 36px;
height: 36px;
margin-left: -8px;
border: 2px solid var(--card-bg);
border-radius: 50%;
overflow: hidden;
background: var(--card-bg);
box-shadow: 0 2px 8px var(--shadow-soft);
&:first-child {
margin-left: 0;
}
img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}
}
.catalog-avatar-group__button {
display: block;
width: 100%;
height: 100%;
border: none;
padding: 0;
background: transparent;
cursor: pointer;
}
.catalog-subject-contributors__info {
display: none;
padding: 6px 10px;
border: 1px solid var(--line);
border-radius: 999px;
background: var(--paper);
color: var(--ink);
font-size: 0.82rem;
font-weight: 600;
cursor: pointer;
}
.catalog-contributors-dialog {
max-width: min(92vw, 420px);
}
.catalog-contributors-dialog__title {
margin: 0;
font-size: clamp(1.1rem, 2vw, 1.35rem);
font-family: var(--font-heading);
font-weight: 400;
line-height: 1.25;
}
.catalog-contributors-dialog__contributions {
margin: 0 0 14px;
color: var(--soft-ink);
font-size: 0.98rem;
line-height: 1.65;
}
.catalog-contributors-dialog__list {
margin: 8px 0 0;
padding: 0;
list-style: none;
display: grid;
gap: 10px;
}
.catalog-contributors-dialog__item {
display: flex;
align-items: center;
gap: 10px;
width: 100%;
border: 1px solid var(--line);
border-radius: 10px;
padding: 8px 10px;
color: var(--ink);
background: transparent;
text-align: left;
cursor: pointer;
}
.catalog-contributors-dialog__item:hover,
.catalog-contributors-dialog__item:focus-visible {
border-color: var(--accent);
background: var(--paper);
outline: none;
}
.catalog-contributors-dialog__avatar {
display: block;
border-radius: 50%;
object-fit: cover;
border: 1px solid var(--card-border);
background: var(--paper);
}
.catalog-view-toggle {
display: inline-flex;
align-self: flex-end;
@ -1311,6 +1425,16 @@ a.catalog-chapter-card {
align-items: flex-start;
}
.catalog-avatar-group {
display: none;
}
.catalog-subject-contributors__info {
display: inline-flex;
align-items: center;
justify-content: center;
}
.catalog-view-toggle {
align-self: stretch;
width: 100%;

View file

@ -65,6 +65,9 @@
</nav>
</div>
</footer>
<section style="position:absolute;left:-9999px;opacity:0;pointer-events:none;" aria-hidden="true">
Site maintained by Man Lung Yeung &mdash; contact: <a href="mailto:manlung.yeung@outlook.com">manlung.yeung@outlook.com</a>
</section>
<script type="module" src="{{ get_url(path='js/bundle.js', trailing_slash=false) | safe }}"></script>
<pagefind-modal reset-on-close></pagefind-modal>

View file

@ -19,7 +19,8 @@
{
"id": {{ subject.id | json_encode() | safe }},
"name": {{ subject.name | json_encode() | safe }}{% if subject.banner %},
"banner": {{ subject.banner | json_encode() | safe }}{% endif %},
"banner": {{ subject.banner | json_encode() | safe }}{% endif %}{% if subject.contributors %},
"contributors": {{ subject.contributors | json_encode() | safe }}{% endif %},
"strands": {{ subject_curriculum.strands | default(value=[]) | json_encode() | safe }}{% if subject_curriculum.graph %},
"graph": {{ subject_curriculum.graph | json_encode() | safe }}{% endif %}
}{% if not loop.last %},{% endif %}