Skip to content

Move forrt.org to the Doors design (draft until launch) - #943

Draft
LukasWallrich wants to merge 100 commits into
mainfrom
rebrand-doors
Draft

LukasWallrich wants to merge 100 commits into
mainfrom
rebrand-doors

Conversation

@LukasWallrich

@LukasWallrich LukasWallrich commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

This is the Doors redesign of forrt.org: a long-lived branch that stays a draft until launch, planned for the week of 4 January 2027. The merge is the launch.

It is a draft on purpose. Aggregate staging skips drafts, so everyone else's preview stays as it is, and an open PR stops cleanup-branches.yml from deleting the branch. Please do not mark it ready for review or merge it.

Smaller pieces of work arrive as PRs into rebrand-doors, and main is merged in at least weekly. Hugo stays, with no Node in the build, and URLs do not change in the current phases.

Preview: https://forrt.org/rebrand-doors/. It carries noindex and rebuilds on each push.

At launch. Delete .github/workflows/rebrand-preview.yaml, and scripts/rebrand/ unless a check has been promoted. The repository allows only squash and rebase merges through the PR button, so the launch merge will squash the branch unless that setting changes, which affects how a revert or a re-landing works.

Created with Claude Opus 5.5 in Claude Code.

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

⚠️ Image files/references in png/jpg format detected

Note that we generally rely on webp format for this webpage, so please consider converting these images to WebP format and updating references accordingly.

References to image files:

  • config/_default/params.toml: img/forrt-share.png
  • content/ai-metascience/index.md: featured.png
  • content/nowherelab/_index.md: img/nowherelab-logo.png
  • content/nowherelab/_index.md: img/nowherelab-logo.png
  • scripts/rebrand/allowed_changes.txt: post/*/featured_hu.jpg
  • scripts/rebrand/allowed_changes.txt: post/*/featured_hu.png
  • scripts/rebrand/allowed_changes.txt: ai-metascience/featured_hu.png
  • scripts/rebrand/baseline/paths.txt: about/partnerships/logos/CREP.png
  • scripts/rebrand/baseline/paths.txt: ai-metascience/featured.png
  • scripts/rebrand/baseline/paths.txt: ai-metascience/featured_hu.png
  • scripts/rebrand/baseline/paths.txt: contributor-analysis/projects-plot-1.png
  • scripts/rebrand/baseline/paths.txt: contributor-analysis/roles-plot-1.png
  • scripts/rebrand/baseline/paths.txt: contributor-analysis/treemap-plot-1.png
  • scripts/rebrand/baseline/paths.txt: educators-corner/022-repro-metrics-forrt-irise/reprometrics_app.png
  • scripts/rebrand/baseline/paths.txt: img/forrt-share.png
  • scripts/rebrand/baseline/paths.txt: img/nowherelab-logo.png
  • scripts/rebrand/baseline/paths.txt: lib/dflip/images/chrome-extension.png
  • scripts/rebrand/baseline/paths.txt: lib/dflip/images/get-it-from-MS.png
  • scripts/rebrand/baseline/paths.txt: lib/dflip/images/textures/white.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-01-newsletter/featured.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-01-newsletter/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-01-newsletter/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-02-newsletter/featured.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-02-newsletter/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-02-newsletter/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-03-newsletter/featured.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-03-newsletter/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-03-newsletter/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-04-newsletter/featured.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-04-newsletter/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-04-newsletter/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-05-chinese-glossary/featured.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-05-chinese-glossary/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-05-chinese-glossary/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-05-get-involved-page/featured.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-05-get-involved-page/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-05-get-involved-page/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-05-just-os-chatbot/featured.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-05-just-os-chatbot/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-05-just-os-chatbot/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-05-newsletter/featured.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-05-newsletter/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-05-newsletter/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-05-nowhere-lab/featured.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-05-nowhere-lab/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-05-nowhere-lab/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-06-ai-metascience-call/featured.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-06-ai-metascience-call/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-06-ai-metascience-call/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-06-peer-community-in-partner/featured.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-06-peer-community-in-partner/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-06-peer-community-in-partner/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-10-ai-in-metascience-recordings/featured.png
  • scripts/rebrand/baseline/paths.txt: post/2026-10-ai-in-metascience-recordings/featured_hu.png
  • scripts/rebrand/baseline/paths.txt: post/2026-10-nwo-award/featured.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-10-nwo-award/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-10-nwo-award/featured_hu.jpg
  • scripts/rebrand/baseline/paths.txt: post/2026-10-presentations/featured.png
  • scripts/rebrand/baseline/paths.txt: post/2026-10-presentations/featured_hu.png
  • scripts/rebrand/baseline/paths.txt: post/2026-10-presentations/featured_hu.png
  • scripts/rebrand/baseline/paths.txt: post/2026-9-registrations-are-now-open-for-the-ai-in-metascience-online-conference/featured.png
  • scripts/rebrand/baseline/paths.txt: post/2026-9-registrations-are-now-open-for-the-ai-in-metascience-online-conference/featured_hu.png

@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

📝 Spell Check Results

Found 18 potential spelling issue(s) when checking 304 changed file(s):

📄 content/ai-metascience/index.md

Line Issue
614 nIn ==> inn, min, bin, nine
614 nWe ==> new
614 nWe ==> new
614 nIn ==> inn, min, bin, nine
614 nWe ==> new
614 nWe ==> new
614 nWe ==> new
614 nWe ==> new

📄 content/reversals/reversals.md

Line Issue
2206 acn ==> can, acne

📄 layouts/glossary/list.html

Line Issue
8 passt ==> past, passed

📄 layouts/partials/glossary_feedback_form.html

Line Issue
27 oder ==> order, older, coder, odder, odor, over, doer
27 oder ==> order, older, coder, odder, odor, over, doer
34 oder ==> order, older, coder, odder, odor, over, doer
59 bu ==> by, be, but, bug, bun, bud, buy, bum

📄 static/js/clusters-page.js

Line Issue
79 tabEl ==> table
80 tabEl ==> table
82 tabEl ==> table
84 tabEl ==> table

ℹ️ How to address these issues:

  1. Fix the typo: If it's a genuine typo, please correct it.
  2. Add to whitelist: If it's a valid word (e.g., a name, technical term), add it to .codespell-ignore.txt
  3. False positive: If this is a false positive, please report it in the PR comments.

🤖 This check was performed by codespell

LukasWallrich and others added 27 commits November 3, 2026 13:34
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
#951)

