diff --git a/assets/scss/custom.scss b/assets/scss/custom.scss
index 29a7f0e4b6e..c9b12c94e0f 100644
--- a/assets/scss/custom.scss
+++ b/assets/scss/custom.scss
@@ -623,6 +623,103 @@
color: #1264ab;
}
+/* ---- Lesson plans (data/lesson_plans.json) ----
+ One green marks lesson-plan sets everywhere: the dot on sub-cluster headers,
+ cluster stats and sidebar entries, the filter chip, and the teaching-materials strip. */
+$lp-green: #2f6b4f;
+
+.lp-dot {
+ display: inline-block;
+ width: 0.5rem;
+ height: 0.5rem;
+ border-radius: 50%;
+ background: $lp-green;
+ margin-left: 0.35rem;
+ vertical-align: 0.05em;
+ flex-shrink: 0;
+}
+.cluster-stats .lp-dot { margin-left: 0; width: 0.45rem; height: 0.45rem; }
+/* Sidebar sub-cluster: dot sits beside the reference count so it never wraps onto its own line */
+.cluster-nav-subs .badge .lp-dot { margin: 0 0.35rem 0 0; vertical-align: 0; }
+
+.lp-strip {
+ background: #fff;
+ border: 1px solid rgba(0,0,0,0.08);
+ border-left: 4px solid $lp-green;
+ border-radius: 4px;
+ padding: 0.45rem 0.7rem 0.4rem;
+ margin: 0.15rem 0 0.55rem;
+}
+/* Set topic, shown only when it differs from the sub-cluster it sits under (data: "heading") */
+.lp-strip__heading { text-transform: none; letter-spacing: 0; }
+.lp-strip__label {
+ display: block;
+ font-size: 0.58rem;
+ font-weight: 700;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ color: $lp-green;
+ margin-bottom: 0.25rem;
+}
+.lp-strip__chips {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.3rem;
+ margin-bottom: 0.3rem;
+}
+.lp-chip {
+ font-size: 0.7rem;
+ font-weight: 600;
+ color: #333;
+ background: rgba($lp-green,0.07);
+ border: 1px solid rgba($lp-green,0.2);
+ border-radius: 3px;
+ padding: 0.12rem 0.45rem;
+ max-width: 100%;
+ overflow-wrap: anywhere;
+}
+.lp-chip__formats {
+ font-weight: 400;
+ color: #777;
+}
+.lp-chip a {
+ color: $lp-green;
+ font-weight: 600;
+ text-decoration: underline;
+ text-decoration-color: rgba($lp-green,0.35);
+ text-underline-offset: 2px;
+}
+.lp-chip a:hover { color: #1f4a36; text-decoration-color: currentColor; }
+.lp-strip__meta {
+ font-size: 0.62rem;
+ line-height: 1.45;
+ color: #777;
+ margin: 0;
+}
+.lp-strip__meta a { color: #555; text-decoration: underline; text-decoration-color: rgba(0,0,0,0.25); }
+.lp-strip__meta a:hover { color: $lp-green; }
+
+/* Lesson-plan filter: a .fr-specificity-toggle checkbox whose label includes the dot */
+.lp-filter-toggle .lp-dot { margin: 0 0.2rem 0 0; }
+
+/* Lesson-plan filter on (.lp-filter-on set by featured-resources.js): hide everything without a set */
+.lp-filter-on .cluster-section:not([data-lp]),
+.lp-filter-on .acc-section:not([data-lp]),
+.lp-filter-on .cluster-nav-group:not([data-lp]),
+.lp-filter-on .cluster-nav-subs .nav-item:not([data-lp]) {
+ display: none;
+}
+/* Remaining sub-clusters lose their visible neighbour, so drop the divider on the first one shown */
+.lp-filter-on .acc-section[data-lp] { border-top: 0; }
+.lp-filter-on .acc-section[data-lp] ~ .acc-section[data-lp] { border-top: 1px solid rgba(0,0,0,0.06); }
+.lp-filter-empty { display: none; }
+.lp-filter-on .lp-filter-empty {
+ display: block;
+ font-size: 0.8rem;
+ color: #666;
+ padding: 1rem 0;
+}
+
/* ---- Publication list ---- */
.publication-list {
padding-left: 1.5rem;
@@ -2175,7 +2272,7 @@ h1.clusters-site-heading.clusters-hub-page__title {
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
- align-items: flex-start;
+ align-items: center;
margin-bottom: 0.75rem;
padding: 0.65rem 0.75rem;
background: rgba(255,255,255,0.5);
@@ -2228,6 +2325,7 @@ h1.clusters-site-heading.clusters-hub-page__title {
display: flex;
align-items: center;
gap: 0.3rem;
+ margin: 0; /* Bootstrap gives a bottom margin, which lifts it off the button row */
font-size: 0.68rem;
color: #666;
cursor: pointer;
diff --git a/data/lesson_plans.json b/data/lesson_plans.json
new file mode 100644
index 00000000000..63a6b3431d8
--- /dev/null
+++ b/data/lesson_plans.json
@@ -0,0 +1,542 @@
+{
+ "sets": {
+ "2": {
+ "questionable-measurement-practices-qmps-validity-reliability-issues": {
+ "title": "Questionable measurement practices (QMPs), validity, and reliability",
+ "record": "https://zenodo.org/records/23090874",
+ "doi": "10.5281/zenodo.23090874",
+ "creators": [
+ "Hakile Resulbegoviq"
+ ],
+ "reviewers": [
+ "Ognjen Bobičić",
+ "Dhruv Aggarwal"
+ ],
+ "files": [
+ {
+ "label": "Slides",
+ "url": "https://zenodo.org/records/23090874/files/questionable-measurement-practices-slides.pptx?download=1",
+ "format": "PPTX"
+ },
+ {
+ "label": "Slides",
+ "url": "https://zenodo.org/records/23090874/files/questionable-measurement-practices-slides.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L1",
+ "url": "https://zenodo.org/records/23090874/files/questionable-measurement-practices-lesson-plan-L1.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L1",
+ "url": "https://zenodo.org/records/23090874/files/questionable-measurement-practices-lesson-plan-L1.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L2",
+ "url": "https://zenodo.org/records/23090874/files/questionable-measurement-practices-lesson-plan-L2.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L2",
+ "url": "https://zenodo.org/records/23090874/files/questionable-measurement-practices-lesson-plan-L2.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L3",
+ "url": "https://zenodo.org/records/23090874/files/questionable-measurement-practices-lesson-plan-L3.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L3",
+ "url": "https://zenodo.org/records/23090874/files/questionable-measurement-practices-lesson-plan-L3.pdf?download=1",
+ "format": "PDF"
+ }
+ ]
+ },
+ "research-design-sampling-methods-its-implications-for-inferences": {
+ "title": "Research design, sampling methods, and their implications for inferences",
+ "record": "https://zenodo.org/records/23090924",
+ "doi": "10.5281/zenodo.23090924",
+ "creators": [
+ "Carolina Natel"
+ ],
+ "reviewers": [
+ "Lukas Röseler",
+ "Yijing Wang"
+ ],
+ "files": [
+ {
+ "label": "Slides",
+ "url": "https://zenodo.org/records/23090924/files/research-design-sampling-slides.pptx?download=1",
+ "format": "PPTX"
+ },
+ {
+ "label": "Slides",
+ "url": "https://zenodo.org/records/23090924/files/research-design-sampling-slides.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L1",
+ "url": "https://zenodo.org/records/23090924/files/research-design-sampling-lesson-plan-L1.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L1",
+ "url": "https://zenodo.org/records/23090924/files/research-design-sampling-lesson-plan-L1.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L2",
+ "url": "https://zenodo.org/records/23090924/files/research-design-sampling-lesson-plan-L2.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L2",
+ "url": "https://zenodo.org/records/23090924/files/research-design-sampling-lesson-plan-L2.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L3",
+ "url": "https://zenodo.org/records/23090924/files/research-design-sampling-lesson-plan-L3.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L3",
+ "url": "https://zenodo.org/records/23090924/files/research-design-sampling-lesson-plan-L3.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Anticipation guide (activity slides)",
+ "url": "https://zenodo.org/records/23090924/files/research-design-sampling-anticipation-guide.pptx?download=1",
+ "format": "PPTX"
+ },
+ {
+ "label": "Anticipation guide (activity slides)",
+ "url": "https://zenodo.org/records/23090924/files/research-design-sampling-anticipation-guide.pdf?download=1",
+ "format": "PDF"
+ }
+ ]
+ }
+ },
+ "3": {
+ "participatory-research": {
+ "title": "Participatory research",
+ "record": "https://zenodo.org/records/23090886",
+ "doi": "10.5281/zenodo.23090886",
+ "creators": [
+ "Angelos Konstantinidis"
+ ],
+ "reviewers": [
+ "Pablo Ezequiel Flores Kanter",
+ "Sarah Siddiqui"
+ ],
+ "files": [
+ {
+ "label": "Slides",
+ "url": "https://zenodo.org/records/23090886/files/participatory-research-slides.pptx?download=1",
+ "format": "PPTX"
+ },
+ {
+ "label": "Slides",
+ "url": "https://zenodo.org/records/23090886/files/participatory-research-slides.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L1",
+ "url": "https://zenodo.org/records/23090886/files/participatory-research-lesson-plan-L1.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L1",
+ "url": "https://zenodo.org/records/23090886/files/participatory-research-lesson-plan-L1.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L2",
+ "url": "https://zenodo.org/records/23090886/files/participatory-research-lesson-plan-L2.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L2",
+ "url": "https://zenodo.org/records/23090886/files/participatory-research-lesson-plan-L2.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L3a",
+ "url": "https://zenodo.org/records/23090886/files/participatory-research-lesson-plan-L3a.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L3a",
+ "url": "https://zenodo.org/records/23090886/files/participatory-research-lesson-plan-L3a.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L3b",
+ "url": "https://zenodo.org/records/23090886/files/participatory-research-lesson-plan-L3b.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L3b",
+ "url": "https://zenodo.org/records/23090886/files/participatory-research-lesson-plan-L3b.pdf?download=1",
+ "format": "PDF"
+ }
+ ]
+ }
+ },
+ "5": {
+ "computational-reproducibility": {
+ "title": "Computational reproducibility",
+ "record": "https://zenodo.org/records/23090928",
+ "doi": "10.5281/zenodo.23090928",
+ "creators": [
+ "Sofia Pelica"
+ ],
+ "reviewers": [
+ "Leticia R. Micheli",
+ "Federica Stablum",
+ "Flavio Azevedo"
+ ],
+ "files": [
+ {
+ "label": "Slides",
+ "url": "https://zenodo.org/records/23090928/files/computational-reproducibility-slides.pptx?download=1",
+ "format": "PPTX"
+ },
+ {
+ "label": "Slides",
+ "url": "https://zenodo.org/records/23090928/files/computational-reproducibility-slides.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L1",
+ "url": "https://zenodo.org/records/23090928/files/computational-reproducibility-lesson-plan-L1.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L1",
+ "url": "https://zenodo.org/records/23090928/files/computational-reproducibility-lesson-plan-L1.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L2",
+ "url": "https://zenodo.org/records/23090928/files/computational-reproducibility-lesson-plan-L2.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L2",
+ "url": "https://zenodo.org/records/23090928/files/computational-reproducibility-lesson-plan-L2.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L3",
+ "url": "https://zenodo.org/records/23090928/files/computational-reproducibility-lesson-plan-L3.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L3",
+ "url": "https://zenodo.org/records/23090928/files/computational-reproducibility-lesson-plan-L3.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "L1 materials: activity slides, handouts, R and Quarto scripts, example data",
+ "url": "https://zenodo.org/records/23090928/files/computational-reproducibility-lesson-plan-L1-materials.zip?download=1",
+ "format": "ZIP"
+ },
+ {
+ "label": "L2 materials: exercises with solutions, handouts, example data",
+ "url": "https://zenodo.org/records/23090928/files/computational-reproducibility-lesson-plan-L2-materials.zip?download=1",
+ "format": "ZIP"
+ },
+ {
+ "label": "L3 materials: example script and data",
+ "url": "https://zenodo.org/records/23090928/files/computational-reproducibility-lesson-plan-L3-materials.zip?download=1",
+ "format": "ZIP"
+ }
+ ]
+ }
+ },
+ "7": {
+ "open-peer-review": {
+ "title": "Open peer review",
+ "record": "https://zenodo.org/records/23090930",
+ "doi": "10.5281/zenodo.23090930",
+ "creators": [
+ "Ebuka Ezeike"
+ ],
+ "reviewers": [
+ "Palmer Smith",
+ "Ognjen Bobičić"
+ ],
+ "files": [
+ {
+ "label": "Slides",
+ "url": "https://zenodo.org/records/23090930/files/open-peer-review-slides.pptx?download=1",
+ "format": "PPTX"
+ },
+ {
+ "label": "Slides",
+ "url": "https://zenodo.org/records/23090930/files/open-peer-review-slides.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L1",
+ "url": "https://zenodo.org/records/23090930/files/open-peer-review-lesson-plan-L1.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L1",
+ "url": "https://zenodo.org/records/23090930/files/open-peer-review-lesson-plan-L1.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L2",
+ "url": "https://zenodo.org/records/23090930/files/open-peer-review-lesson-plan-L2.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L2",
+ "url": "https://zenodo.org/records/23090930/files/open-peer-review-lesson-plan-L2.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L3",
+ "url": "https://zenodo.org/records/23090930/files/open-peer-review-lesson-plan-L3.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L3",
+ "url": "https://zenodo.org/records/23090930/files/open-peer-review-lesson-plan-L3.pdf?download=1",
+ "format": "PDF"
+ }
+ ]
+ },
+ "preprints-and-postprints": {
+ "title": "Preprints and postprints",
+ "record": "https://zenodo.org/records/23090894",
+ "doi": "10.5281/zenodo.23090894",
+ "creators": [
+ "Femi Qudus Arogundade"
+ ],
+ "reviewers": [
+ "Lukas Röseler",
+ "Palmer Smith"
+ ],
+ "files": [
+ {
+ "label": "Slides",
+ "url": "https://zenodo.org/records/23090894/files/preprints-postprints-slides.pptx?download=1",
+ "format": "PPTX"
+ },
+ {
+ "label": "Slides",
+ "url": "https://zenodo.org/records/23090894/files/preprints-postprints-slides.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L1",
+ "url": "https://zenodo.org/records/23090894/files/preprints-postprints-lesson-plan-L1.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L1",
+ "url": "https://zenodo.org/records/23090894/files/preprints-postprints-lesson-plan-L1.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L2",
+ "url": "https://zenodo.org/records/23090894/files/preprints-postprints-lesson-plan-L2.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L2",
+ "url": "https://zenodo.org/records/23090894/files/preprints-postprints-lesson-plan-L2.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L3",
+ "url": "https://zenodo.org/records/23090894/files/preprints-postprints-lesson-plan-L3.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L3",
+ "url": "https://zenodo.org/records/23090894/files/preprints-postprints-lesson-plan-L3.pdf?download=1",
+ "format": "PDF"
+ }
+ ]
+ },
+ "why-open-access": {
+ "title": "Why open access?",
+ "record": "https://zenodo.org/records/23090861",
+ "doi": "10.5281/zenodo.23090861",
+ "creators": [
+ "Ognjen Bobičić"
+ ],
+ "reviewers": [
+ "Ebuka Ezeike",
+ "Dhruv Aggarwal"
+ ],
+ "files": [
+ {
+ "label": "Slides",
+ "url": "https://zenodo.org/records/23090861/files/why-open-access-slides.pptx?download=1",
+ "format": "PPTX"
+ },
+ {
+ "label": "Slides",
+ "url": "https://zenodo.org/records/23090861/files/why-open-access-slides.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L1",
+ "url": "https://zenodo.org/records/23090861/files/why-open-access-lesson-plan-L1.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L1",
+ "url": "https://zenodo.org/records/23090861/files/why-open-access-lesson-plan-L1.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L2",
+ "url": "https://zenodo.org/records/23090861/files/why-open-access-lesson-plan-L2.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L2",
+ "url": "https://zenodo.org/records/23090861/files/why-open-access-lesson-plan-L2.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L3",
+ "url": "https://zenodo.org/records/23090861/files/why-open-access-lesson-plan-L3.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L3",
+ "url": "https://zenodo.org/records/23090861/files/why-open-access-lesson-plan-L3.pdf?download=1",
+ "format": "PDF"
+ }
+ ]
+ }
+ },
+ "9": {
+ "accessibility": {
+ "title": "Accessibility in research",
+ "record": "https://zenodo.org/records/23090899",
+ "doi": "10.5281/zenodo.23090899",
+ "creators": [
+ "Roksana Sobolak"
+ ],
+ "reviewers": [
+ "Leticia R. Micheli",
+ "Federica Stablum"
+ ],
+ "files": [
+ {
+ "label": "Slides",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-slides.pptx?download=1",
+ "format": "PPTX"
+ },
+ {
+ "label": "Slides",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-slides.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L1",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-lesson-plan-L1.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L1",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-lesson-plan-L1.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L2",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-lesson-plan-L2.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L2",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-lesson-plan-L2.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "Lesson plan L3",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-lesson-plan-L3.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "Lesson plan L3",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-lesson-plan-L3.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "L1 activity: accessibility barriers",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-L1-activity-accessibility-barriers.pptx?download=1",
+ "format": "PPTX"
+ },
+ {
+ "label": "L1 activity: accessibility barriers",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-L1-activity-accessibility-barriers.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "L1 activity: barrier theatre",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-L1-activity-barrier-theatre.pptx?download=1",
+ "format": "PPTX"
+ },
+ {
+ "label": "L1 activity: barrier theatre",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-L1-activity-barrier-theatre.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "L2 activity: redesigning poor academic environments",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-L2-activity-redesigning-academic-environments.pptx?download=1",
+ "format": "PPTX"
+ },
+ {
+ "label": "L2 activity: redesigning poor academic environments",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-L2-activity-redesigning-academic-environments.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "L2 activity: increasing accessibility in a dissertation",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-L2-activity-accessible-dissertation.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "L2 activity: increasing accessibility in a dissertation",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-L2-activity-accessible-dissertation.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "L3 worksheet: WCAG as a tool in practice",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-L3-worksheet-WCAG.docx?download=1",
+ "format": "DOCX"
+ },
+ {
+ "label": "L3 worksheet: WCAG as a tool in practice",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-L3-worksheet-WCAG.pdf?download=1",
+ "format": "PDF"
+ },
+ {
+ "label": "L3 activity: discussing open science practices and accessibility",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-L3-activity-open-science-and-accessibility.pptx?download=1",
+ "format": "PPTX"
+ },
+ {
+ "label": "L3 activity: discussing open science practices and accessibility",
+ "url": "https://zenodo.org/records/23090899/files/accessibility-L3-activity-open-science-and-accessibility.pdf?download=1",
+ "format": "PDF"
+ }
+ ]
+ }
+ }
+ }
+}
diff --git a/layouts/clusters/cluster.html b/layouts/clusters/cluster.html
index da2e3fd01d5..18bc67e1233 100644
--- a/layouts/clusters/cluster.html
+++ b/layouts/clusters/cluster.html
@@ -71,6 +71,10 @@ This cluster has no lesson plans yet. The clusters navigation lists the clusters that have them.
+ {{ end }}
diff --git a/layouts/partials/clusters/cluster_section.html b/layouts/partials/clusters/cluster_section.html
index dbeb5eb956a..25a2bb83f4e 100644
--- a/layouts/partials/clusters/cluster_section.html
+++ b/layouts/partials/clusters/cluster_section.html
@@ -19,13 +19,17 @@
{{ end }}
{{ $hasFeatured := and $featuredEnabled $featuredData }}
-
+{{/* Lesson-plan sets for this cluster, keyed by sub-cluster slug (keys validated in lesson_plans.html) */}}
+{{ $lpSets := index (partialCached "clusters/lesson_plans.html" "lesson-plans") (printf "%d" (int $cluster.number)) | default dict }}
+{{ $lpLabel := "Has lesson plans and slides" }}
+
+
@@ -52,13 +56,14 @@
{{ end }}
{{ range $si, $sc := $cluster.sub_clusters }}
- {{/* Stable, human-readable anchor slug derived from the name (not the array index), so shared links survive reordering. Must match sidebar_nav.html. */}}
- {{ $slug := $sc.name | lower | replaceRE "[^a-z0-9]+" "-" | replaceRE "^-+|-+$" "" }}
+ {{/* Stable, human-readable anchor slug derived from the name (not the array index), so shared links survive reordering. */}}
+ {{ $slug := partial "clusters/sc_slug.html" $sc.name }}
{{ $scid := printf "c%d-%s" (int $cluster.number) $slug }}
-
+ {{ $lp := index $lpSets $slug }}
+
diff --git a/layouts/partials/clusters/lesson_plans.html b/layouts/partials/clusters/lesson_plans.html
new file mode 100644
index 00000000000..7272c431a8e
--- /dev/null
+++ b/layouts/partials/clusters/lesson_plans.html
@@ -0,0 +1,22 @@
+{{- /* Returns the lesson-plan sets from data/lesson_plans.json (cluster number -> sub-cluster slug -> set).
+ Fails the build when a key matches no cluster or sub-cluster in clusters_v4.json, so a renamed
+ sub-cluster cannot silently drop its materials. Call via partialCached so the check runs once. */ -}}
+{{- $sets := dict -}}
+{{- with hugo.Data.lesson_plans -}}{{- $sets = .sets | default dict -}}{{- end -}}
+{{- $clusters := hugo.Data.clusters_v4.clusters -}}
+{{- range $ck, $bySlug := $sets -}}
+ {{- $match := false -}}
+ {{- range $clusters -}}{{- if eq (printf "%d" (int .number)) $ck -}}{{- $match = . -}}{{- end -}}{{- end -}}
+ {{- if not $match -}}
+ {{- errorf "data/lesson_plans.json: cluster key %q matches no cluster in clusters_v4.json" $ck -}}
+ {{- else -}}
+ {{- $slugs := slice -}}
+ {{- range $match.sub_clusters -}}{{- $slugs = $slugs | append (partial "clusters/sc_slug.html" .name) -}}{{- end -}}
+ {{- range $sk, $_ := $bySlug -}}
+ {{- if not (in $slugs $sk) -}}
+ {{- errorf "data/lesson_plans.json: key %q/%q matches no sub-cluster of cluster %s in clusters_v4.json" $ck $sk $ck -}}
+ {{- end -}}
+ {{- end -}}
+ {{- end -}}
+{{- end -}}
+{{- return $sets -}}
diff --git a/layouts/partials/clusters/sc_slug.html b/layouts/partials/clusters/sc_slug.html
new file mode 100644
index 00000000000..68ab8b0850a
--- /dev/null
+++ b/layouts/partials/clusters/sc_slug.html
@@ -0,0 +1,2 @@
+{{- /* Returns the anchor slug for a sub-cluster name. Sub-cluster ids (c-), sidebar links and the keys of data/lesson_plans.json all use it. */ -}}
+{{- return (. | lower | replaceRE "[^a-z0-9]+" "-" | replaceRE "^-+|-+$" "") -}}
diff --git a/layouts/partials/clusters/sidebar_nav.html b/layouts/partials/clusters/sidebar_nav.html
index c39c0cef17c..5b4e7343f61 100644
--- a/layouts/partials/clusters/sidebar_nav.html
+++ b/layouts/partials/clusters/sidebar_nav.html
@@ -3,6 +3,7 @@
{{ $arrowColors := .arrowColors }}
{{ $link_mode := .link_mode | default "anchor" }}
{{ $activeN := int (.active_cluster_number | default -1) }}
+{{ $lpLabel := "Has lesson plans and slides" }}