Skip to content
Merged
6 changes: 4 additions & 2 deletions Article-Generation.md
Original file line number Diff line number Diff line change
Expand Up @@ -711,8 +711,10 @@ The rendering path is:
1. Markdown contains ```` ```mermaid ```` fences.
2. [`scripts/render-lib/markdown.ts`](scripts/render-lib/markdown.ts) rewrites them to `<pre class="mermaid">` before Markdown parsing.
3. `rehype-sanitize` allows the `pre.mermaid` class.
4. [`scripts/render-lib/chrome.ts`](scripts/render-lib/chrome.ts) includes `js/lib/mermaid-init.mjs`.
5. [`js/lib/mermaid-init.mjs`](js/lib/mermaid-init.mjs) dynamically imports Mermaid `11.4.1` from the **same-origin vendored copy under `js/lib/mermaid/`**, initializes a dark theme and renders all Mermaid blocks after page load.
4. [`scripts/render-lib/chrome.ts`](scripts/render-lib/chrome.ts) emits an inline imperative bootstrap script that injects a `<script type="module" src="/js/lib/mermaid-init.mjs">` into `<head>` at runtime. The DOM-injection pattern is intentional: it bypasses Vite's HTML/script-tag transformer so the loader and the vendored mermaid runtime are **not** bundled, hashed and re-emitted under `/assets/`. (The previous static `<script type="module" src="…mermaid-init.mjs">` pattern caused production 404s like `/assets/mermaid.esm.min-XXXX.mjs` whenever the pinned `mermaid` devDependency was upgraded between deploys, because Vite would emit a chunk hash that didn't match the file actually deployed to S3.)
5. [`js/lib/mermaid-init.mjs`](js/lib/mermaid-init.mjs) dynamically imports Mermaid from the **same-origin vendored copy under `js/lib/mermaid/`** (resolved against its own `import.meta.url`), initializes a dark theme and renders all Mermaid blocks after page load.

The same inline bootstrap also injects [`/js/back-to-top.js`](js/back-to-top.js) (module) and [`/js/theme-toggle.js`](js/theme-toggle.js) (classic, deferred) so the dark/light theme button in the rm-site-header stays functional without going through Vite's bundler. The matching anti-flash bootstrap (`html[data-theme]` set before first paint) is emitted as an inline `<script>` in `<head>` by [`renderChromeHead`](scripts/render-lib/chrome.ts).

The Mermaid distribution is vendored at build time:

Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-17/realtime-1434/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-17
subfolder: realtime-1434
slug: 2026-04-17-realtime-1434
source_folder: analysis/daily/2026-04-17/realtime-1434
generated_at: 2026-04-26T09:44:16.092Z
generated_at: 2026-04-26T13:29:43.599Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-18/realtime-1705/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-18
subfolder: realtime-1705
slug: 2026-04-18-realtime-1705
source_folder: analysis/daily/2026-04-18/realtime-1705
generated_at: 2026-04-26T09:44:16.098Z
generated_at: 2026-04-26T13:29:43.603Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-18/weekly-review/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-18
subfolder: weekly-review
slug: 2026-04-18-weekly-review
source_folder: analysis/daily/2026-04-18/weekly-review
generated_at: 2026-04-26T09:44:16.107Z
generated_at: 2026-04-26T13:29:43.608Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-19/deep-inspection/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-19
subfolder: deep-inspection
slug: 2026-04-19-deep-inspection
source_folder: analysis/daily/2026-04-19/deep-inspection
generated_at: 2026-04-26T09:44:16.115Z
generated_at: 2026-04-26T13:29:43.613Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-19/month-ahead/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-19
subfolder: month-ahead
slug: 2026-04-19-month-ahead
source_folder: analysis/daily/2026-04-19/month-ahead
generated_at: 2026-04-26T09:44:16.120Z
generated_at: 2026-04-26T13:29:43.617Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-19/monthly-review/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-19
subfolder: monthly-review
slug: 2026-04-19-monthly-review
source_folder: analysis/daily/2026-04-19/monthly-review
generated_at: 2026-04-26T09:44:16.125Z
generated_at: 2026-04-26T13:29:43.621Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-19/realtime-1219/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-19
subfolder: realtime-1219
slug: 2026-04-19-realtime-1219
source_folder: analysis/daily/2026-04-19/realtime-1219
generated_at: 2026-04-26T09:44:16.131Z
generated_at: 2026-04-26T13:29:43.625Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-20/evening-analysis/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-20
subfolder: evening-analysis
slug: 2026-04-20-evening-analysis
source_folder: analysis/daily/2026-04-20/evening-analysis
generated_at: 2026-04-26T09:44:16.135Z
generated_at: 2026-04-26T13:29:43.628Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-20/interpellations/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-20
subfolder: interpellations
slug: 2026-04-20-interpellations
source_folder: analysis/daily/2026-04-20/interpellations
generated_at: 2026-04-26T09:44:16.141Z
generated_at: 2026-04-26T13:29:43.633Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-20/motions/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-20
subfolder: motions
slug: 2026-04-20-motions
source_folder: analysis/daily/2026-04-20/motions
generated_at: 2026-04-26T09:44:16.151Z
generated_at: 2026-04-26T13:29:43.640Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-21/committeeReports/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-21
subfolder: committeeReports
slug: 2026-04-21-committeeReports
source_folder: analysis/daily/2026-04-21/committeeReports
generated_at: 2026-04-26T09:44:16.158Z
generated_at: 2026-04-26T13:29:43.646Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-21/evening-analysis/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-21
subfolder: evening-analysis
slug: 2026-04-21-evening-analysis
source_folder: analysis/daily/2026-04-21/evening-analysis
generated_at: 2026-04-26T09:44:16.162Z
generated_at: 2026-04-26T13:29:43.649Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-21/motions/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-21
subfolder: motions
slug: 2026-04-21-motions
source_folder: analysis/daily/2026-04-21/motions
generated_at: 2026-04-26T09:44:16.169Z
generated_at: 2026-04-26T13:29:43.654Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-21/realtime-1353/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-21
subfolder: realtime-1353
slug: 2026-04-21-realtime-1353
source_folder: analysis/daily/2026-04-21/realtime-1353
generated_at: 2026-04-26T09:44:16.172Z
generated_at: 2026-04-26T13:29:43.656Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-22/evening-analysis/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-22
subfolder: evening-analysis
slug: 2026-04-22-evening-analysis
source_folder: analysis/daily/2026-04-22/evening-analysis
generated_at: 2026-04-26T09:44:16.178Z
generated_at: 2026-04-26T13:29:43.661Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-22/realtime-2338/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-22
subfolder: realtime-2338
slug: 2026-04-22-realtime-2338
source_folder: analysis/daily/2026-04-22/realtime-2338
generated_at: 2026-04-26T09:44:16.183Z
generated_at: 2026-04-26T13:29:43.664Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-23/committeeReports/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-23
subfolder: committeeReports
slug: 2026-04-23-committeeReports
source_folder: analysis/daily/2026-04-23/committeeReports
generated_at: 2026-04-26T09:44:16.188Z
generated_at: 2026-04-26T13:29:43.667Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-23/month-ahead/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-23
subfolder: month-ahead
slug: 2026-04-23-month-ahead
source_folder: analysis/daily/2026-04-23/month-ahead
generated_at: 2026-04-26T09:44:16.193Z
generated_at: 2026-04-26T13:29:43.670Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-23/monthly-review/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-23
subfolder: monthly-review
slug: 2026-04-23-monthly-review
source_folder: analysis/daily/2026-04-23/monthly-review
generated_at: 2026-04-26T09:44:16.197Z
generated_at: 2026-04-26T13:29:43.673Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-23/motions/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-23
subfolder: motions
slug: 2026-04-23-motions
source_folder: analysis/daily/2026-04-23/motions
generated_at: 2026-04-26T09:44:16.202Z
generated_at: 2026-04-26T13:29:43.677Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-24/committeeReports/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-24
subfolder: committeeReports
slug: 2026-04-24-committeeReports
source_folder: analysis/daily/2026-04-24/committeeReports
generated_at: 2026-04-26T09:44:16.208Z
generated_at: 2026-04-26T13:29:43.682Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-24/evening-analysis/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-24
subfolder: evening-analysis
slug: 2026-04-24-evening-analysis
source_folder: analysis/daily/2026-04-24/evening-analysis
generated_at: 2026-04-26T09:44:16.214Z
generated_at: 2026-04-26T13:29:43.685Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-24/interpellations/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-24
subfolder: interpellations
slug: 2026-04-24-interpellations
source_folder: analysis/daily/2026-04-24/interpellations
generated_at: 2026-04-26T09:44:16.219Z
generated_at: 2026-04-26T13:29:43.689Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-24/motions/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-24
subfolder: motions
slug: 2026-04-24-motions
source_folder: analysis/daily/2026-04-24/motions
generated_at: 2026-04-26T09:44:16.225Z
generated_at: 2026-04-26T13:29:43.693Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-24/propositions/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-24
subfolder: propositions
slug: 2026-04-24-propositions
source_folder: analysis/daily/2026-04-24/propositions
generated_at: 2026-04-26T09:44:16.229Z
generated_at: 2026-04-26T13:29:43.696Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-25/month-ahead/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-25
subfolder: month-ahead
slug: 2026-04-25-month-ahead
source_folder: analysis/daily/2026-04-25/month-ahead
generated_at: 2026-04-26T09:44:16.235Z
generated_at: 2026-04-26T13:29:43.699Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-25/monthly-review/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-25
subfolder: monthly-review
slug: 2026-04-25-monthly-review
source_folder: analysis/daily/2026-04-25/monthly-review
generated_at: 2026-04-26T09:44:16.239Z
generated_at: 2026-04-26T13:29:43.703Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-26/month-ahead/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-26
subfolder: month-ahead
slug: 2026-04-26-month-ahead
source_folder: analysis/daily/2026-04-26/month-ahead
generated_at: 2026-04-26T12:14:05.223Z
generated_at: 2026-04-26T13:29:43.705Z
language: en
layout: article
---
Expand Down
2 changes: 1 addition & 1 deletion analysis/daily/2026-04-26/monthly-review/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ date: 2026-04-26
subfolder: monthly-review
slug: 2026-04-26-monthly-review
source_folder: analysis/daily/2026-04-26/monthly-review
generated_at: 2026-04-26T10:36:42.992Z
generated_at: 2026-04-26T13:29:43.709Z
language: en
layout: article
---
Expand Down
6 changes: 4 additions & 2 deletions cypress/e2e/news-page.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -244,11 +244,13 @@ describe('News Page - Navigation', () => {
it('should support language switching on news page', () => {
cy.visit('/news/');

// Try to switch to Swedish version
// Try to switch to Swedish version. The canonical chrome renders the
// top-of-page lang switcher inside a collapsed <details> dropdown, so
// filter to the visible anchor (footer language row, or open dropdown).
cy.get('body').then(($body) => {
const svLink = $body.find('a[href*="index_sv.html"]');
if (svLink.length > 0) {
cy.get('a[href*="index_sv.html"]').first().click();
cy.get('a[href*="index_sv.html"]:visible').first().click();
cy.url().should('include', 'index_sv.html');
} else {
cy.log('Swedish language link not found - skipping language switch test');
Expand Down
9 changes: 6 additions & 3 deletions cypress/e2e/sitemap.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ describe('Sitemap Pages', () => {
const languages = [
{ code: 'sv', name: 'Swedish', dir: 'ltr' },
{ code: 'da', name: 'Danish', dir: 'ltr' },
{ code: 'no', name: 'Norwegian', dir: 'ltr' },
{ code: 'no', name: 'Norwegian', dir: 'ltr', lang: 'nb' },
{ code: 'fi', name: 'Finnish', dir: 'ltr' },
{ code: 'de', name: 'German', dir: 'ltr' },
{ code: 'fr', name: 'French', dir: 'ltr' },
Expand All @@ -96,7 +96,7 @@ describe('Sitemap Pages', () => {
{ code: 'zh', name: 'Chinese', dir: 'ltr' }
];

languages.forEach(({ code, name, dir }) => {
languages.forEach(({ code, name, dir, lang }) => {
describe(`${name} Sitemap (${code})`, () => {
it(`should load ${name} sitemap successfully`, () => {
cy.visit(`/sitemap_${code}.html`);
Expand All @@ -105,7 +105,10 @@ describe('Sitemap Pages', () => {

it(`should have proper lang attribute for ${name}`, () => {
cy.visit(`/sitemap_${code}.html`);
cy.get('html').should('have.attr', 'lang', code);
// URL slug uses legacy ISO code (e.g. /sitemap_no.html) but the
// <html lang="…"> attribute follows BCP-47 (e.g. lang="nb" for
// Norwegian Bokmål). Allow per-language override.
cy.get('html').should('have.attr', 'lang', lang ?? code);
});

it(`should have proper dir attribute for ${name}`, () => {
Expand Down
Loading
Loading