diff --git a/src/routes/nook/changelog.tsx b/src/routes/nook/changelog.tsx index 4dd4867..9ee190e 100644 --- a/src/routes/nook/changelog.tsx +++ b/src/routes/nook/changelog.tsx @@ -5,8 +5,13 @@ * launch, so this page renders exactly what Sparkle publishes: one source * of truth, no second place to write release notes. Doubles as the raw * material for the release-announcement job (marketing/README.md). + * + * Layout: the version list lives in a fixed-height vertical scroller, so + * expanding a release never shifts the page — history is browsed inside + * the panel. Rows collapse to their header; notes stay in the DOM + * (visibility toggled, not unmounted) so crawlers still see every entry. */ -import { For, Show } from "solid-js"; +import { For, Show, createSignal } from "solid-js"; import { query, createAsync } from "@solidjs/router"; import { PageHead } from "~/components/PageHead"; import { EdgeCacheHeaders } from "~/components/EdgeCacheHeaders"; @@ -20,6 +25,11 @@ const getReleases = query(async () => { export default function NookChangelogPage() { const releases = createAsync(() => getReleases()); + // Newest release starts open; every other row starts collapsed. + const [openVersion, setOpenVersion] = createSignal(null); + + const isOpen = (version: string, index: number) => + openVersion() === null ? index === 0 : openVersion() === version; return ( <> @@ -47,12 +57,24 @@ export default function NookChangelogPage() {

} > -
+
- {(release) => ( -
-
-

+ {(release, i) => ( +
+

+ {/* Notes are the publisher's own HTML, written to the same - S3 appcast the Sparkle updater consumes. */} + S3 appcast the Sparkle updater consumes. Kept mounted + and toggled via `hidden` so the content stays crawlable. */}