diff --git a/apps/website/src/components/Topbar.tsx b/apps/website/src/components/Topbar.tsx
index bc65eae..1f02d9c 100644
--- a/apps/website/src/components/Topbar.tsx
+++ b/apps/website/src/components/Topbar.tsx
@@ -1,23 +1,20 @@
-import { NAV_LINKS } from "../content.js";
+import { NAV_LINKS, TOPBAR } from "../content.js";
+// Product row of the shared sticky header (brand book §08): glyph, then the bold product
+// name and a short context line, ahead of the site's own nav anchors. The reDeploy-specific
+// chevron mark previously rendered here was dropped — the family brand mark already anchors
+// the statusbar row above it, and duplicating a logo across both rows of the same sticky
+// header read as redundant. See the PR description for the full rationale.
export default function Topbar() {
return (
-
-
-
-
-
-
-
+
+ {TOPBAR.glyph}
+
re Deploy
- {" "}
-
^^
+
+
— {TOPBAR.tagline}
{NAV_LINKS.map((link) => (
diff --git a/apps/website/src/content.ts b/apps/website/src/content.ts
index aaead59..a77b07e 100644
--- a/apps/website/src/content.ts
+++ b/apps/website/src/content.ts
@@ -29,6 +29,13 @@ export const NAV_LINKS: NavLink[] = [
{ label: "github", href: REPO_URL },
];
+// Product row (brand book §08): glyph + bold product name + short context, ahead of the
+// site's own nav anchors. Kept short — this is a strip, not the hero subhead.
+export const TOPBAR = {
+ glyph: "^^",
+ tagline: "declarative, idempotent, verifiable deploys",
+};
+
export const HERO = {
headline: [{ text: "One spec. One graph. " }, { text: "One truth.", as: "hl" }] as RichSegment[],
subhead: [
diff --git a/apps/website/src/styles.css b/apps/website/src/styles.css
index 16a31be..37ce7c7 100644
--- a/apps/website/src/styles.css
+++ b/apps/website/src/styles.css
@@ -133,9 +133,8 @@ body {
font-size: 12px;
}
-.topbar .mark {
- width: 30px;
- height: 30px;
+.topbar .chev {
+ font-weight: 700;
}
.topbar b {
@@ -148,6 +147,10 @@ body {
font-weight: 500;
}
+.topbar .tagline {
+ color: var(--dim);
+}
+
.topbar nav {
margin-left: auto;
display: flex;
diff --git a/apps/website/test/Topbar.test.tsx b/apps/website/test/Topbar.test.tsx
new file mode 100644
index 0000000..877671c
--- /dev/null
+++ b/apps/website/test/Topbar.test.tsx
@@ -0,0 +1,27 @@
+import { render, screen } from "@testing-library/react";
+import Topbar from "../src/components/Topbar.js";
+import { NAV_LINKS, TOPBAR } from "../src/content.js";
+
+describe("Topbar", () => {
+ it("renders the shared header's product row: glyph, bold name, then a short context", () => {
+ const { container } = render( );
+
+ expect(screen.getByText(TOPBAR.glyph)).toBeInTheDocument();
+ expect(container.querySelector("b")?.textContent).toBe("reDeploy");
+ expect(container.textContent).toContain(TOPBAR.tagline);
+
+ // Brand book §08 order: glyph, then name, then context — ahead of the nav.
+ const text = container.textContent ?? "";
+ expect(text.indexOf(TOPBAR.glyph)).toBeLessThan(text.indexOf("reDeploy"));
+ expect(text.indexOf("reDeploy")).toBeLessThan(text.indexOf(TOPBAR.tagline));
+ });
+
+ it("still exposes the site's own nav anchors alongside the product row", () => {
+ render( );
+
+ for (const link of NAV_LINKS) {
+ const anchor = screen.getByRole("link", { name: link.label });
+ expect(anchor).toHaveAttribute("href", link.href);
+ }
+ });
+});
diff --git a/apps/website/test/content.test.ts b/apps/website/test/content.test.ts
index 9c32e74..48e8ea8 100644
--- a/apps/website/test/content.test.ts
+++ b/apps/website/test/content.test.ts
@@ -13,6 +13,7 @@ import {
SPLIT_CAPTION,
STUDIO_SECTION,
STUDIO_URL,
+ TOPBAR,
type RichSegment,
} from "../src/content.js";
@@ -85,6 +86,12 @@ describe("content", () => {
}
});
+ it("has a short, non-empty topbar glyph and tagline for the shared header's product row", () => {
+ expect(TOPBAR.glyph).toBe("^^");
+ expect(TOPBAR.tagline.length).toBeGreaterThan(0);
+ expect(TOPBAR.tagline.length).toBeLessThan(80);
+ });
+
it("has a footer prompt line and a three-entry family strip with exactly one current item", () => {
expect(FOOTER.promptUser).toBe("roberto@thesolidchain:~$");
expect(FOOTER.family).toHaveLength(3);