diff --git a/src/__tests__/creators-route.test.tsx b/src/__tests__/creators-route.test.tsx index c2e1e6ac..428a4830 100644 --- a/src/__tests__/creators-route.test.tsx +++ b/src/__tests__/creators-route.test.tsx @@ -176,6 +176,22 @@ describe("creators route", () => { expect(screen.getByText("No publishers found")).toBeTruthy(); }); + it("labels highlighted publishers as popular creators", async () => { + loaderDataMock.mockReturnValue({ + page: [{ _id: "publishers:one" }], + counts: { all: 1, organizations: 0, individuals: 1 }, + continueCursor: "", + isDone: true, + }); + const route = await loadRoute(); + const Component = route.__config.component as ComponentType; + + render(); + + expect(screen.getByRole("heading", { name: "Popular creators" })).toBeTruthy(); + expect(screen.queryByText("Popular publishers")).toBeNull(); + }); + it("does not present the bounded publisher result count as a global total", async () => { loaderDataMock.mockReturnValue({ page: [], @@ -192,7 +208,7 @@ describe("creators route", () => { expect(screen.getByRole("heading", { name: "Creators" })).toBeTruthy(); expect(screen.queryByText("17")).toBeNull(); expect(screen.getByRole("radio", { name: "All" })).toBeTruthy(); - expect(screen.getByRole("radio", { name: "Verified" })).toBeTruthy(); + expect(screen.getByRole("radio", { name: "Official" })).toBeTruthy(); expect(screen.getByRole("radio", { name: "Organizations" })).toBeTruthy(); expect(screen.getByRole("radio", { name: "Users" })).toBeTruthy(); expect(screen.queryByText("Builders")).toBeNull(); diff --git a/src/__tests__/home-listing-section.test.tsx b/src/__tests__/home-listing-section.test.tsx index 45482b77..ccf092a7 100644 --- a/src/__tests__/home-listing-section.test.tsx +++ b/src/__tests__/home-listing-section.test.tsx @@ -160,7 +160,7 @@ describe("HomeListingSection", () => { "Trending", ]); expect(screen.queryByRole("tab", { name: "New" })).toBeNull(); - expect(screen.queryByRole("tab", { name: "Verified" })).toBeNull(); + expect(screen.queryByRole("tab", { name: "Official" })).toBeNull(); expect(screen.getByText("Demo Plugin")).toBeTruthy(); expect(document.querySelector(".home-v2-listing-grid")).toBeTruthy(); expect(document.querySelector(".marketplace-icon-image")?.getAttribute("src")).toBe( diff --git a/src/__tests__/package-detail-route.test.tsx b/src/__tests__/package-detail-route.test.tsx index 381a07d4..b7558613 100644 --- a/src/__tests__/package-detail-route.test.tsx +++ b/src/__tests__/package-detail-route.test.tsx @@ -1117,7 +1117,7 @@ describe("plugin detail route", () => { expect(packageCrumb?.textContent).toBe("firecrawl-plugin"); }); - it("labels official packages as Verified", async () => { + it("labels official packages as Official", async () => { loaderDataMock = { ...loaderDataMock, detail: { @@ -1134,10 +1134,10 @@ describe("plugin detail route", () => { const { container } = render(); - expect(screen.getAllByLabelText("Verified").length).toBeGreaterThan(0); + expect(screen.getAllByLabelText("Official").length).toBeGreaterThan(0); expect(container.querySelector(".skill-hero-creator .official-badge-icon-only")).toBeTruthy(); expect(container.querySelector(".skill-hero-title-row .official-tag")).toBeNull(); - expect(screen.queryByText("Verified")).toBeNull(); + expect(screen.queryByText("Official")).toBeNull(); }); it("renders plugin activity skeletons while graphs load", async () => { diff --git a/src/__tests__/packages-route.test.tsx b/src/__tests__/packages-route.test.tsx index 8d920590..957b3e0a 100644 --- a/src/__tests__/packages-route.test.tsx +++ b/src/__tests__/packages-route.test.tsx @@ -1584,7 +1584,7 @@ describe("plugins route", () => { render(); expect(screen.getByRole("radio", { name: "All" }).getAttribute("aria-checked")).toBe("true"); - expect(screen.getByRole("radio", { name: "Verified" })).toBeTruthy(); + expect(screen.getByRole("radio", { name: "Official" })).toBeTruthy(); expect(screen.getByRole("radio", { name: "Updated" })).toBeTruthy(); expect(screen.queryByRole("radio", { name: "Relevance" })).toBeNull(); }); @@ -1730,7 +1730,7 @@ describe("plugins route", () => { const sortOptions = Array.from( screen.getByRole("radiogroup", { name: "Sort order" }).querySelectorAll('[role="radio"]'), ).map((option) => option.textContent); - expect(sortOptions).toEqual(["All", "Trending", "Verified", "Updated"]); + expect(sortOptions).toEqual(["All", "Trending", "Official", "Updated"]); expect(screen.queryByRole("radio", { name: "Most downloaded" })).toBeNull(); expect(screen.queryByRole("radio", { name: "Newest" })).toBeNull(); expect(screen.queryByRole("radio", { name: "Name" })).toBeNull(); diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index d0e3cbf9..0d11a92a 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -22,7 +22,7 @@ const FOOTER_EASTER_ASCII = [ " hooks runners slash-commands skill.md templates scanners review-bots", "openclaw ecosystem crabbox clickclack crawler packs gateway plugins", "---- downloads installs stars lineage ownership docs package integrity", - " safe browse paths verified gateways publisher handles org trust", + " safe browse paths official gateways publisher handles org trust", ]; const FOOTER_EASTER_ASCII_FIELD = Array.from({ length: 44 }, (_, row) => { const a = FOOTER_EASTER_ASCII[row % FOOTER_EASTER_ASCII.length]; diff --git a/src/components/HomeBringSkillsSection.tsx b/src/components/HomeBringSkillsSection.tsx index 883ca947..072926bd 100644 --- a/src/components/HomeBringSkillsSection.tsx +++ b/src/components/HomeBringSkillsSection.tsx @@ -12,7 +12,7 @@ const BYOS_ASCII = [ " hooks runners slash-commands skill.md templates scanners review-bots", "openclaw ecosystem crabbox clickclack crawler packs gateway plugins", "---- downloads installs stars lineage ownership docs package integrity", - " safe browse paths verified gateways publisher handles org trust", + " safe browse paths official gateways publisher handles org trust", ]; const BYOS_ASCII_FIELD = Array.from({ length: 56 }, (_, row) => { const a = BYOS_ASCII[row % BYOS_ASCII.length]; diff --git a/src/components/OfficialBadge.tsx b/src/components/OfficialBadge.tsx index 16bf1b99..73628209 100644 --- a/src/components/OfficialBadge.tsx +++ b/src/components/OfficialBadge.tsx @@ -10,10 +10,10 @@ export function OfficialTag({ className }: { className?: string }) { ? `official-tag rounded-[var(--oc-radius-control)] ${className}` : "official-tag rounded-[var(--oc-radius-control)]" } - aria-label="Verified" + aria-label="Official" > - Verified + Official ); } @@ -29,14 +29,14 @@ export function OfficialBadge({ className, iconOnly = false, size = 12 }: Offici const iconClassName = className ? `official-badge-icon-only ${className}` : "official-badge-icon-only"; - return ; + return ; } return ( diff --git a/src/components/PluginListItem.test.tsx b/src/components/PluginListItem.test.tsx index edd18b47..f20e8fe6 100644 --- a/src/components/PluginListItem.test.tsx +++ b/src/components/PluginListItem.test.tsx @@ -14,16 +14,16 @@ describe("PluginListItem", () => { it("renders official list plugins with the compact official mark", () => { render(); - expect(screen.getByLabelText("Verified")).toBeTruthy(); - expect(screen.queryByText("Verified")).toBeNull(); + expect(screen.getByLabelText("Official")).toBeTruthy(); + expect(screen.queryByText("Official")).toBeNull(); expect(screen.queryByText("Verified")).toBeNull(); }); it("renders official plugin cards with the compact official mark", () => { render(); - expect(screen.getByLabelText("Verified")).toBeTruthy(); - expect(screen.queryByText("Verified")).toBeNull(); + expect(screen.getByLabelText("Official")).toBeTruthy(); + expect(screen.queryByText("Official")).toBeNull(); expect(screen.queryByText("Verified")).toBeNull(); }); diff --git a/src/components/PublishedItemCard.test.tsx b/src/components/PublishedItemCard.test.tsx index 4066df76..064de526 100644 --- a/src/components/PublishedItemCard.test.tsx +++ b/src/components/PublishedItemCard.test.tsx @@ -98,8 +98,8 @@ describe("PublishedItemCard", () => { it("renders the compact official mark for official published rows", () => { render(); - expect(screen.getByLabelText("Verified")).toBeTruthy(); - expect(screen.queryByText("Verified")).toBeNull(); + expect(screen.getByLabelText("Official")).toBeTruthy(); + expect(screen.queryByText("Official")).toBeNull(); }); it("does not add source-backed chrome to GitHub-backed skill rows", () => { diff --git a/src/components/PublisherListItem.test.tsx b/src/components/PublisherListItem.test.tsx index 88f2918e..82cdc161 100644 --- a/src/components/PublisherListItem.test.tsx +++ b/src/components/PublisherListItem.test.tsx @@ -15,8 +15,9 @@ describe("PublisherListItem", () => { it("renders official publishers with the compact official mark", () => { const { container } = render(); - expect(screen.getByLabelText("Verified")).toBeTruthy(); - expect(screen.queryByText("Verified")).toBeNull(); + expect(screen.getByLabelText("Official")).toBeTruthy(); + expect(screen.queryByText("Official")).toBeNull(); + expect(screen.queryByText("Org")).toBeNull(); expect(container.querySelector(".official-badge")).toBeTruthy(); }); diff --git a/src/components/PublisherListItem.tsx b/src/components/PublisherListItem.tsx index 10e78e9f..d20b1154 100644 --- a/src/components/PublisherListItem.tsx +++ b/src/components/PublisherListItem.tsx @@ -58,7 +58,6 @@ export function PublisherListItem({ publisher, variant = "list" }: PublisherList {publisher.displayName} {publisher.official ? : null} - {publisher.kind === "org" ? Org : null} @{handle} diff --git a/src/components/SkillCard.test.tsx b/src/components/SkillCard.test.tsx index 9aaa9b50..641db3e6 100644 --- a/src/components/SkillCard.test.tsx +++ b/src/components/SkillCard.test.tsx @@ -16,14 +16,14 @@ describe("SkillCard", () => { const { container } = render( meta} />, ); - expect(screen.getByLabelText("Verified")).toBeTruthy(); - expect(screen.queryByText("Verified")).toBeNull(); + expect(screen.getByLabelText("Official")).toBeTruthy(); + expect(screen.queryByText("Official")).toBeNull(); expect(container.querySelector(".official-badge")).toBeTruthy(); }); @@ -37,7 +37,7 @@ describe("SkillCard", () => { />, ); - expect(screen.getByLabelText("Verified")).toBeTruthy(); + expect(screen.getByLabelText("Official")).toBeTruthy(); expect(container.querySelector(".official-badge")).toBeTruthy(); }); diff --git a/src/components/SkillCard.tsx b/src/components/SkillCard.tsx index 3cfe0f3d..9bd1d89b 100644 --- a/src/components/SkillCard.tsx +++ b/src/components/SkillCard.tsx @@ -37,12 +37,12 @@ export function SkillCard({ const ownerSegment = encodeURIComponent(String(skill.ownerUserId)); const link = href ?? `/${ownerSegment}/${skill.slug}`; const badges = Array.isArray(badge) ? badge : badge ? [badge] : []; - const isOfficial = badges.includes("Verified") || owner?.official === true; - const nonOfficialBadges = badges.filter((label) => label !== "Verified"); + const isOfficial = badges.includes("Official") || owner?.official === true; + const nonOfficialBadges = badges.filter((label) => label !== "Official"); const visibleBadges = ownerHandle ? nonOfficialBadges : isOfficial - ? ["Verified", ...nonOfficialBadges] + ? ["Official", ...nonOfficialBadges] : badges; const primaryCategory = getSkillCategoryForSkill(skill); const hasSecondaryTags = @@ -88,7 +88,7 @@ export function SkillCard({ ) : null} {visibleBadges.map((label) => - label === "Verified" ? ( + label === "Official" ? ( ) : ( {label} diff --git a/src/components/SkillHeader.tsx b/src/components/SkillHeader.tsx index a71af49d..72d3457d 100644 --- a/src/components/SkillHeader.tsx +++ b/src/components/SkillHeader.tsx @@ -179,7 +179,7 @@ export function SkillHeader({ const hasOwnerActions = Boolean(newVersionHref) || Boolean(settingsHref); const showReportAction = !canManage || isStaff; const badges = getSkillBadges(skill); - const titleBadges = badges.filter((badge) => badge !== "Verified"); + const titleBadges = badges.filter((badge) => badge !== "Official"); const heroCreatorPublisher = useHeroCreatorPublisher({ owner, skillOfficial: isSkillOfficial(skill), diff --git a/src/components/SkillListItem.test.tsx b/src/components/SkillListItem.test.tsx index 8b1daa40..bc1f7e11 100644 --- a/src/components/SkillListItem.test.tsx +++ b/src/components/SkillListItem.test.tsx @@ -27,8 +27,8 @@ describe("SkillListItem", () => { />, ); - expect(screen.getByLabelText("Verified")).toBeTruthy(); - expect(screen.queryByText("Verified")).toBeNull(); + expect(screen.getByLabelText("Official")).toBeTruthy(); + expect(screen.queryByText("Official")).toBeNull(); expect(container.querySelector(".official-badge")).toBeTruthy(); }); @@ -37,7 +37,7 @@ describe("SkillListItem", () => { , ); - expect(screen.getByLabelText("Verified")).toBeTruthy(); + expect(screen.getByLabelText("Official")).toBeTruthy(); expect(container.querySelector(".official-badge")).toBeTruthy(); }); diff --git a/src/components/SkillListItem.tsx b/src/components/SkillListItem.tsx index c2407bd3..3cc77821 100644 --- a/src/components/SkillListItem.tsx +++ b/src/components/SkillListItem.tsx @@ -29,7 +29,7 @@ export function SkillListItem({ const href = hrefOverride ?? `/${encodeURIComponent(ownerSegment)}/${encodeURIComponent(skill.slug)}`; const badges = getSkillBadges(skill); - const isOfficial = badges.includes("Verified") || owner?.official === true; + const isOfficial = badges.includes("Official") || owner?.official === true; const categories = getSkillCategoriesForSkill(skill); const categoryLabel = categories .slice(0, 3) @@ -49,7 +49,7 @@ export function SkillListItem({ {isOfficial ? : null} {badges - .filter((badge) => badge !== "Verified") + .filter((badge) => badge !== "Official") .map((badge) => ( {badge} diff --git a/src/components/UserBadge.test.tsx b/src/components/UserBadge.test.tsx index b4323d97..b5313149 100644 --- a/src/components/UserBadge.test.tsx +++ b/src/components/UserBadge.test.tsx @@ -134,10 +134,10 @@ describe("UserBadge", () => { ); }); - it("shows a compact Verified badge for official publishers", () => { + it("shows a compact Official badge for official publishers", () => { const { container } = renderBadge(orgPublisher); - expect(screen.getByLabelText("Verified")).toBeTruthy(); + expect(screen.getByLabelText("Official")).toBeTruthy(); expect(container.querySelector(".official-badge")).toBeTruthy(); expect(container.querySelector(".official-tag")).toBeFalsy(); }); diff --git a/src/lib/badges.test.ts b/src/lib/badges.test.ts index 4d7c834b..f6265d75 100644 --- a/src/lib/badges.test.ts +++ b/src/lib/badges.test.ts @@ -67,12 +67,12 @@ describe("badges", () => { ).toEqual(["Deprecated"]); }); - it("returns Verified when official is set", () => { + it("returns Official when official is set", () => { expect( getSkillBadges({ badges: { official: { byUserId: "user1" as never, at: 123 } }, }), - ).toEqual(["Verified"]); + ).toEqual(["Official"]); }); it("does not surface Highlighted as a trust badge", () => { @@ -92,7 +92,7 @@ describe("badges", () => { highlighted: { byUserId: "user1" as never, at: 123 }, }, }), - ).toEqual(["Deprecated", "Verified"]); + ).toEqual(["Deprecated", "Official"]); }); }); }); diff --git a/src/lib/badges.ts b/src/lib/badges.ts index c54a7641..df5b6e1b 100644 --- a/src/lib/badges.ts +++ b/src/lib/badges.ts @@ -6,7 +6,7 @@ type SkillBadgeMap = Partial; at: numb type SkillLike = { badges?: SkillBadgeMap | null }; -type BadgeLabel = "Deprecated" | "Verified"; +type BadgeLabel = "Deprecated" | "Official"; export function isSkillHighlighted(skill: SkillLike) { return Boolean(skill.badges?.highlighted); @@ -23,6 +23,6 @@ export function isSkillDeprecated(skill: SkillLike) { export function getSkillBadges(skill: SkillLike): BadgeLabel[] { const badges: BadgeLabel[] = []; if (isSkillDeprecated(skill)) badges.push("Deprecated"); - if (isSkillOfficial(skill)) badges.push("Verified"); + if (isSkillOfficial(skill)) badges.push("Official"); return badges; } diff --git a/src/routes/-management/PluginsPage.tsx b/src/routes/-management/PluginsPage.tsx index b1fd301c..770c4663 100644 --- a/src/routes/-management/PluginsPage.tsx +++ b/src/routes/-management/PluginsPage.tsx @@ -91,7 +91,7 @@ export function PluginsPage({ {plugin.channel} - {plugin.isOfficial ? Verified : null} + {plugin.isOfficial ? Official : null} {plugin.runtimeId ? {plugin.runtimeId} : null} diff --git a/src/routes/-management/SkillsPage.tsx b/src/routes/-management/SkillsPage.tsx index a8a55925..4193c293 100644 --- a/src/routes/-management/SkillsPage.tsx +++ b/src/routes/-management/SkillsPage.tsx @@ -407,7 +407,7 @@ export function SkillsPage({ type="button" onClick={() => onSetOfficialBadge(skill._id, !isOfficial)} > - {isOfficial ? "Remove verified" : "Mark verified"} + {isOfficial ? "Remove official" : "Mark official"} , }, { value: "orgs", label: "Organizations", mobileLabel: "Orgs" }, @@ -344,7 +344,7 @@ function PublishersIndex() { {highlightedPublishers.length > 0 ? ( - Popular publishers + Popular creators {highlightedPublishers.map((publisher) => ( diff --git a/src/routes/plugins/index.tsx b/src/routes/plugins/index.tsx index 15e12bac..8f0dde4a 100644 --- a/src/routes/plugins/index.tsx +++ b/src/routes/plugins/index.tsx @@ -63,7 +63,7 @@ const PLUGIN_BROWSE_TABS = [ { value: "trending", label: "Trending" }, { value: "official", - label: "Verified", + label: "Official", icon: , }, { value: "updated", label: "Updated" }, diff --git a/src/routes/settings.tsx b/src/routes/settings.tsx index 68a6a397..1e9f5e43 100644 --- a/src/routes/settings.tsx +++ b/src/routes/settings.tsx @@ -1662,7 +1662,7 @@ export function Settings() { /> ) : ( - You need a verified publisher profile before adding GitHub skill sync. + You need an official publisher profile before adding GitHub skill sync. )}
- You need a verified publisher profile before adding GitHub skill sync. + You need an official publisher profile before adding GitHub skill sync.