fix: update tool count to 51, refresh hero copy and login page

- Update stale tool counts (48/49/50) to 51 across all apps, docs, and tests
- Add Meme Generator to landing page bento grid (was missing)
- Add 12 SEO-friendly rotating phrases to hero typing cursor
- Change landing hero subtitle to "Every image tool you need."
- Replace outdated login page copy with branded hero + rotating phrases
This commit is contained in:
SnapOtter
2026-05-10 22:18:11 +08:00
parent 32e7b03ab4
commit 172c0fa772
22 changed files with 125 additions and 52 deletions
+3 -5
View File
@@ -23,9 +23,7 @@ test.describe("Landing Homepage", () => {
test("hero section renders headline and subheadline", async ({ page }) => {
await expect(page.getByText("Your images. Stay yours.")).toBeVisible();
await expect(
page.getByText("The open-source, self-hosted image processing platform."),
).toBeVisible();
await expect(page.getByText("Every image tool you need.")).toBeVisible();
});
test("hero CTA links to GitHub", async ({ page }) => {
@@ -59,9 +57,9 @@ test.describe("Landing Homepage", () => {
});
test("bento grid renders with search and tool count", async ({ page }) => {
await expect(page.getByText("50 tools. Zero cloud dependency.")).toBeVisible();
await expect(page.getByText("51 tools. Zero cloud dependency.")).toBeVisible();
await expect(page.getByPlaceholder("Search tools...")).toBeVisible();
await expect(page.getByText(/Showing 50 of 50 tools/)).toBeVisible();
await expect(page.getByText(/Showing 51 of 51 tools/)).toBeVisible();
});
test("enterprise section renders feature cards", async ({ page }) => {
+6 -6
View File
@@ -9,28 +9,28 @@ test.describe("BentoGrid Interactions", () => {
const input = page.getByPlaceholder("Search tools...");
await input.fill("resize");
await expect(page.getByText("Resize", { exact: true }).first()).toBeVisible();
await expect(page.getByText(/Showing \d+ of 50 tools/)).toBeVisible();
await expect(page.getByText(/Showing \d+ of 51 tools/)).toBeVisible();
});
test("category pill filters tools", async ({ page }) => {
await page.getByText(/AI Tools/).click();
await expect(page.getByText(/Showing 15 of 50 tools/)).toBeVisible();
await expect(page.getByText(/Showing 15 of 51 tools/)).toBeVisible();
await expect(page.getByText("Remove Background")).toBeVisible();
});
test("clicking All resets category filter", async ({ page }) => {
await page.getByText(/AI Tools/).click();
await expect(page.getByText(/Showing 15 of 50 tools/)).toBeVisible();
await expect(page.getByText(/Showing 15 of 51 tools/)).toBeVisible();
await page.getByText(/All \(50\)/).click();
await expect(page.getByText(/Showing 50 of 50 tools/)).toBeVisible();
await page.getByText(/All \(51\)/).click();
await expect(page.getByText(/Showing 51 of 51 tools/)).toBeVisible();
});
test("search with no results shows empty state", async ({ page }) => {
const input = page.getByPlaceholder("Search tools...");
await input.fill("xyznonexistent");
await expect(page.getByText("No tools found. Try a different search.")).toBeVisible();
await expect(page.getByText(/Showing 0 of 50 tools/)).toBeVisible();
await expect(page.getByText(/Showing 0 of 51 tools/)).toBeVisible();
});
test("combined search and category filter works", async ({ page }) => {