Match Home, top nav, hero, and logo wall to the current marketing frames.

Puts Workshops in the header, pairs the hero with a static rule card and breakpoint CTAs, and shows the three pilot marks with no wall label.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
adilalloandCursor committed 2026-11-02 18:50:32 -07:00
1 parent e12e06f7ce
commit 33cdaf135c
47 files changed
+728 -527

No files matched your search

+30 -30
View File
@@ -11,11 +11,11 @@ describe("Page", () => {
render(<Page />);
// Check that all main sections are rendered (using getAllByText since there are multiple instances)
expect(screen.getAllByText("Collaborate").length).toBeGreaterThan(0);
expect(screen.getAllByText("with clarity").length).toBeGreaterThan(0);
expect(screen.getAllByText("Build structure").length).toBeGreaterThan(0);
expect(screen.getAllByText("before you need it").length).toBeGreaterThan(0);
expect(
screen.getAllByText(
"Help your community make important decisions in a way that reflects its unique values.",
"Strong communities agree on four things early. They settle how they talk, who belongs, how they decide and what happens when they disagree. Write yours down together.",
).length,
).toBeGreaterThan(0);
@@ -23,7 +23,7 @@ describe("Page", () => {
// Check CardSteps section (using getAllByText since there are multiple instances)
await waitFor(() => {
expect(
screen.getAllByText("How CommunityRule works").length,
screen.getAllByText("How CommunityRule helps").length,
).toBeGreaterThan(0);
});
expect(
@@ -41,7 +41,7 @@ describe("Page", () => {
});
expect(
screen.getAllByText(
"Every group runs into the same knots. CommunityRule gives you a way through, and a written record of what you decided.",
"Every community runs into the same knots. CommunityRule gives you a way through, and a written record of what you decided.",
).length,
).toBeGreaterThan(0);
@@ -58,20 +58,20 @@ describe("Page", () => {
render(<Page />);
// Check hero banner content (using getAllByText since there are multiple instances)
expect(screen.getAllByText("Collaborate").length).toBeGreaterThan(0);
expect(screen.getAllByText("with clarity").length).toBeGreaterThan(0);
expect(screen.getAllByText("Build structure").length).toBeGreaterThan(0);
expect(screen.getAllByText("before you need it").length).toBeGreaterThan(0);
expect(
screen.getAllByText(
"Help your community make important decisions in a way that reflects its unique values.",
"Strong communities agree on four things early. They settle how they talk, who belongs, how they decide and what happens when they disagree. Write yours down together.",
).length,
).toBeGreaterThan(0);
expect(
screen.getAllByText("Learn how CommunityRule works").length,
screen.getAllByText("Talk to a facilitator").length,
).toBeGreaterThan(0);
const learnLinks = screen.getAllByRole("link", {
name: "Learn how CommunityRule works",
name: "Talk to a facilitator",
});
expect(learnLinks[0]).toHaveAttribute("href", "/how-it-works");
expect(learnLinks[0]).toHaveAttribute("href", "/workshops");
});
test("renders CardSteps section with correct data", async () => {
@@ -80,7 +80,7 @@ describe("Page", () => {
// Wait for dynamically imported CardSteps component to load
await waitFor(() => {
expect(
screen.getAllByText("How CommunityRule works").length,
screen.getAllByText("How CommunityRule helps").length,
).toBeGreaterThan(0);
});
expect(
@@ -91,16 +91,16 @@ describe("Page", () => {
// Check individual card content (using getAllByText since there are multiple instances)
expect(
screen.getAllByText("Document how your community makes decisions").length,
screen.getAllByText("See what has worked for other communities").length,
).toBeGreaterThan(0);
expect(
screen.getAllByText(
"Build an operating manual for a successful community",
"Decide how you will decide, while things are calm",
).length,
).toBeGreaterThan(0);
expect(
screen.getAllByText(
"Get a link to your manual for your group to review and evolve",
"Invite your members and change it together as you grow",
).length,
).toBeGreaterThan(0);
});
@@ -117,11 +117,11 @@ describe("Page", () => {
});
expect(
screen.getAllByText(
"Every group runs into the same knots. CommunityRule gives you a way through, and a written record of what you decided.",
"Every community runs into the same knots. CommunityRule gives you a way through, and a written record of what you decided.",
).length,
).toBeGreaterThan(0);
const learnMore = screen.getAllByRole("link", {
name: "Explore the toolkit",
name: "Explore the patterns",
});
expect(learnMore[0]).toHaveAttribute("href", "/learn");
});
@@ -144,14 +144,14 @@ describe("Page", () => {
// Check that all major components are present by looking for their content
// HeroBanner
expect(screen.getAllByText("Collaborate").length).toBeGreaterThan(0);
expect(screen.getAllByText("Build structure").length).toBeGreaterThan(0);
// Wait for dynamically imported components to load
// LogoWall - should be present (even if just the component structure)
// CardSteps
await waitFor(() => {
expect(
screen.getAllByText("How CommunityRule works").length,
screen.getAllByText("How CommunityRule helps").length,
).toBeGreaterThan(0);
});
@@ -174,7 +174,7 @@ describe("Page", () => {
test("has correct page structure", () => {
render(<Page />);
const mainContainer = screen.getAllByText("Collaborate")[0].closest("div");
const mainContainer = screen.getAllByText("Build structure")[0].closest("div");
expect(mainContainer).toBeInTheDocument();
});
@@ -183,7 +183,7 @@ describe("Page", () => {
// Check CTA button in hero banner
expect(
screen.getAllByText("Learn how CommunityRule works").length,
screen.getAllByText("Talk to a facilitator").length,
).toBeGreaterThan(0);
// Check CTA button in ask organizer section
@@ -196,7 +196,7 @@ describe("Page", () => {
// Check main description (using getAllByText since there are multiple instances)
expect(
screen.getAllByText(
"Help your community make important decisions in a way that reflects its unique values.",
"Strong communities agree on four things early. They settle how they talk, who belongs, how they decide and what happens when they disagree. Write yours down together.",
).length,
).toBeGreaterThan(0);
@@ -213,7 +213,7 @@ describe("Page", () => {
await waitFor(() => {
expect(
screen.getAllByText(
"Every group runs into the same knots. CommunityRule gives you a way through, and a written record of what you decided.",
"Every community runs into the same knots. CommunityRule gives you a way through, and a written record of what you decided.",
).length,
).toBeGreaterThan(0);
});
@@ -228,12 +228,12 @@ describe("Page", () => {
render(<Page />);
// Check all section titles (using getAllByText since there are multiple instances)
expect(screen.getAllByText("Collaborate").length).toBeGreaterThan(0);
expect(screen.getAllByText("Build structure").length).toBeGreaterThan(0);
// Wait for dynamically imported components
await waitFor(() => {
expect(
screen.getAllByText("How CommunityRule works").length,
screen.getAllByText("How CommunityRule helps").length,
).toBeGreaterThan(0);
});
await waitFor(() => {
@@ -254,18 +254,18 @@ describe("Page", () => {
await waitFor(() => {
// Three Step tiles inside CardSteps
expect(
screen.getAllByText("Document how your community makes decisions")
screen.getAllByText("See what has worked for other communities")
.length,
).toBeGreaterThan(0);
});
expect(
screen.getAllByText(
"Build an operating manual for a successful community",
"Decide how you will decide, while things are calm",
).length,
).toBeGreaterThan(0);
expect(
screen.getAllByText(
"Get a link to your manual for your group to review and evolve",
"Invite your members and change it together as you grow",
).length,
).toBeGreaterThan(0);
});
@@ -274,7 +274,7 @@ describe("Page", () => {
render(<Page />);
// Check subtitles (using getAllByText since there are multiple instances)
expect(screen.getAllByText("with clarity").length).toBeGreaterThan(0);
expect(screen.getAllByText("before you need it").length).toBeGreaterThan(0);
// Wait for dynamically imported components
await waitFor(() => {
@@ -287,7 +287,7 @@ describe("Page", () => {
await waitFor(() => {
expect(
screen.getAllByText(
"Every group runs into the same knots. CommunityRule gives you a way through, and a written record of what you decided.",
"Every community runs into the same knots. CommunityRule gives you a way through, and a written record of what you decided.",
).length,
).toBeGreaterThan(0);
});
+28 -28
View File
@@ -28,33 +28,31 @@ describe("Page Flow Integration", () => {
// Hero Banner section
expect(
screen.getByRole("heading", { name: "Collaborate" }),
screen.getByRole("heading", { name: "Build structure" }),
).toBeInTheDocument();
expect(
screen.getByRole("heading", { name: "with clarity" }),
screen.getByRole("heading", { name: "before you need it" }),
).toBeInTheDocument();
expect(
screen.getByText(
"Help your community make important decisions in a way that reflects its unique values.",
"Strong communities agree on four things early. They settle how they talk, who belongs, how they decide and what happens when they disagree. Write yours down together.",
),
).toBeInTheDocument();
const ctaButtons = screen.getAllByRole("link", {
name: "Learn how CommunityRule works",
name: "Talk to a facilitator",
});
expect(ctaButtons.length).toBeGreaterThan(0);
await waitFor(() => {
expect(screen.getByAltText("Food Not Bombs")).toBeInTheDocument();
});
expect(screen.getByAltText("Start COOP")).toBeInTheDocument();
expect(screen.getByAltText("Metagov")).toBeInTheDocument();
expect(screen.getByAltText("Open Civics")).toBeInTheDocument();
expect(screen.getByAltText("Mutual Aid CO")).toBeInTheDocument();
expect(screen.getByAltText("CU Boulder")).toBeInTheDocument();
expect(screen.getByAltText("Boulder Street Medics")).toBeInTheDocument();
expect(screen.getByAltText("Mutual Aid Colorado")).toBeInTheDocument();
expect(screen.queryByAltText("Start COOP")).not.toBeInTheDocument();
await waitFor(() => {
expect(
screen.getByRole("heading", { name: /How CommunityRule works/ }),
screen.getByRole("heading", { name: /How CommunityRule helps/ }),
).toBeInTheDocument();
});
expect(
@@ -63,25 +61,27 @@ describe("Page Flow Integration", () => {
),
).toBeInTheDocument();
expect(
screen.getByText("Document how your community makes decisions"),
screen.getByText("See what has worked for other communities"),
).toBeInTheDocument();
expect(
screen.getByText("Build an operating manual for a successful community"),
screen.getByText("Decide how you will decide, while things are calm"),
).toBeInTheDocument();
expect(
screen.getByText(
"Get a link to your manual for your group to review and evolve",
"Invite your members and change it together as you grow",
),
).toBeInTheDocument();
await waitFor(() => {
expect(screen.getByRole("heading", { name: "Consensus" })).toBeInTheDocument();
expect(
screen.getByRole("heading", { name: "Devolution" }),
).toBeInTheDocument();
});
expect(
screen.getByRole("heading", { name: "Do-ocracy" }),
screen.getByRole("heading", { name: "Consensus" }),
).toBeInTheDocument();
expect(
screen.getByRole("heading", { name: "Devolution" }),
screen.getByRole("heading", { name: "Do-ocracy" }),
).toBeInTheDocument();
expect(
screen.getByRole("heading", { name: "Quadratic Governance" }),
@@ -96,7 +96,7 @@ describe("Page Flow Integration", () => {
});
expect(
screen.getByText(
"Every group runs into the same knots. CommunityRule gives you a way through, and a written record of what you decided.",
"Every community runs into the same knots. CommunityRule gives you a way through, and a written record of what you decided.",
),
).toBeInTheDocument();
@@ -120,11 +120,11 @@ describe("Page Flow Integration", () => {
renderPage();
const ctaLinks = screen.getAllByRole("link", {
name: "Learn how CommunityRule works",
name: "Talk to a facilitator",
});
const ctaLink = ctaLinks[0];
expect(ctaLink).toBeInTheDocument();
expect(ctaLink).toHaveAttribute("href", "/how-it-works");
expect(ctaLink).toHaveAttribute("href", "/workshops");
await user.click(ctaLink);
expect(ctaLink).toBeInTheDocument();
@@ -135,13 +135,13 @@ describe("Page Flow Integration", () => {
await waitFor(() => {
const cards = screen.getAllByText(
/Document how your community|Build an operating manual|Get a link to your manual/,
/See what has worked for other communities|Decide how you will decide|Invite your members and change it together/,
);
expect(cards.length).toBeGreaterThan(0);
});
const cards = screen.getAllByText(
/Document how your community|Build an operating manual|Get a link to your manual/,
/See what has worked for other communities|Decide how you will decide|Invite your members and change it together/,
);
expect(cards.length).toBeGreaterThan(0);
@@ -153,11 +153,11 @@ describe("Page Flow Integration", () => {
renderPage();
await waitFor(() => {
expect(screen.getByText("Consensus")).toBeInTheDocument();
expect(screen.getByText("Devolution")).toBeInTheDocument();
});
expect(screen.queryByText("Solidarity Network")).not.toBeInTheDocument();
expect(screen.getByText("Do-ocracy")).toBeInTheDocument();
expect(screen.getByText("Devolution")).toBeInTheDocument();
expect(screen.getAllByText("Consensus").length).toBeGreaterThan(0);
expect(screen.getAllByText("Do-ocracy").length).toBeGreaterThan(0);
expect(screen.getByText("Quadratic Governance")).toBeInTheDocument();
const seeAll = screen.getByRole("link", { name: "See all templates" });
@@ -189,7 +189,7 @@ describe("Page Flow Integration", () => {
expect(headings.length).toBeGreaterThan(4);
const mainContent = screen.getByText(
/Help your community make important decisions/,
/Strong communities agree on four things early/,
);
expect(mainContent).toBeInTheDocument();
});
@@ -220,15 +220,15 @@ describe("Page Flow Integration", () => {
renderPage();
expect(
screen.getByText(/Help your community make important decisions/),
screen.getByText(/Strong communities agree on four things early/),
).toBeInTheDocument();
await waitFor(() => {
expect(screen.getByText("How CommunityRule works")).toBeInTheDocument();
expect(screen.getByText("How CommunityRule helps")).toBeInTheDocument();
});
await waitFor(() => {
expect(screen.getByText("Consensus")).toBeInTheDocument();
expect(screen.getByText("Devolution")).toBeInTheDocument();
});
await waitFor(() => {
+15 -18
View File
@@ -38,16 +38,16 @@ describe("User Journey Integration", () => {
renderPageWithFooter();
expect(
screen.getByText(/Help your community make important decisions/),
screen.getByText(/Strong communities agree on four things early/),
).toBeInTheDocument();
const learnLinks = screen.getAllByRole("link", {
name: "Learn how CommunityRule works",
name: "Talk to a facilitator",
});
await user.click(learnLinks[0]);
await waitFor(() => {
expect(screen.getByText("How CommunityRule works")).toBeInTheDocument();
expect(screen.getByText("How CommunityRule helps")).toBeInTheDocument();
});
});
@@ -56,10 +56,10 @@ describe("User Journey Integration", () => {
renderPage();
await waitFor(() => {
expect(screen.getByText("Consensus")).toBeInTheDocument();
expect(screen.getByText("Devolution")).toBeInTheDocument();
});
expect(screen.getByText("Do-ocracy")).toBeInTheDocument();
expect(screen.getByText("Devolution")).toBeInTheDocument();
expect(screen.getAllByText("Consensus").length).toBeGreaterThan(0);
expect(screen.getAllByText("Do-ocracy").length).toBeGreaterThan(0);
expect(screen.getByText("Quadratic Governance")).toBeInTheDocument();
const seeHowLinks = screen.getAllByRole("link", {
@@ -109,15 +109,15 @@ describe("User Journey Integration", () => {
await waitFor(() => {
expect(
screen.getByText("Document how your community makes decisions"),
screen.getByText("See what has worked for other communities"),
).toBeInTheDocument();
});
expect(
screen.getByText("Build an operating manual for a successful community"),
screen.getByText("Decide how you will decide, while things are calm"),
).toBeInTheDocument();
expect(
screen.getByText(
"Get a link to your manual for your group to review and evolve",
"Invite your members and change it together as you grow",
),
).toBeInTheDocument();
@@ -156,7 +156,7 @@ describe("User Journey Integration", () => {
});
expect(
screen.getByText(
"Every group runs into the same knots. CommunityRule gives you a way through, and a written record of what you decided.",
"Every community runs into the same knots. CommunityRule gives you a way through, and a written record of what you decided.",
),
).toBeInTheDocument();
@@ -173,11 +173,8 @@ describe("User Journey Integration", () => {
const partnerLogos = logoImages.filter(
(img) =>
img.alt?.includes("Food Not Bombs") ||
img.alt?.includes("Start COOP") ||
img.alt?.includes("Metagov") ||
img.alt?.includes("Open Civics") ||
img.alt?.includes("Mutual Aid CO") ||
img.alt?.includes("CU Boulder"),
img.alt?.includes("Boulder Street Medics") ||
img.alt?.includes("Mutual Aid Colorado"),
);
expect(partnerLogos.length).toBeGreaterThan(0);
});
@@ -193,11 +190,11 @@ describe("User Journey Integration", () => {
test("user completes the full journey from discovery to action", async () => {
renderPageWithFooter();
expect(screen.getByText("Collaborate")).toBeInTheDocument();
expect(screen.getByText("with clarity")).toBeInTheDocument();
expect(screen.getByText("Build structure")).toBeInTheDocument();
expect(screen.getByText("before you need it")).toBeInTheDocument();
await waitFor(() => {
expect(screen.getByText("How CommunityRule works")).toBeInTheDocument();
expect(screen.getByText("How CommunityRule helps")).toBeInTheDocument();
});
await waitFor(() => {