From b83758fbca2a4339de0ae81eae80b919c68a2345 Mon Sep 17 00:00:00 2001 From: BenStullsBets Date: Tue, 30 Jun 2026 09:37:00 -0700 Subject: [PATCH] =?UTF-8?q?feat(content):=20about.html=20=E2=80=94=20inten?= =?UTF-8?q?t,=20provenance,=20honest=20limits;=20static-build=20copy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit English-first page mirroring credits.html (for-everyone / tech arc underwater→drones→space / built-with-LLMs / honest-it's-imperfect). Header link + about.link i18n key; about.html + flash.js added to PUBLIC_ASSETS. Co-Authored-By: Claude Opus 4.8 (1M context) --- simulator/e2e/tests/a11y.spec.ts | 17 ++++++++++ simulator/static/about.html | 53 ++++++++++++++++++++++++++++++++ simulator/static/i18n.js | 1 + simulator/static/index.html | 1 + tools/build_static.py | 2 +- 5 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 simulator/static/about.html diff --git a/simulator/e2e/tests/a11y.spec.ts b/simulator/e2e/tests/a11y.spec.ts index 3d64f65..add613c 100644 --- a/simulator/e2e/tests/a11y.spec.ts +++ b/simulator/e2e/tests/a11y.spec.ts @@ -97,3 +97,20 @@ test.describe("Task 7 — Screen-reader narration", () => { await expect(page.locator("#affect")).toHaveAttribute("aria-hidden", "true"); }); }); + +test.describe("Task 9 — About page", () => { + test("about page loads, names its themes, and links back", async ({ page }) => { + await page.goto("/about.html"); + await expect(page.locator("h1")).toContainText(/about/i); + await expect(page.getByText(/imperfect/i)).toBeVisible(); // honest-about-limits beat + await expect(page.getByText(/space exploration/i)).toBeVisible(); // technology arc beat + await expect(page.getByText(/large language models/i)).toBeVisible(); + await page.locator(".back-link").click(); + await expect(page).toHaveURL(/index\.html|\/$/); + }); + + test("the header links to the about page", async ({ page }) => { + await page.goto("/"); + await expect(page.locator('a[href="about.html"]')).toBeVisible(); + }); +}); diff --git a/simulator/static/about.html b/simulator/static/about.html new file mode 100644 index 0000000..014ad76 --- /dev/null +++ b/simulator/static/about.html @@ -0,0 +1,53 @@ + + + + + + About — Human Experience Filter + + + +
+
+

About this work

+

← Back to the experience

+
+ +
+

For everyone

+

The Human Experience Filter is built to be accessible to — and + representative of — the full range of human experience. That is why it works + with a keyboard, with a screen reader, with reduced motion, and away from any + single screen or kiosk: an experience about being human should be open to as + many humans as possible.

+
+ +
+

Places technology let us see

+

The scales you move through — the deep sea, the coast, the sky, the orbit + of the Earth, the wider cosmos — are vantage points no unaided human could + ever witness. We can share them only because our tools evolved to reach them: + from underwater exploration, to drones and aerial + imaging, to space exploration. Each scale is a place + a machine went first, so that a person could feel what it is like to be there.

+
+ +
+

Built with LLMs

+

This piece was itself built using large language models — an extension of + that same long arc of tools that widen what a single human can reach. The + software, the words, and much of the craft were shaped in collaboration with + a machine.

+
+ +
+

Honest about its limits

+

This implementation is imperfect. It is also more than I could have made + alone: better with these tools assisting than by my hand as a single human. + That tension is part of the point — technology does not replace the person + behind the work; it extends their reach, flaws and all.

+
+
+ + + diff --git a/simulator/static/i18n.js b/simulator/static/i18n.js index 77f433f..497e276 100644 --- a/simulator/static/i18n.js +++ b/simulator/static/i18n.js @@ -35,6 +35,7 @@ "warn.title": { en: "Heads up — motion & flashing" }, "warn.body": { en: "This experience contains continuous motion, flashing, and shifting imagery. If you are sensitive to motion or flashing light, turn on “Reduce motion” in the panel before you begin." }, "warn.continue": { en: "Continue" }, + "about.link": { en: "About", es: "Acerca de", fr: "À propos", ja: "概要" }, "scale.cosmos": { en: "cosmos", es: "cosmos", fr: "cosmos", ja: "宇宙" }, "scale.orbit": { en: "orbit", es: "órbita", fr: "orbite", ja: "軌道" }, "scale.sky": { en: "sky", es: "cielo", fr: "ciel", ja: "空" }, diff --git a/simulator/static/index.html b/simulator/static/index.html index 803e989..1fc144a 100644 --- a/simulator/static/index.html +++ b/simulator/static/index.html @@ -15,6 +15,7 @@

Human Experience Filter — Alteration Preview

+ About ⓘ Credits & licenses
diff --git a/tools/build_static.py b/tools/build_static.py index 5cbfb66..34972f3 100644 --- a/tools/build_static.py +++ b/tools/build_static.py @@ -36,7 +36,7 @@ from simulator.app import MEDIA_DIR, create_app STATIC = Path(__file__).resolve().parent.parent / "simulator" / "static" # Frontend files that ship; everything else in static/ (author*, review*) is dev-only. PUBLIC_ASSETS = ["index.html", "app.js", "scrub.js", "i18n.js", "alteration.js", "style.css", - "credits.html", "credits.js"] + "credits.html", "credits.js", "about.html", "flash.js"] def _bake_api(app_dir: Path) -> dict: