From 5b59795ab37e08f38c9aa7bec21313aaa886c761 Mon Sep 17 00:00:00 2001 From: Vishal Kumar Singh Date: Fri, 24 Apr 2026 16:31:50 +0530 Subject: [PATCH 1/2] fix(downloads): align client release tables with sibling tables Addressing the visual follow-up on #1123: - Drop the leading expander column; move the chevron inside the Release cell so the table reads "Release | Source | Release notes", matching the three-column shape of ReleaseTable used everywhere else on the downloads page. - Zebra-stripe odd rows (rgba(0,0,0,0.03)) so the expanded row visually groups with its trigger; the collapsible sibling row inherits the same tint. - Tighten row paddings (paddingY: 0.5, IconButton size="small" with padding 0.25 and fontSize="inherit") so collapsed row height matches OldReleaseTable/ReleaseTable rather than sitting taller due to the default IconButton footprint. Data shape (ClientReleaseRow) and the Cpp/Node binariesHint text are unchanged; only the rendering layer moved. --- src/components/ClientReleasesTable.tsx | 135 +++++++++++++++++++++++++ src/components/downloads.tsx | 51 ++++++---- 2 files changed, 166 insertions(+), 20 deletions(-) create mode 100644 src/components/ClientReleasesTable.tsx diff --git a/src/components/ClientReleasesTable.tsx b/src/components/ClientReleasesTable.tsx new file mode 100644 index 000000000000..7ab260a98085 --- /dev/null +++ b/src/components/ClientReleasesTable.tsx @@ -0,0 +1,135 @@ +import * as React from "react"; +import Table from "@mui/material/Table"; +import TableBody from "@mui/material/TableBody"; +import TableCell from "@mui/material/TableCell"; +import TableRow from "@mui/material/TableRow"; +import Link from "@mui/material/Link"; +import IconButton from "@mui/material/IconButton"; +import Collapse from "@mui/material/Collapse"; +import Box from "@mui/material/Box"; +import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown"; +import KeyboardArrowUpIcon from "@mui/icons-material/KeyboardArrowUp"; +import Translate from "@docusaurus/Translate"; + +export type ClientReleaseRow = { + release: string; + tarPath: string; + tarText: string; + tarAsc: string; + tarSha: string; + directory: string; + releaseNote: string; + binariesHint?: string; +}; + +const ROW_BG = "rgba(0, 0, 0, 0.03)"; + +function Row({ row, index }: { row: ClientReleaseRow; index: number }) { + const [open, setOpen] = React.useState(false); + const zebra = index % 2 === 1 ? ROW_BG : "inherit"; + return ( + + + + setOpen(!open)} + sx={{ marginRight: 0.5, padding: 0.25 }} + > + {open ? : } + + {row.release} + + + + {row.tarText + " "} + + ( + + asc + + , + + sha512 + + ) + + + + Release Notes + + + + + + + +

+ + All files for this release (including any pre-built binaries): + {" "} + + {row.directory} + +

