diff --git a/CHANGELOG.d/1.3.0-focus-event-lineage-from-report-member.md b/CHANGELOG.d/1.3.0-focus-event-lineage-from-report-member.md new file mode 100644 index 000000000..33f0436a9 --- /dev/null +++ b/CHANGELOG.d/1.3.0-focus-event-lineage-from-report-member.md @@ -0,0 +1,4 @@ +# 1.3.0 Focus Event Lineage from a report member + +Open Public post from the landed Demo Corp members and the popup Event +Lineage heading takes focus. Home list opens do not. diff --git a/CHANGELOG.md b/CHANGELOG.md index 98bd39366..5e98c688b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ All notable changes to this project are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.3.0] - 2026-08-17 + +### Added + +- Opening Public post from the landed Demo Corp members focuses the + popup Event Lineage heading, matching the next-action copy. Home + post-list opens do not steal that focus. No TEPP theta is invented. + ## [1.2.0] - 2026-08-17 ### Added diff --git a/frontend/package.json b/frontend/package.json index 887fc38d4..0361d7c2b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "frontend", "private": true, - "version": "1.2.0", + "version": "1.3.0", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/src/App.test.tsx b/frontend/src/App.test.tsx index 0ffdea3ac..5aa1b02dd 100644 --- a/frontend/src/App.test.tsx +++ b/frontend/src/App.test.tsx @@ -1470,6 +1470,7 @@ describe("App, authenticated", () => { // page, not a flat list -- two SVGs (home + popup) share the fork. expect(screen.getAllByLabelText("A-100 lineage").length).toBeGreaterThanOrEqual(2); expect(screen.getAllByLabelText("Open post: Pricing renegotiation follow-up").length).toBeGreaterThanOrEqual(2); + expect(document.getElementById("post-event-lineage")).not.toHaveFocus(); }); it("shows a seeded Ask exchange without an orchestrator round-trip", async () => { @@ -2264,6 +2265,7 @@ describe("App, authenticated", () => { expect( screen.getAllByRole("heading", { name: "Event Lineage" }).length, ).toBeGreaterThanOrEqual(2); + expect(document.getElementById("post-event-lineage")).toHaveFocus(); } finally { HTMLElement.prototype.scrollIntoView = originalScrollIntoView; } @@ -2527,6 +2529,7 @@ describe("App, authenticated", () => { expect(screen.getByText("Constructive stance: 2")).toBeInTheDocument(); expect(screen.getAllByText(/Ada West/).length).toBeGreaterThan(0); expect(screen.getAllByLabelText("A-100 lineage").length).toBeGreaterThanOrEqual(2); + expect(document.getElementById("post-event-lineage")).toHaveFocus(); }); it("lets post_admin rebuild the period report", async () => { diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 191e71dac..ce0f8a08a 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1163,6 +1163,7 @@ function PostDetailPopup({ canExtract, graph, liveBodyWarning, + focusEventLineage, onClose, onSelectPost, }: { @@ -1171,6 +1172,7 @@ function PostDetailPopup({ canExtract: boolean; graph: LineageGraph | null; liveBodyWarning?: string | null; + focusEventLineage?: boolean; onClose: () => void; onSelectPost?: (postId: string) => void; }) { @@ -1231,6 +1233,15 @@ function PostDetailPopup({ fetchPostVocEvidence(accessToken, postId).then(setVocEvidence).catch(() => setVocEvidence(null)); }, [postId, accessToken]); + useEffect(() => { + if (!focusEventLineage || !post) { + return; + } + const heading = document.getElementById("post-event-lineage"); + heading?.focus(); + heading?.scrollIntoView?.({ block: "nearest" }); + }, [focusEventLineage, post]); + return (