Skip to content

Commit 0f20809

Browse files
fiji-flocaugner
andauthored
feat(curriculum): add numbers to modules and fixes (#10805)
* feat(curriculum): add numbers to modules and fixes This resolves: - MP-948 Supporting numbers in the titles - MP 949 Make sure to use modules instead of module - MP-971 Add the group label on module pages - #10734 and #10719 Makeing the whole module card a link - Steamline one of the dark background colors * change break point for module header + note color * Update build/curriculum.ts Co-authored-by: Claas Augner <[email protected]> --------- Co-authored-by: Claas Augner <[email protected]>
1 parent 456d1c6 commit 0f20809

18 files changed

+113
-83
lines changed

Diff for: build/curriculum.ts

+12-10
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ async function readCurriculumPage(
191191
const raw = await fs.readFile(file, "utf-8");
192192
const { attributes, body: rawBody } = frontmatter<CurriculumFrontmatter>(raw);
193193
const filename = file.replace(CURRICULUM_ROOT, "").replace(/^\/?/, "");
194-
let title = rawBody.match(/^[\w\n]*#+(.*\n)/)[1]?.trim() || "";
194+
const title = rawBody.match(/^[\w\n]*#+(.*\n)/)[1]?.trim() || "";
195195
const body = rawBody.replace(/^[\w\n]*#+(.*\n)/, "");
196196

197197
const slug = fileToSlug(file);
@@ -202,6 +202,7 @@ async function readCurriculumPage(
202202

203203
let modules: CurriculumIndexEntry[];
204204
let prevNext: PrevNext;
205+
let group: string;
205206
if (!options?.forIndex) {
206207
if (attributes.template === Template.Landing) {
207208
modules = (await buildCurriculumIndex())?.filter(
@@ -220,11 +221,12 @@ async function readCurriculumPage(
220221

221222
sidebar = await buildCurriculumSidebar();
222223
parents = await buildParents(url);
223-
} else {
224-
title = title
225-
.replace(/^\d+\s+/, "") // Strip number prefix.
226-
.replace(/ modules$/, "") // Strip "modules" suffix.
227-
.replace(/Extension \d+:/, ""); // Strip "Extension" prefix.
224+
if (parents.length > 1) {
225+
const title = parents.at(-2)?.title;
226+
if (title?.endsWith(" modules")) {
227+
group = title;
228+
}
229+
}
228230
}
229231

230232
return {
@@ -237,6 +239,7 @@ async function readCurriculumPage(
237239
modules,
238240
parents,
239241
prevNext,
242+
group,
240243
...attributes,
241244
},
242245
body,
@@ -284,7 +287,7 @@ export async function buildCurriculumPage(
284287
$("[data-token]").removeAttr("data-token");
285288
$("[data-flaw-src]").removeAttr("data-flaw-src");
286289

287-
doc.title = metadata.title.replace(/^\d+\s+/, "");
290+
doc.title = metadata.title;
288291
doc.mdn_url = document.url;
289292
doc.locale = metadata.locale;
290293
doc.native = LANGUAGES_RAW[DEFAULT_LOCALE]?.native;
@@ -323,14 +326,13 @@ export async function buildCurriculumPage(
323326
: CURRICULUM_TITLE;
324327

325328
doc.noIndexing = false;
326-
doc.toc = makeTOC(doc, true).map(({ text, id }) => {
327-
return { text: text.replace(/^[\d.]+\s+/, ""), id };
328-
});
329+
doc.toc = makeTOC(doc, true);
329330
doc.sidebar = metadata.sidebar;
330331
doc.modules = metadata.modules;
331332
doc.prevNext = metadata.prevNext;
332333
doc.parents = metadata.parents;
333334
doc.topic = metadata.topic;
335+
doc.group = metadata.group;
334336

335337
return doc as CurriculumDoc;
336338
}

Diff for: client/src/assets/icons/curriculum-about-covered.svg

+1-1
Loading

Diff for: client/src/assets/icons/curriculum-about-detail.svg

+1-1
Loading

Diff for: client/src/assets/icons/curriculum-about-educators.svg

+1-1
Loading

Diff for: client/src/assets/icons/curriculum-about-not.svg

+1-1
Loading

Diff for: client/src/assets/icons/curriculum-about-students.svg

+1-1
Loading

Diff for: client/src/assets/icons/curriculum-bullet.svg

+1-1
Loading

Diff for: client/src/assets/icons/curriculum-landing-about-beginner.svg

+1-1
Loading

Diff for: client/src/assets/icons/curriculum-landing-about-free.svg

+1-1
Loading

Diff for: client/src/assets/icons/curriculum-landing-about-pace.svg

+1-1
Loading

Diff for: client/src/assets/icons/curriculum-mdn-resource.svg

+1-1
Loading

Diff for: client/src/curriculum/module.scss

+24-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,16 @@
55
> header {
66
column-gap: 1.5rem;
77
display: grid;
8-
grid-template-areas: "icon heading" "icon category";
8+
grid-template-areas:
9+
". group"
10+
"icon heading"
11+
"icon category";
912
justify-content: flex-start;
13+
@media screen and (min-width: $screen-md) {
14+
grid-template-areas:
15+
"icon heading group"
16+
"icon category .";
17+
}
1018

1119
.topic-icon {
1220
--background-primary: var(--curriculum-bg-color-topic);
@@ -21,7 +29,7 @@
2129
}
2230
}
2331

24-
p {
32+
p.module-topic {
2533
color: var(--curriculum-color-topic);
2634
font-size: var(--type-smaller-font-size);
2735
grid-area: category;
@@ -32,6 +40,20 @@
3240
content: "Category: ";
3341
}
3442
}
43+
44+
p.module-group {
45+
align-self: center;
46+
background-color: var(--curriculum-module-label-bg-color);
47+
border-radius: var(--elem-radius);
48+
color: var(--curriculum-module-label-color);
49+
font-size: var(--type-smaller-font-size);
50+
grid-area: group;
51+
height: max-content;
52+
margin: 0;
53+
margin-bottom: 0.25rem;
54+
padding: 0.125rem 0.5rem;
55+
width: fit-content;
56+
}
3557
}
3658

3759
p.curriculum-resources {

Diff for: client/src/curriculum/module.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ export function CurriculumModule(props: HydrationData<any, CurriculumDoc>) {
1919
<header>
2020
{doc?.topic && <TopicIcon topic={doc?.topic} />}
2121
<h1>{doc?.title}</h1>
22-
{doc?.topic && <p>{doc?.topic}</p>}
22+
{doc?.topic && <p className="module-topic">{doc.topic}</p>}
23+
{doc?.group && <p className="module-group">{doc.group}</p>}
2324
</header>
2425
<RenderCurriculumBody doc={doc} />
2526
<PrevNext doc={doc} />

Diff for: client/src/curriculum/modules-list.scss

+44-47
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,6 @@
127127
}
128128

129129
ol.modules-list {
130-
container-name: module-list;
131-
container-type: inline-size;
132130
display: grid;
133131
flex-wrap: wrap;
134132
gap: 1rem;
@@ -148,41 +146,40 @@
148146
}
149147

150148
li.module-list-item {
151-
background-color: var(--curriculum-bg-color-list-item-body);
152-
border: 1px solid var(--curriculum-border-color-list-item);
153-
border-radius: var(--elem-radius);
154-
box-shadow: var(--curriculum-shadow);
155-
display: flex;
156-
flex-direction: column;
157-
justify-self: center;
158-
max-width: 20rem;
159-
min-width: 15rem;
160-
overflow: auto;
161-
padding: 0;
162-
scroll-snap-align: center;
163-
width: 100%;
149+
display: block;
164150

165-
@media screen and (min-width: $screen-md) {
166-
min-width: initial;
167-
}
151+
> a {
152+
background-color: var(--curriculum-bg-color-list-item-body);
153+
border: 1px solid var(--curriculum-border-color-list-item);
154+
border-radius: var(--elem-radius);
155+
box-shadow: var(--curriculum-shadow);
156+
display: flex;
157+
flex-direction: column;
158+
justify-self: center;
159+
max-width: 20rem;
160+
min-width: 15rem;
161+
overflow: auto;
162+
padding: 0;
163+
scroll-snap-align: center;
164+
text-decoration: none;
165+
width: 100%;
166+
167+
&:hover {
168+
border-color: var(--curriculum-border-color-list-item-hover);
169+
text-decoration: none;
170+
}
168171

169-
&:hover {
170-
border-color: var(--curriculum-border-color-list-item-hover);
171-
}
172+
@media screen and (min-width: $screen-md) {
173+
min-width: initial;
174+
}
172175

173-
> header {
174-
a {
176+
> header {
175177
align-items: center;
176178
background-color: var(--curriculum-bg-color-list-item-header);
177179
display: flex;
178180
flex-direction: column;
179181
height: 10rem;
180-
padding: 1rem 2rem;
181-
text-decoration: none;
182-
183-
&:hover {
184-
text-decoration: underline;
185-
}
182+
padding: 1rem;
186183

187184
svg.topic-icon {
188185
height: 4rem;
@@ -204,26 +201,26 @@
204201
text-align: center;
205202
}
206203
}
207-
}
208204

209-
> section {
210-
align-items: center;
211-
display: flex;
212-
flex-direction: column;
213-
font-size: var(--type-smaller-font-size);
214-
height: 11rem;
215-
justify-content: space-between;
216-
padding: 1rem 1.5rem;
217-
218-
p {
219-
color: var(--text-secondary);
220-
margin: 0;
221-
text-align: center;
222-
}
205+
> section {
206+
align-items: center;
207+
display: flex;
208+
flex-direction: column;
209+
font-size: var(--type-smaller-font-size);
210+
height: 11rem;
211+
justify-content: space-between;
212+
padding: 1rem 1.5rem;
213+
214+
p {
215+
color: var(--text-secondary);
216+
margin: 0;
217+
text-align: center;
218+
}
223219

224-
p:last-child {
225-
color: var(--curriculum-color-topic);
226-
font-weight: 600;
220+
p:last-child {
221+
color: var(--curriculum-color-topic);
222+
font-weight: 600;
223+
}
227224
}
228225
}
229226
}

Diff for: client/src/curriculum/modules-list.tsx

+11-9
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ export function ModulesListList({
2929
checked={i === tab}
3030
onChange={() => setTab(i)}
3131
/>
32-
<label htmlFor={`module-${i}`}>{modulesList.title}</label>
32+
<label htmlFor={`module-${i}`}>
33+
{modulesList.title.replace(/ modules$/, "")}
34+
</label>
3335
{modulesList.children?.length && (
3436
<>
3537
<ModulesList modules={modulesList.children} />
@@ -59,16 +61,16 @@ export function ModulesList({ modules }: { modules: CurriculumIndexEntry[] }) {
5961
key={`ml-${j}`}
6062
className={`module-list-item topic-${topic2css(module.topic)}`}
6163
>
62-
<header>
63-
<a href={module.url}>
64+
<a href={module.url}>
65+
<header>
6466
{module.topic && <TopicIcon topic={module.topic} />}
6567
<span>{module.title}</span>
66-
</a>
67-
</header>
68-
<section>
69-
<p>{module.summary}</p>
70-
<p>{module.topic}</p>
71-
</section>
68+
</header>
69+
<section>
70+
<p>{module.summary}</p>
71+
<p>{module.topic}</p>
72+
</section>
73+
</a>
7274
</li>
7375
);
7476
})}

Diff for: client/src/curriculum/sidebar.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@ export function Sidebar({
2828
entry.url === current
2929
}
3030
>
31-
<summary>{entry.title} module</summary>
31+
<summary>{entry.title}</summary>
3232
<ol>
3333
<li>
3434
<SidebarLink
3535
current={current}
3636
url={entry.url}
37-
title={`${entry.title} overview`}
37+
title={`${entry.title.replace(/ modules$/, "")} overview`}
3838
/>
3939
</li>
4040
{entry.children.map((subEntry, j) => {

0 commit comments

Comments
 (0)