+ {row.binariesHint ? ( +

+ {row.binariesHint} +

+ ) : null} +
+
+
+
+
+ ); +} + +export default function ClientReleasesTable(props: { + data: ClientReleaseRow[]; +}) { + return ( + + + + {["Release", "Source", "Release notes"].map((header) => ( + + {header} + + ))} + + {props.data.map((row, index) => ( + + ))} + +
+ ); +} diff --git a/src/components/downloads.tsx b/src/components/downloads.tsx index c8e54c2c75fd..7c94c763f201 100644 --- a/src/components/downloads.tsx +++ b/src/components/downloads.tsx @@ -11,6 +11,7 @@ import ReleaseTable from "@site/src/components/ReleaseTable"; import ConnectorTable from "@site/src/components/ConnectorTable"; import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; import OldReleaseTable from "@site/src/components/OldReleaseTable"; +import ClientReleasesTable from "@site/src/components/ClientReleasesTable"; export function CurrentPulsarVersion(): JSX.Element { return <>{pulsarReleases[0]} @@ -182,14 +183,17 @@ export function CppReleasesDownloadTable(): JSX.Element { const tarPath = `${url}apache-pulsar-client-cpp-${version}.tar.gz` return { release: version, - link: url, - linkText: `apache-pulsar-cpp-${version}`, - asc: `${tarPath}.asc`, - sha512: `${tarPath}.sha512` + tarPath, + tarText: `apache-pulsar-client-cpp-${version}.tar.gz`, + tarAsc: `${tarPath}.asc`, + tarSha: `${tarPath}.sha512`, + directory: url, + releaseNote: `https://github.com/apache/pulsar-client-cpp/releases/tag/v${version}`, + binariesHint: "Pre-built DEB, RPM and APK packages (where published) live alongside the source tarball in the directory above.", } }) return
- +
} @@ -201,14 +205,16 @@ export function GoReleasesDownloadTable(): JSX.Element { const tarPath = `${url}apache-pulsar-client-go-${version}-src.tar.gz` return { release: version, - link: url, - linkText: `apache-pulsar-go-${version}`, - asc: `${tarPath}.asc`, - sha512: `${tarPath}.sha512` + tarPath, + tarText: `apache-pulsar-client-go-${version}-src.tar.gz`, + tarAsc: `${tarPath}.asc`, + tarSha: `${tarPath}.sha512`, + directory: url, + releaseNote: `https://github.com/apache/pulsar-client-go/releases/tag/v${version}`, } }) return
- +
} @@ -222,14 +228,17 @@ export function NodeReleasesDownloadTable(): JSX.Element { const tarPath = `${url}apache-pulsar-client-node-${version}.tar.gz` return { release: version, - link: url, - linkText: `apache-pulsar-node-${version}`, - asc: `${tarPath}.asc`, - sha512: `${tarPath}.sha512` + tarPath, + tarText: `apache-pulsar-client-node-${version}.tar.gz`, + tarAsc: `${tarPath}.asc`, + tarSha: `${tarPath}.sha512`, + directory: url, + releaseNote: `https://github.com/apache/pulsar-client-node/releases/tag/v${version}`, + binariesHint: "Platform-specific napi prebuilts (darwin/linux/win, arm64/x64, glibc/musl) are published alongside the source tarball in the directory above.", } }) return
- +
} @@ -242,14 +251,16 @@ export function PythonReleasesDownloadTable(): JSX.Element { const tarPath = `${url}pulsar-client-python-${version}.tar.gz` return { release: version, - link: url, - linkText: `apache-pulsar-python-${version}`, - asc: `${tarPath}.asc`, - sha512: `${tarPath}.sha512` + tarPath, + tarText: `pulsar-client-python-${version}.tar.gz`, + tarAsc: `${tarPath}.asc`, + tarSha: `${tarPath}.sha512`, + directory: url, + releaseNote: `https://github.com/apache/pulsar-client-python/releases/tag/v${version}`, } }) return
- +
} From 1820f461f51808b8729d8a09cdbb8aca2c910ed9 Mon Sep 17 00:00:00 2001 From: Vishal Kumar Singh Date: Mon, 11 May 2026 21:58:33 +0530 Subject: [PATCH 2/2] docs(downloads): note Node archive filter and tarball fallback Merge upstream main into docs-23836-client-download-links so CI tracks current site. Document why early client-node tags are filtered out of the table, and point readers at the expanded ASF directory row when a hot-linked tarball is missing on the mirror. Co-authored-by: Cursor --- src/components/downloads.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/downloads.tsx b/src/components/downloads.tsx index 7c94c763f201..e3c98f90fc87 100644 --- a/src/components/downloads.tsx +++ b/src/components/downloads.tsx @@ -219,6 +219,9 @@ export function GoReleasesDownloadTable(): JSX.Element { } export function NodeReleasesDownloadTable(): JSX.Element { + // Releases omitted here never shipped under the current ASF path + // `dist/pulsar/pulsar-client-node/pulsar-client-node-/` with the matching tarball name. + // Extend only after checking https://archive.apache.org/dist/pulsar/pulsar-client-node/ (or HEAD on the tarball URL). const excludedVersions = ["1.0.0", "1.1.0", "1.2.0", "1.3.0", "1.3.1", "1.4.0", "1.3.2", "1.6.2", "1.5.0", "1.4.1"]; const data = nodeReleases .map(item => item.tagName.substring(1)) @@ -234,7 +237,8 @@ export function NodeReleasesDownloadTable(): JSX.Element { tarSha: `${tarPath}.sha512`, directory: url, releaseNote: `https://github.com/apache/pulsar-client-node/releases/tag/v${version}`, - binariesHint: "Platform-specific napi prebuilts (darwin/linux/win, arm64/x64, glibc/musl) are published alongside the source tarball in the directory above.", + binariesHint: + "Platform-specific napi prebuilts (darwin/linux/win, arm64/x64, glibc/musl) are published alongside the source tarball in the directory above. If a direct tarball link fails, use the expanded directory listing for the authoritative file set.", } }) return