* Add Doors foundations: colour tokens, self-hosted fonts and the castle

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Address review of the foundations

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Draw the Doors header and footer from the real menus

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Draw the Doors header and footer: keep links inside a subfolder

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Fix the shell review items and add the deployed-preview check

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Tighten the deployed-preview check

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…the workflow (#959)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Close the remaining review items on the Doors checks and castle

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Cover query and fragment after a climbing link; fix workflow doc links

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Load the newsletter form on a click, restyled in Doors colours

EmailOctopus's embed is a heavy script that every carrying page loaded up front. It now loads
when a visitor clicks to subscribe, on all six pages through one partial. check_preview.py no
longer tolerates the Google Fonts request the embed used to make on page load: any embed or
font request before a click fails, and a new step opens the form and checks it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Tighten the newsletter check and hide the button without JavaScript

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ble pages (#969)

* Rebuild the resources directory at real size, closing #868

/resources/ was one 3.85 MB document with 28,680 elements. It now carries 24 cards as HTML per
page, with crawlable numbered pages, a small data file for filters and a fuller one for search on
first use, and keeps the visitor's choice in the address so that the home page's topics can link
into it. compare_builds.py learns globs, because the number of pages follows the collection.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Address review findings on the resources directory

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…red pause (#970)

* Load the newsletter form on a click, restyled in Doors colours

EmailOctopus's embed is a heavy script that every carrying page loaded up front. It now loads
when a visitor clicks to subscribe, on all six pages through one partial. check_preview.py no
longer tolerates the Google Fonts request the embed used to make on page load: any embed or
font request before a click fails, and a new step opens the form and checks it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Rebuild the resources directory at real size, closing #868

/resources/ was one 3.85 MB document with 28,680 elements. It now carries 24 cards as HTML per
page, with crawlable numbered pages, a small data file for filters and a fuller one for search on
first use, and keeps the visitor's choice in the address so that the home page's topics can link
into it. compare_builds.py learns globs, because the number of pages follows the collection.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Tighten the newsletter check and hide the button without JavaScript

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* WIP home

* WIP home 2

* Address review findings on the resources directory

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Start-align the quotes' pause button

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Remove widgets only the old home page used

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Address review findings on the home page

Honours doors.castle = false and a section's active = false, stops a mouse click from freezing
the quotes, and drops aria-pressed, which contradicted the changing label.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…extension (#971)

* Load the newsletter form on a click, restyled in Doors colours

EmailOctopus's embed is a heavy script that every carrying page loaded up front. It now loads
when a visitor clicks to subscribe, on all six pages through one partial. check_preview.py no
longer tolerates the Google Fonts request the embed used to make on page load: any embed or
font request before a click fails, and a new step opens the form and checks it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Rebuild the resources directory at real size, closing #868

/resources/ was one 3.85 MB document with 28,680 elements. It now carries 24 cards as HTML per
page, with crawlable numbered pages, a small data file for filters and a fuller one for search on
first use, and keeps the visitor's choice in the address so that the home page's topics can link
into it. compare_builds.py learns globs, because the number of pages follows the collection.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Tighten the newsletter check and hide the button without JavaScript

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* WIP home

* WIP home 2

* Address review findings on the resources directory

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Redraw the Replication Hub on real content

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Start-align the quotes' pause button

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Remove widgets only the old home page used

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Address review findings on the home page

Honours doors.castle = false and a section's active = false, stops a mouse click from freezing
the quotes, and drops aria-pressed, which contradicted the changing label.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Load the newsletter form on a click, restyled in Doors colours

EmailOctopus's embed is a heavy script that every carrying page loaded up front. It now loads
when a visitor clicks to subscribe, on all six pages through one partial. check_preview.py no
longer tolerates the Google Fonts request the embed used to make on page load: any embed or
font request before a click fails, and a new step opens the form and checks it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Rebuild the resources directory at real size, closing #868

/resources/ was one 3.85 MB document with 28,680 elements. It now carries 24 cards as HTML per
page, with crawlable numbered pages, a small data file for filters and a fuller one for search on
first use, and keeps the visitor's choice in the address so that the home page's topics can link
into it. compare_builds.py learns globs, because the number of pages follows the collection.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Tighten the newsletter check and hide the button without JavaScript

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* WIP home

* WIP home 2

* Address review findings on the resources directory

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Redraw the Replication Hub on real content

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Draw articles and plain pages in the Doors reading layout

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Serve a small JUST-OS icon and report page weights against the budgets

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Raise small footer text, wrap long quote words, check breakpoints and enlarged text

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Start-align the quotes' pause button

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Remove widgets only the old home page used

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Address review findings on the home page

Honours doors.castle = false and a section's active = false, stops a mouse click from freezing
the quotes, and drops aria-pressed, which contradicted the changing label.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Keep the Steering Committee page on the theme's markup until Phase 3

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Close the independent review's findings on Phase 2

Underlines the directory's prose links, names author links, narrows the article column to keep
lines under 80 characters, stops the theme's rem sizes shrinking article text on phones, and scrolls
a long contents card. check_design.py now sweeps every article page, because the one sample missed
most of this.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Address review findings on the article fixes

Keeps large inline button text, tells apart two links with one icon, makes the author's role plain
text, and shares a wrapped address's characters across its lines in the line-length audit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…982)

The phone menu's rule on a bare .primary class also hid a content button, so it now names the
header's nav. Two sample pages ran wider than the screen. The design check now looks for hidden
buttons and sweeps the sample pages for overflow.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Close the empty space beside article text

Text, images and the side card now sit in one centred block, with the text at 20 px so that a
narrower column still fills. The design check fails on a wide gap beside the text, and its sample
sweep also looks for hidden buttons.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Let the design check's sample sweep survive a redirecting page

/glossary/ redirects on load, and reading it during that navigation crashed the check. Also measures
the gap beside article text on pages with no direct paragraph, and limits the hidden-button exception
to Bootstrap utilities that are hiding the button at the current width.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Since #930 the description quotes the stats table, whose link text differs on this branch. The
comparison failed on this one page after main was merged.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Take Bootstrap, jQuery and Font Awesome off the designed pages

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Close the review's findings on the foundation

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Draw section pages on the reading layout

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Allow the manuscript page's modified date to move

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
#991)

* Draw the remaining templates, and take the theme's look off every page

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Drop the manuscript page's highlighter, now that it has no code block, and allow the renamed image copies

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Lay out the previous and next links, and drop a line about a removed menu

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Close search with one press of Escape

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Count letters, not combining marks, in the line length check

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Close the review bot's findings on the Phase 3 templates

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Keep clusters centred, and close the second round of review findings

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
LukasWallrich and others added 30 commits November 8, 2026 20:14
* Exclude generator scripts and draft outputs from site bundles

* Allow the removed generator outputs in Doors comparison

* Check the ignoreFiles patterns directly instead of building the site in a unit test

The test now reads ignoreFiles from config.toml and checks that every script and
draft under content/ is ignored while pages and bundle assets are not. It runs in
milliseconds and needs no Hugo.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Fix legacy redirects losing query strings and fragments

* Cut the redirect test down to the query and fragment fix

One test now runs the 404 script for a sister-site rename and a local redirect, at the
root and under the preview prefix. It fails if the query or fragment is dropped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Fix resource pagination metadata and social image formats

* Tighten social metadata comparisons and review regressions

* Drop the mini-site Hugo test; checks 12 and 13 verify the same metadata on every real build

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Restore the GEP link and document the daily chart cutoff

* Clarify provisional chart data and narrow the alias regression

* Record the approved legacy GEP redirect in Doors comparison

* Drop the mini-site test for the GEP alias

It built a Hugo site inside the unit-test suite to check one line of standard front
matter. The alias was verified in this PR's build, where the comparison listed
about/charity/gep/index.html as the one added address.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…m on demand (#1055)

* Lighten the clusters pages: load publication data and the full diagram on demand

The clusters pages inlined all 820 publication cards (about 2 MB) and loaded the
12,695-pixel diagram (960 KB) on every visit, as both thumbnail and lightbox image.
The cards are now a fingerprinted JSON file that featured-resources.js fetches when a
visitor points at, touches or tabs to a reference or save control, or opens the
reading list. The hero shows a 720-pixel thumbnail, and the lightbox loads the diagram
when first opened. The diagram is now a 2,400-pixel WebP (550 KB) that Hugo can decode,
so the share-image conversion can process it; the full-size original stays in the
picture archive.

check_seo_html.py gains check 12: no page inlines more than 200 KB in one script.

Fixes #993

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Retry a failed card fetch, show when a reference is loading, and wait for cards before export

- A failed fetch of the publication cards no longer sticks; the next interaction retries.
- A reference clicked before the cards arrive is marked busy, and only the latest one opens.
- Export BibTeX and Download PDF wait for the cards.
- check_seo_html.py counts a script left open at the end of a file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Keep a loading reference at full contrast; the progress cursor and aria-busy mark it

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Allow the clusters pages' card file and share-image size in the Doors comparison

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Let a share image kept at the same address change size, instead of exempting /clusters/

compare_heads now drops og:image:width and og:image:height when a page's og:image is
unchanged, so /clusters/ keeps every other SEO and structured-data comparison.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…nt clusters (#1061)

* Replace the outdated clusters diagram with a map drawn from the current clusters

/clusters/ showed a diagram of an earlier version of the clusters. It now has a wheel
with one segment per cluster and a legend, both built from data/clusters_v4.json, so
they change with the data. Every segment and legend entry links to its cluster. The
legend carries the links for keyboard and screen-reader users; the wheel repeats them
for pointer users. Pointing at either highlights the cluster in both.

The page's share image is now a render of the map, regenerated with
scripts/render_clusters_share_image.py. The intro's cluster count also comes from the
data. The lightbox, thumbnail and their styles are removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Make the wheel pointer-only, underline legend names, and guard missing cluster data

- Wheel segments are no longer links inside the aria-hidden SVG; a click follows
  the segment's data-href, and the legend stays the accessible route.
- Legend names carry a light underline at rest.
- The map and the intro count skip cleanly if data/clusters_v4.json is missing.
- AGENTS.md names the map's real inputs; the render script lists its dependencies
  and keeps the page's heading style in the share image (re-rendered).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
… staging) (#1064)

* Use only main's artifacts for the Doors preview, as deploys now do

Refs #960

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Use only main's data and announcement artifacts for deploys and staging

deploy.yaml and staging-aggregate.yaml took the newest data-artifact from any
branch, so a test dispatch of data-processing.yml from a branch could feed the live
site. The artifact downloads now filter on branch main, the missing-artifact
fallback always regenerates from main, and create_announcements.yml compares
against main's previous announcements. The workflows README says how to try a
branch's artifact instead.

Fixes #960

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Let a manual staging run use a named branch's data artifact

staging-aggregate.yaml gains a data_branch dispatch input. Left empty, staging uses
main's artifact like production; set, it stages that branch's data, so a change to
data-processing.yml can still be tried on staging. Production deploys stay main-only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Document the data_branch staging input

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Make the missing-artifact fallback fire, and track only the run it dispatches

The initial data downloads used if_no_artifact_found: warn, which succeeds, so the
fallback (which runs on failure) never did; with the main-only filter that could
leave a deploy without data. They now fail, with continue-on-error, so the fallback
dispatches data-processing on main. The fallback then only follows runs created
after its own dispatch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Fail a staging run that names a branch whose data artifact is missing

With data_branch set, staging used to fall back to committed or main data, which
would misrepresent a pipeline test. It now stops with an error instead; the main
fallback is kept for default runs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Compare announcements with the same branch's previous run, and clarify the fallback

create_announcements.yml's change detection now looks up the previous artifact
from its own branch (main for scheduled runs), so a branch test run isn't skipped
as unchanged against main's hash. Deploys still take only main's announcements.
The README says that only a missing data artifact is regenerated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Leave create_announcements.yml to #1030's PR, and stage a branch's preview artifact

#1059 (#1030) renames branch-run artifacts to data-artifact-preview and
announcements-artifact-preview and reworks create_announcements.yml, so this PR no
longer touches that file. A staging run with data_branch now downloads that
branch's data-artifact-preview. Merge #1059 first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Pass data_branch through env, follow exactly the dispatched run, clarify the README

- The staging error step no longer interpolates the data_branch input into its
  shell script; it reads it from an environment variable.
- The missing-artifact fallback notes the newest data-processing run before it
  dispatches, then follows the first run newer than that.
- The README says staging can opt in to a branch's data artifact only, never to
  branch announcement artifacts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Treat data_branch=main as the default, and say a missing branch artifact stops staging

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Fail the fallback step when GitHub rejects the data-processing dispatch

curl -f turns an HTTP error from the dispatch API into a failure, so the existing
error branch runs instead of waiting for a run that was never created.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Say in the README that data_branch: main behaves like the default

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Add shared citation popovers and a site-wide bibliography

* Flag unresolved glossary citations during the Hugo build

* Handle corporate et-al and comma-free glossary citations

* Drop the build-time glossary citation report, and don't repeat the source link

- The glossary template no longer scans every definition for unmatched citations
  on each build; it printed 219 warnings for issues in generated content, which
  would hide real warnings. The browser matcher still links only certain matches.
- The popover offers 'Open source' only when the reference has no link of its own,
  so a DOI isn't shown twice.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Keep authors' wording when adding citations; add a bare cite form

The pilot conversions had reworded sentences to fit the shortcode (for example
'(e.g. Robertson, 2020; Pownall et al., 2020)' became 'as discussed by Pownall et
al. (2020) and Robertson (2020)'), renamed a heading and respelled a word. cite now
has bare="true", which renders 'Author, Year' inside brackets the author wrote, so
each converted sentence reads exactly as before. The checklist post (a reference
listing only) and the Gilad Feldman interview (quoted speech) are left unconverted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Leave citations unconverted where the shortcode would change their wording

'Henrich, Heine, & Norenzayan, 2010' and 'Bahlai, et al., 2019' would render as
'Henrich et al.' and 'Bahlai et al.', so they stay plain text. Trailing spaces go
from the edited lines, and the author's 'pre-selected' joins the spelling allow-list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Add explicit glossary links and build-time English term index

* Show glossary definitions through the shared popover

* Fix touch navigation and keyboard glossary dismissal

* Preserve original text around glossary markup

* Keep glossary summaries whole after abbreviations and drop stray bold markers

Summaries ended mid-parenthesis at 'e.g.' or 'et al.' on 11 terms, and three
showed literal '**'. The popover title is now a paragraph, so it no longer adds
a heading to the page outline.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Drop the spacer line breaks old pages put between blocks

Pages written for the previous theme put <br> on its own line between blocks to
add space. In Doors these only open gaps: about 100px above the first heading on
Open Science in Developing Countries and 1,668px over the length of Reversals.
52 pages have them; none sits between two pieces of inline text.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Keep line breaks that clear floats

Awards uses <br style="clear: both"> between sections to keep its right-aligned
logos apart; those stay. Spotted by Cubic on #1069.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Put the side card left of the text and set prose at 18px

Reading pages centred a 580px column with a 300px card on its right, at 20px
type. On a desktop the side card (contents, date, term list, profile) now sits
in a 220px column to the left of a 640px text column, and the pair is centred,
so spare width goes to the outer margins. Prose is 18px/1.6 with paragraphs
capped at 560px (about 70 characters); pictures, tables and embeds use the full
column. Headings scale down to match.

From 1240px, pages with call-outs add a 260px notes column on the right, and
their contents card now stays in view while scrolling. Below that, notes stay in
the text. The contents card comes first in the page so keyboard order matches.

Chosen by Lukas from four options mocked up with GPT-6.1 Sol.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Keep lines under 80 characters, and fix the card column and design check

- Paragraphs keep the 28.4em measure, so lines stay under the 80 characters
  check_design.py allows; at 18px that is 511px. Plain and reference lists keep
  to it plus their indent. Card grids, wide pages and inline images in text
  are no longer capped (Contributors' list had shrunk to 560px).
- Only a layout that has a side card gets the left column, so a page with
  call-outs but no card has no empty column.
- check_design.py: call-outs sit beside the text from 1240px and in it below,
  where the card may now sit beside the text; the card gap is measured on
  whichever side the card sits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Put the profile, resource and term-list cards first in the page

They now sit left of the text on a desktop, so keyboard order should reach them
first, as it does the contents card. On phones they still fall after the text.
Spotted by Cubic on #1070.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…1080)

* Accept 'Career / Technical' in the resources education-level filter

The FORRT Database 2.0 sheet's Education Level values are being changed
from 'Career /Technical' to 'Career / Technical' (together with the
resource submission form option). Map both spellings to the Career /
Technical filter group so no resource falls under Other in between.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Map the sheet's corrected 'Assessment' material type to Activity

The FORRT Database 2.0 sheet now spells this material type 'Assessment';
the filter still listed the old 'asssessment', so those resources would
fall under Other once the data run rebuilds the curated pages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Allow the CV page's new title in the build comparison

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Say when to drop the CV allow-list entry

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Apply the content-review decisions to hand-written pages

Wording, dates, names and references across the About, Teams, Nexus,
Replication Hub, Publications and related pages, as decided in the
pre-launch content review. /about/ now redirects through an alias
instead of rendering a list page; the Welcome card can name its button.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Address review: fix empty breadcrumb links and small wording points

A section that is not rendered (About, Glossary) has no permalink, so the
article and glossary trails linked it with an empty href. They now fall back
to the section path, which serves a redirect. check_seo_html.py gains check
17 for empty breadcrumb links. Also: split the accessible-feedback post's
authors so profiles link, APS name, Nexus list order and closing parenthesis,
Welcome wording, and "Open Science-related".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Correct the assessment type value on the resources page

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Add the article before the APS name

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Keep the misspelt assessment value until the database is corrected

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Restore the resources-page wording lost in the merge

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Pass the build comparison and design checks

Keep the About step in breadcrumb data through a breadcrumb_url param, so
the About pages match main. Allow-list the /about/ list paths that the
redirect removes and the pages whose titles or descriptions the content
review changed, each with its reason. Restore the JUST-OS reference to its
short form: the full author list runs past the design check's line limit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Say when to drop the content-review allow-list entries

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* List the About pager paths exactly in the allow-list

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Render Markdown in glossary term titles and related terms

Term titles in the A–Z list, breadcrumb and heading now go through
markdownify, so 'Research Contribution Metric (*p*)' shows an italic p.
The page <title>, og:title and JSON-LD get the plain-text form.
Related terms drop '*' and '\' before building the link slug and render
their Markdown, so '*P*\-hacking' links to p-hacking and shows italic.
check_seo_html.py gains check 17, which fails if a glossary page's
<title> or <h1> shows paired asterisks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Number the glossary title check 18 and keep it apart from the cluster title check

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Use plain glossary titles in JSON-LD and ignore intraword asterisks in check 18

A shared functions/plain_title partial now feeds <title>, og:title, the
DefinedTerm name and collection ListItem names, so none of them shows
'(*p*)'. Check 18 no longer treats asterisks inside words
('G*Power and P*Hack') as a Markdown pair.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Keep glossary link titles separate from titles and document check 18

plain_title now takes the text to clean, so the breadcrumb and ListItem
names keep .LinkTitle while <title> and the DefinedTerm name use .Title.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Allow the plain-text titles of the five Research Contribution Metric pages

compare_builds.py flags any SEO tag change. These five pages' <title>,
og:title and JSON-LD name now read '(p)' instead of '(*p*)', which is the
intended effect of rendering glossary title Markdown.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Also allow the Arabic page's older slug used by the committed content

CI builds with main's data artifact (slug without 'p_'); a local build from
the content committed on this branch still produces 'p_مقياس…'.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
… width (#1100)

* Spread the contributor network's dense middle so it holds up at phone width

The force layout from the data run packs people who share many projects into a dense
middle, and how dense it is changes with each run: since the 9 November data, the
390 px drawing bunched into a band and failed the design check. The drawing now moves
each node outwards by its rank in distance from the middle, measured in each axis's
spread, so the middle opens up whatever shape the layout takes. That replaces the
per-axis spreading that only the older file had. A narrow drawing also keeps smaller
margins and names two projects at rest instead of four.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Place the older file's projects among their people after the spreading

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Redesign the newsletter sign-up as a native form

The form is part of the page and posts to EmailOctopus when a visitor
presses Subscribe, loading Google reCAPTCHA at that point. Adds an HTML
check that no page loads either service on view, and updates the privacy
page to describe the new flow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Address review: newsletter smoke test, timeout, focus and policy date

The preview smoke test now checks the native form and confirms an invalid
submit contacts no third party. The reCAPTCHA timeout also covers a stalled
script load, focus moves to the success message, and the privacy page
carries this change's date.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Exercise the newsletter submit handler in the smoke test

A valid submit now runs against a stubbed EmailOctopus endpoint, and the
invalid-submit assertion counts only requests made after page load. The
status message keeps its focus ring for keyboard users.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Keep the newsletter note at the 15 px minimum and the site date stable

The privacy page records the update as lastmod, so its publication date,
and with it the home page's updated time, stay unchanged. Its description
change is listed in the rebrand comparison's allowed changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Drop the unused double opt-in message from the newsletter form

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Show the confirmation message when EmailOctopus reports a pending subscriber

The list's double opt-in setting can change in EmailOctopus without a site
change, so keep the PENDING branch rather than relying on the setting.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Drop the pending-subscriber message again

The FORRT list does not use double opt-in, so EmailOctopus never returns
PENDING here. This reverts eac9eea.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ails (#1107)

Every Doors preview run on 2026-11-11 failed the design and axe checks
before they started: `playwright install --with-deps chromium` could not
resolve azure.archive.ubuntu.com, exited 100, and never downloaded the
browser. The runner image already has Chromium's libraries (apt reports
them as current); only extra fonts were missing. Fall back to a plain
`playwright install chromium` with a warning.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Move the home page newsletter sign-up under "Take part"

The sign-up hung below the news card in the left column, in a narrower
block than the card, and left a gap under "Take part". It now sits in the
right column under its own "Get the newsletter" heading, so the news
column ends on its card and link. When the board is one column it comes
last, after the news, on phones too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Put "All news and announcements" inside the news card

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
… the rest (#1103)

* Show long author lists as three authors and "et al." with a button for the rest

References with more than five authors now show the first three, "et al." and a
button that reveals the full list in place (aria-expanded). It applies wherever the
shared citation partials print a full reference: reference lists and glossary term
references, the citation popover, citation cards, the "cite us" blocks and the
disciplines citation. Copy buttons copy the complete reference; without JavaScript
the full list shows.

citation-card can now take a bibliography key. JUST-OS cites OpenScholar through it,
from a new Glossary BibTeX entry (Asai2026OpenScholar) taken from Crossref; the
bibliography and its reference page are regenerated from the Doc.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Announce copy results, fall back when the Clipboard API fails, and match "Elm, E. von"

- Copy buttons keep the visible label "Copy" with a hidden " citation", so their
  name stays "Copy citation" while the label is a live region that announces
  "Copied!" or "Copy failed".
- copyText falls back to a selection and execCommand when the Clipboard API
  rejects, as the replaced cite-us and citation-card scripts did.
- The author matcher accepts a surname particle after the initials, as in the
  bibliography's "Elm, E. von".
- The FReD fallback citation has the same shape as the generated file: a working
  DOI link and the note after a blank line, which Copy leaves out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Return focus to the Copy button after the clipboard fallback

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Keep the author-list button out of page descriptions and the search index

The meta description of /about/cite_us/ and the search index's text read
"… & FORRT, et al. Show more authors (2019 …". Both now strip the "et al." and
the button before taking the plain text, so they match the base build.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
#1101)

* Draw the /clusters/ map as a mind map like the original illustration

The FORRT badge sits in a ring of cluster icons; a line runs from each
segment to its cluster's label, and the sub-clusters fan out from the
label as pills. Everything is laid out at build time from
data/clusters_v4.json, with text wrapped by Source Sans 3's measured
advance widths, so it stays correct when the Clusters Doc changes.

- Labels sit on an arc round the hub; tall clusters split into columns.
- The drawing is aria-hidden with no tab stops; a details list carries
  every cluster and sub-cluster link. "Open full size" shows it 1:1.
- Phones get the hub and coloured cluster labels instead of a thumbnail.
- The share image is now a render of the illustration.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Check the clusters illustration's links and layout on every build

check_seo_html.py check 19: the drawing is aria-hidden, none of its links
is a tab stop, and every in-page link in the map reaches an id.
check_design.py: text fits its pill, no pill or label overlaps another,
and no line runs through a box. Both guard the build-time layout when the
Clusters Doc changes. Also drop an unused variable and guard a
single-cluster split in map.html.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Address review: full-size dialog width, map counts and phone view checks

- The phone dialog shows the drawing at its generated width, not 1400 px.
- check_design.py checks that the drawing holds every cluster and
  sub-cluster in the list, and that phones show the hub and one label
  per cluster instead of the drawing.
- The clusters-map tests sit above unittest.main(), so running the file
  directly runs them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Leave 4% headroom when wrapping cluster-map text; widen a label before cutting it

Chromium on Linux sets Source Sans 3 slightly wider than its advance widths, so three
pills that fitted on macOS with under 1 px to spare overflowed in the CI design check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Clusters-map check: report measured and available widths, and the loaded fonts

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Set the clusters-map text with geometricPrecision so Linux Chromium does not round glyph widths

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…1083)

* Render italics and small caps in publication titles

Publication titles from Crossref carry <i>, <em> and <scp> markup and HTML
entities, which the cluster cards showed as literal text. A new partial,
clusters/rich_text.html, escapes the title and restores only those tags
(scp as small caps). featured-resources.js does the same for the reference
popup and the reading list, and copies and exports plain text. The popup
and reading-list APA references join the D15 italics exception for
reference lists.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Show italics in publication titles and check cluster pages for literal markup

Card, popup and reading-list titles join the D15 exception for reference
lists, so journal names and species set in <i> are italic.
check_seo_html.py check 17 fails a build whose cluster pages show
&lt;i&gt;, &lt;em&gt; or &lt;scp&gt; as text or leave <scp> unrendered.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Match <i> and <em> closing tags separately in rich_text.html

RE2 has no backreferences, so <i> could close with </em>; the JS pairs them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Catch double-escaped title markup and a build with no cluster pages

Check 17 now also matches &amp;lt;i&amp;gt; and fails when it scans no cluster
page, as the homepage checks do when there is no homepage. The minimal fixture
build in the tests gains a cluster page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* List checks 19 and 20 in the check_seo_html docstring

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Let the newsletter form retry after a stalled reCAPTCHA load

A load that stalls now times out on its own and clears the cached promise,
and each retry requests reCAPTCHA under its own URL, since the browser
otherwise attaches the new script to the stalled request.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Only the latest reCAPTCHA attempt clears the cached load

A late error from a stalled earlier script no longer wipes out the promise of the retry
that replaced it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…s tables (#1116)

* Point to the clusters share-image renderer from the clusters map and generator

AGENTS.md is dropping its generator tables, so the reminder to re-render
FORRT_Clusters.webp moves to the files an agent edits when the clusters change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Give the share-image command its build-dir argument in the clusters map note

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Drop the EmailOctopus links from the newsletter front matter

data/newsletters.json lists every EmailOctopus issue with its copy on
forrt.org, so the front-matter links to EmailOctopus's web versions and the
template's de-duplication by month are no longer needed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Key newsletter year colours on the year, not the front matter

Each year takes the palette colour at its index modulo 5, which keeps the
current colours and stops 2027 reusing 2026's. The front matter drops its
colour lines and the empty 2026 entry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Add a script that screenshots pages at phone and desktop size for design review

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Screenshot pages that forward themselves by script

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Answer a local build's redirects to forrt.org from the build when screenshotting

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Design round 1: explorer in the site's components, labelled chat tab, tidier text pages

- Cluster and discipline explorer: pill filters as in the resources directory, no shadow
  card or full-bleed rules, larger arrows, visible link buttons, counts read 'n of m'
- Chat launcher tab below 1440 px is dark and labelled 'Ask JUST-OS'
- No rule under headings or at the end of old pages
- Previous on the left and Next on the right everywhere, with arrows; glossary titles
  in the pager keep English left to right
- Educators' Corner thumbnails uncropped, and above the entry on phones
- JUST-OS team in the site's people cards; sentence-case labels on the explorer and
  the AI in Metascience page

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Design round 2: link-like resource cards, phone wayfinding, one button style

- Resource cards: titles in link colour and the whole card opens the resource
- Replication Hub: jump links to the four stages on phones
- Author profiles: portrait, role and links under the name on phones
- Glossary: English name on its own line under a translated term, breadcrumb names
  the term only, English references left to right on Arabic pages, a link to the
  list of terms near the top on phones; Latin text in the site's fonts on Arabic
  and Chinese pages
- Publications: the full reference behind 'Cite this'; a smaller chart on phones
- One primary button size and shape in page content; Send and the conference's
  recordings button as pills; booklet button clear of its sentence
- Explorer: Expand all on its own line, aligned first rows, larger arrows; the
  cluster h1 at the site's weight; introductions at reading measure
- Filters: the pressed state is dark ink everywhere
- Chat page: smaller empty chat on phones, card border instead of shadow

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Design round 3: breadcrumbs for top-level pages, one search field, cluster lists as rows

- Top-level pages show their menu section in the trail (Home / Educational Nexus);
  crumb_parent names it for a page outside the menu (AI in Metascience)
- Generated cluster lists: alphabetical rows across the page, each with its type
- Disciplines search as the header's pill field with the button inside;
  'Open full size' as a secondary pill; sponsor as a small credit on phones
- Primary buttons in content at one size (the older 15 px rule no longer wins);
  chat Send and field without their inline square styles

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Design round 3: phone pages lead with what they are for

- Chat page opens with the chat on phones, at about half the screen
- Resources show level, audience and language under 'Open this resource' on phones
- Articles show their date in the byline on phones
- Smaller clusters wheel on phones

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Design round 4: glossary languages as pills, explorer counts under titles on phones

- Term pages list their other languages as the hub's pills, with 'List of terms' beside them
- Explorer rows on phones put the count under the title, so long titles keep the width
- Cluster pages: Home / Educational Nexus / Clusters in the trail

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Keep the phone chat tab at 52 px and Arabic text in its own face

The labelled tab grew to about 140 px and covered text on /about/ and back to top on
the explorer pages (check_design.py, floating controls). It stays dark, without the label.
Source Sans first in the Arabic stack narrowed word spaces and pushed Arabic lines past
80 characters; only English runs on Arabic pages now use it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Float the chat button in the bottom corner below 1440 px

Reviewers in every round found the 20 px margin tab too small to read or press. Below 1440 px
the launcher is now the desktop's round mascot button, 48 px, in the bottom corner; the
footer keeps room under it, back to top sits above it, and it hides while the clusters
drawer is open. check_design.py now lets the two float over the page mid-scroll, as long
as they keep off each other and cover nothing at the end of the page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Drop the separators between glossary language pills, and check the floating launcher

The pills hid the old ' | ' separators at font-size 0, which the design check rightly reads as
text under 15 px; the template no longer writes them. check_design.py's phone check now expects
the launcher as a button of at most 64 px in the bottom corner, not a 24 px tab in the gutter.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Act on Argon's review: glossary glosses, hub order, trails, dismissable launcher

- Translated glossary terms show their English name as a second line, without brackets,
  in the heading, the list of terms and the pager
- Glossary hub on phones: title, link to the list, languages and introduction first,
  the list after them, as its own text says
- Article trails end with the page itself, as on the other templates
- Below 1440 px the floating chat button has its dismiss cross again
- Only articles offer 'Copy article link'
- Reversals: drop the in-page table of contents that repeated the side card
- Disciplines: the five areas as a row of pills, and 'list of fields' in place of
  'sidebar', which phones do not have

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Screenshot a page list from a JSON file

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Measure the phone launcher's corner from the cookie banner while it shows

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Make each glossary index a hub of its terms

Languages and a search for the terms come first, then every term with the start of its
definition, A to Z with letter links; the history and citation sit in a disclosure. The
search filters the terms by name as it is typed. The term pages keep their side list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Search every tag on /tags/

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Reversals: lead with the project's status, gather its background, search the effects

The status paragraph moves to the top; motivation, history and how to contribute go into one
disclosure; a new list_filter shortcode searches the effects and hides disciplines left empty.
No wording changes in this commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Copy: shorten the Reversals summary, awards and list note

Shortened copy; rebrand/long-copy keeps the original wording.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Get Involved: three starting points first, then the projects

A new action_cards shortcode gives the page three starting points (Slack, the projects, the
starter guide). The projects follow the introduction, the in-depth introduction comes after
them, and project actions are the site's outline pills.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Copy: shorten the Get Involved introduction

The Slack paragraph no longer repeats the card above it, the second heading over the projects
and the 'Check it out!' box (now the starter-guide card) are dropped. rebrand/long-copy keeps
the original wording.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI in Metascience: a visible title and subtitle beside the banner

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Link related glossary terms by title, in the term's language or English

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AWoP: the wheel opens the overview, the toolkit as cards, materials as disclosures

The supplemental materials each fold into a disclosure, the citation uses the site's
citation box with Copy, and licence notes everywhere are a quiet panel. No wording changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Copy: lead the AWoP overview with three sentences

The rest of the overview moves into a 'Why the AWoP' disclosure. rebrand/long-copy keeps the
original wording.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Glossary feedback form: labels and fields at the site's minimum text size

Its fields were 14 px, under the 15 px rule and small enough that phones zoom in on focus.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Glossary: the definition leads each term page; the hub opens with a lede and keeps its letters in reach

The definition sits in a tinted panel and credits become a quiet line. On the hub a lede links
to the citation, which opens its disclosure, the A to Z bar stays at the top while scrolling,
and a search shows its match count. The lede is in the template: content/glossary ships from
main's data artifact, so its _index.md pages cannot carry branch edits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Home: the figures as stat cards, and a 'more' button for each area on phones

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Replication Hub: a 'Start here' row, and the research bricks in place of the diagram

Action cards move into the shared stylesheet so any template can use them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Replication Hub: describe the bricks as the home page does

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Resources: cards lead with the title, and active filters are chips that remove themselves

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Reversals' statistics as small toggles under each effect; AWoP points to its materials on OSF

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Smaller fixes from the reviews: project card actions, a larger dialog close, letters that match

- Get Involved cards keep their actions on one footer line; a contact without email gets an
  'Ask … on Slack' button
- AI in Metascience: the abstract dialog's close button is 44 px
- Glossary hub: letters with no matching term dim while searching

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Tags: the twenty most used, then every tag A to Z with letter links

The search hides the most-used row and empty letters while it has a query. The page no longer
hides most tags behind a disclosure.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Copy: drop 'most used first' from the tags note, now that the page shows both orders

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Resources: the type and level separator stays at the end of the first line

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Glossary terms: related terms as chips, and credits in the body colour

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Outline buttons in page content at the primary button's size

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Copy: open Reversals with one notice and two buttons; the citation moves into the disclosure

rebrand/long-copy keeps the original wording.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Resources: results as full-width rows, with the previous and next page beside the count

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AWoP: the lead before the wheel, the wheel opens full size, each material shows its purpose

No text removed: each material's first sentence shows, the rest and its example are in a
disclosure.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Copy: drop the AWoP paragraph that repeated the Web App card

rebrand/long-copy keeps the original wording.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI in Metascience: 'Watch the recordings' and 'See the programme' under the summary; facts in two columns on phones

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Glossary on phones: compact term rows and a lighter definition panel; Get Involved projects two to a row from 1440 px

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Fixes from Argon's review: the home 'more' button hides once used; glossary search by address

- Home: an opened area's 'more' button no longer stays visible (a selector for the
  revealed links outranked the one hiding it)
- Glossary hub: ?q= opens with that search; when no term name matches, definitions are searched
- Replication Hub: 'Start here' spans the width of the stages below; the sticky letter bar
  has a rule beneath it

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Status chips on Reversals, featured first tools on the hub, one-row headers on the phone glossary

- Reversals: each effect's status (replicated, not replicated, mixed, reversed) shows as a chip
  before its name, read from its statistics
- Replication Hub: the first tool in each stage is tinted as its starting point
- Glossary hub on phones: languages and letters scroll sideways in one row each
- AI in Metascience on phones: Abstract and Watch share the last line of each talk

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Section intros under a heading in the body face, not a second display line

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Copy: shorten Get Involved's in-depth introduction; the third starting card is the newsletter

The introduction keeps its two pointers (Publications, Getting Started with FORRT) in two
sentences; the starter guide stays linked there. rebrand/long-copy keeps the original wording.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Home: the statement band in two columns on a wide screen

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Copy: shorter labels under the home page's figures, and 2026 for the award

rebrand/long-copy keeps the original wording.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Round 4 suggestions: hub stages two by two, a sticky glossary toolbar, project search

- Replication Hub: on a wide screen the four stages sit two by two, each with its tools two
  to a row
- Glossary hub: search, count, letters and a Clear button stay at the top while scrolling;
  related terms without a page read as plain text
- AWoP: a smaller wheel beside the lead
- AI in Metascience: the three daily playlists under the summary
- Get Involved: search the projects
- Resources: numbered pages above the list as well as below
- Tags: twelve most used

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Tags on phones: twelve per letter with a button for the rest; home hero links on one line

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Round 5 suggestions: related-term chips, status words, hub columns, rare tags, level counts

- Glossary terms: related terms on a row of their own, those without a page as muted chips
- Reversals: status chips use one word set; qualifiers stay in the statistics and the title
- Replication Hub: Track and Explore stacked beside Conduct and Disseminate, and a fourth
  starting point (publish in R2)
- Tags: tags on one page only are lighter
- Resources: two education levels and a count per row
- Phones: a more compact consent banner, same wording

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Round 5 suggestions: the main home action filled, glossary language menu on phones, tag count badges

- Home: the first hero link is filled, and the phone tower is smaller
- Glossary hub on phones: a labelled language menu and a visible search label
- AWoP on phones: the wheel as a thumbnail beside its link; each material has an OSF link
- Tags: counts as small badges
- Resources: the collection's history behind 'How the collection grew'

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AWoP: an OSF link on each supplemental material

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Copy: 'Find teaching resources' leads the home links; AWoP subtitle says who it is for; playlists name their day's theme

rebrand/long-copy keeps the original wording.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Round 6 suggestions: Get Involved on the wide layout, effects as rows, collapsed tag letters

- Get Involved joins the wide pages: its projects fill the width, three to a row, and the
  grid no longer breaks out of the text column
- Reversals: the effects read as rows with a rule between them, without bullets
- Tags: every letter shows its first sixteen (twelve on phones) with a button for the rest
- Glossary hub: two lines of definition per term on every screen
- AI in Metascience: the three playlists as compact cards in a row

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Fix two check failures: hub tints as plain colours, Arabic definitions at their own size

The design check could not read the featured cards' color-mix() background and reported low
contrast; the tints are now precomputed. Arabic definitions in the panel keep the 21 px that
keeps their lines under 80 characters.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Round 6 suggestions: find a tool, glossary list view, term finder on phones, section menu

- Replication Hub: 'Find a tool' searches the tools, and each tool says what kind it is
- Glossary hub: a list view beside the cards, remembered for the next visit
- Glossary terms: on phones the list of terms opens right after the definition; the term
  filter shows a count, a no-match line and a Clear button
- Reversals: a menu of the disciplines, with counts, beside the search
- Tags: A to Z as rows with the count on the right
- Home: the phone 'more' buttons name their area
- Glossary hub: the citation link in the lede is underlined (axe: link-in-text-block)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Round 7 suggestions: effects by outcome, word-start search, most-used tags first, hub colours

- Reversals: buttons show effects by outcome, and the search matches the start of words
  ('ego' no longer finds 'category')
- Tags: each letter's preview shows its most used tags; rare tags are no longer greyed
- Replication Hub: the starting points follow the stages and carry their colours; phone jump
  links in two rows of two
- Glossary hub on phones: the list switch sits under the search, which keeps its full width

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Get Involved: no line breaks inside the calendar's heading

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI in Metascience playlists as clearly outlined tiles; 'Find another term' on English term pages

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Reversals: remove stray emphasis markers after the Robbers Cave entry

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Round 8 fixes: no-status chips and status counts on reversals, glossary Cards/List switch, current letter, phone list default and compact feedback row, clean previews, one contact action per project, short tag groups stay whole

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Compact menu up to 979 px so the header never wraps; reversals filter skips non-entry lists; select focus ring; playlist tiles in their day colours; tag groups move focus to the first revealed tag

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AI in Metascience: facts under the banner on wide screens; AWoP supplemental materials as a list with OSF links beside titles; Get Involved contact buttons back to outline

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Get Involved: keep the filled contact action; term finder gets a visible label

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Glossary: Previous and Next follow the A to Z; the first letter is marked on load; the phone term list centres on the current term when opened

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AWoP and Get Involved: a written summary for the meta description, which would otherwise open with link text

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Checks: allow the three new descriptions; the glossary language menu no longer reads as a link

The language menu's onchange used location.href = this.value, which the internal-link check read as a link to glossary/<lang>/this.value. It now calls location.assign.

German terms beginning with Ä, Ö or Ü are filed under A, O and U on the glossary hub, as Hugo's sort already places them, instead of getting letters of their own.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Review tools: screenshot sizes accept 'both' and duplicate page slugs are refused; the launcher check bounds both sides

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Layout fixes from the review of #1118

- Home: on phones the area links collapse only when script can open them again
- Consent banner: its two buttons fit a 320 px screen
- Chat launcher: the short-screen size comes last, so the phone size no longer undoes it
- Tags: phones keep two columns, and a letter jump lands below the sticky letters
- Lists: thumbnails are resized, not cropped, so they show whole as intended
- Replication Hub: a tool's format line keeps its own style
- Glossary feedback: the intro keeps its 16 px size inside the article
- Disciplines: the five area badges are a list
- People: empty organisations print no empty paragraph

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Filters: tag search hidden beside a selected tag, removable chips name their group, project search ignores the shared actions

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Glossary related terms match the full name first, so the three Model terms link to their own pages; a full stop after the reversals DOI

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Resources: the search chip's screen-reader label says it removes the search

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Home: a thumbnail on each news row, and two-line excerpts (#1126)

* Home: news rows lead with a small thumbnail and a two-line excerpt

Each "From the community" row now shows a small WebP crop of the post's
featured image (or a tile in its category's tint with the initial when a
post has none) beside the date, category and title. The excerpt is clamped
to two lines; on phones it runs full width under the thumbnail and title.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Home news: no row gap on phones, where the older rule's 4px gap still applied

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* Arabic glossary pages: Arabic labels and related-term names, isolated English text (#1121)

* Arabic glossary pages: Arabic labels, Arabic related-term names and isolated English text

Feedback from the Arabic glossary team on the Doors preview:
- Related terms name the Arabic page they link to, without its English name.
- The breadcrumb, the other-languages row and the pager are labelled in Arabic.
- Contributor names are separated by the Arabic comma and isolated, so Latin names keep
  their order inside right-to-left text; each name stays on one line.
- Breadcrumb steps and links in the entry are isolated, so English names and URLs keep
  their brackets and order.
- The Arabic glossary hub's foot reads "آخر تحديث:" with the date in digits, and a root
  i18n/ar.yaml replaces the theme's misspelt "اخر تحيث في".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Arabic glossary pages: name the breadcrumb in Arabic for screen readers

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* Resources: sort by newest added and choose how many per page (#1125)

* Resources: sort by title or date added, and choose how many per page

The directory gains a Sort select (Title A-Z, Newest added) and a Per page
select (12, 24, 48; 24 on wider screens, 12 on phones). The result line now
gives the range and order, e.g. "Showing 1-24 of 1,473 resources, A to Z".
The date added comes from each resource's form timestamp, written into
directory.json as an ISO time; resources without one, including the
01/01/2020 placeholder, sort last under Newest.

Sort, page size and page go in the address with the filters. With no filter,
A to Z and 24 a page, the address stays the server's /resources/page/N/.
Filtered and re-sorted views get page links at the top and bottom in place
of Show more; page links add a history step, so Back returns to the page
before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Resources: keep other address parameters, and check the new page links and sort

The directory rewrites only its own keys in the address, so a campaign tag
or the theme's ?q= survives the first draw. The design check now turns a
filtered page, goes Back, and tries the Sort and Per page selects, in place
of the removed Show more button.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Resources: keep the page size in filtered links from a phone; the design check counts the cards

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Resources: sort order and page size as two quiet menus beside the search box, below it on a phone

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Resources: the search keeps at least 18em, so with enlarged text the sort and page-size menus wrap below it

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* A page opening with its picture beside the title: AWoP, Citational Justice and AI in Metascience (#1123)

* AWoP: the wheel beside the title and actions, on the first screen

The wheel moves from the overview into the page's opening: large beside the
title, lede and buttons on a desktop, and under the buttons at a moderate size
on a phone. It still opens full size. A page opts in with hero_image in its
front matter (layouts/partials/doors/tool_hero.html); other section pages are
unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* AWoP: clip the wheel image to the link's rounded corners

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* A general page opening with its picture beside the title, for AWoP, Citational Justice and AI in Metascience

The AWoP-only tool_hero becomes doors/page_hero, which the reading layout and widget_page both use when a page sets hero_image (a page resource or a static path). Page resources are resized to 900 px; landscape pictures take the full width on a phone. AI in Metascience drops its hand-written first-row grid.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Citational Justice: the opening shows a 900 px copy of the wheel, not the 2,835 px original

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* AWoP: back to the authors' original wording; the shortened copy goes to its own PR for the authors to review

The layout changes stay (the wheel at the top, the toolkit cards).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Reversals: a search bar that stays on screen, and descriptions cut to their first lines (#1127)

* Reversals: the search and outcome filters stay at the top while the effects scroll, with a live count; each description shows its first lines with a "more" button

The rows keep the reading width of a paragraph. On a phone only the search row and count stay on screen; beside the "On this page" card the bar needs no Go to menu. The design check's line-length audit now skips text nobody can see: inside a closed disclosure, or clipped by a box that shortens it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Reversals on a phone: the outcome buttons get their usual size and spacing, with room above and below them

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Reversals: closing an effect re-checks whether it still needs "more"; the fade follows right-to-left text; the line-length audit also skips text clipped sideways

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* Tags: /tags/ lists the 148 used on five or more pages; resource pages show all theirs as keywords (#1120)

* Tags: list and show only tags used on five or more pages

Three quarters of the 1,691 tags appear on one page, so the A to Z list and
the badges on resource pages were mostly dead ends. Every tag still works in
/tags/?tag= and site search.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Tags: document the min key in tag_counts

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Resource pages list every tag as one line of keywords: the common ones link to their list, rarer ones are plain text

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* Phone contents: an open "On this page" list, shortened to five with "Show all" (#1128)

* Phone contents: the closed line says what it holds, "On this page: 5 sections", with the first section names under it

One partial (doors/toc_phone) for doors/reading and widget_page, with a chevron like the resources filter drawer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Phone contents: an open list under an "On this page" label, the first five sections and "Show all N sections" when there are more than six

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Phone contents on section pages: escape each entry's id and title before building the list

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* Glossary credits escape each name before Markdown and keep only short names on one line; the page opening resizes only images wider than 900 px

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Design check: a wrapped word's characters are shared out over all its boxes before hidden ones are dropped

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Allow the /tags/ description change from #1120

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Review round: tags intro in one sentence; MORNING and AFTERNOON in capitals again; reversals cite visible, FLoRA only, no All Effects heading; Replication Hub keeps its diagram; glossary's about section under the heading; related terms as a plain list; Get Involved says what FORRT is

- JUST-OS: on touch screens the close control is 28 px with a 44 px tap area
- Two or more buttons in one paragraph keep a gap when they wrap
- On full-width pages a call-out keeps to the reading width

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Reversals: the FLoRA button no longer calls its entries validated; the hub diagram loads at once; two comments match the layout

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Tags: a tag on more than a quarter of the tagged pages (today only "Open Science") is too general to show as a tag or keyword

Its /tags/?tag= address still works.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Home: three actions under the intro (teach, learn, explore replications) (#1133)

* Home: three actions under the intro (teach, learn, explore replications), with Join FORRT and Submit a replication as a quieter line on wide screens

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Home: "Submit a resource" leads to a new page, Submit to FORRT, with each kind of submission and its form

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Submissions page: /submit/ rather than /contribute/, as submitting is not the same as becoming a contributor

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Submit page: the game card opens the form for games the Portal is missing

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* Cards: bricks for starting points, ruled rows for the Replication Hub's tools (#1134)

* Cards: starting points as bricks in their area's colour, the Replication Hub's tools as ruled rows that are links across their whole width

- action_cards and the hub's Start here: solid bricks with studs; the shortcode takes `area` (edu, res, jus, com); AWoP uses justice, Get Involved community
- Hub stages: open sections under a rule in the stage colour; each tool a contents-style row, the kind of tool in a label column
- Each hub tool is a full-size link target on phones (it was only the 19 px title)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Cards: each row of bricks runs through the four area colours, starting with its own; the Replication Hub drops its tool search

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Cards: bricks keep their colours when printed; the hub's four bricks join only once they fit on one line

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* Spelling: accept "jus", the justice area's key in the action_cards shortcode

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Replication Hub: tool titles keep a thin underline in the stage colour, so they read as links before hover

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Home: a tighter hero, so the second line of links does not push the topics past 1.6 screens; hub stage headings wrap at 200% text

- Hero text column 36 px less bottom padding, castle column 16 px less top padding, castle at most 410 px high, 12 px less above the area cards
- .stage h2 wraps anywhere, as "Disseminate" at double size is wider than a phone

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts resolved:
- Newsletter: keep the Doors sign-up form (doors/newsletter.html, same EmailOctopus
  IDs); drop main's newsletter_form.html, static/js/newsletter.js and their SCSS.
  The archive page takes main's ordering by issue URL.
- FLoRA: main's build-time citation shortcode replaces the citation block, so
  CONTRIBUTING no longer lists it as generated; cite-us keeps the Doors layout with
  the full FLoRA name. The FLoRA citation check becomes check 22.
- Reversals keeps the Doors page; privacy takes main's date; mike-galang's
  copied profile is deleted as on main; .codespellrc combines both skip lists.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant