From 49c9b8a818c1d89e49e0bb281d410915aa5000ec Mon Sep 17 00:00:00 2001 From: brsbl <57682038+brsbl@users.noreply.github.com> Date: Tue, 22 Sep 2026 23:20:09 -0700 Subject: [PATCH 1/4] feat(plugins): move category into the detail byline and refresh overview typography Replace the tinted category pill beside the plugin title with a category-colored dot and underlined link in the byline that opens the category shelf in Browse. Hang the author avatar under the plugin icon so title and byline text share one column, and drop the Marketplace detail row for BB Official plugins since the byline already names it. Rework overview prose: 13px summary line, sentence-case subheads, code chips without vertical padding, and a 65ch reading width. Co-Authored-By: Claude Opus 5.5 (1M context) --- .../plugin/management/PluginCard.tsx | 48 +++++++++---- .../management/PluginMarketplaceListing.tsx | 70 +++++++++++++++---- .../management/PluginOverviewMarkdown.tsx | 26 +++++-- .../plugin/management/plugin-ui.test.tsx | 10 +-- .../plugin/management/plugin-ui.tsx | 38 ---------- .../app/src/components/tools/PluginDetail.tsx | 43 ++++++------ .../PluginsAndSkillsDetailStates.stories.tsx | 14 +++- .../views/ToolsView.plugin-detail.test.tsx | 26 +++++++ .../ui/resource/detail-sections.tsx | 64 ++++++++++------- 9 files changed, 214 insertions(+), 125 deletions(-) diff --git a/apps/app/src/components/plugin/management/PluginCard.tsx b/apps/app/src/components/plugin/management/PluginCard.tsx index fd259082026..49938430a67 100644 --- a/apps/app/src/components/plugin/management/PluginCard.tsx +++ b/apps/app/src/components/plugin/management/PluginCard.tsx @@ -81,27 +81,45 @@ interface PluginCardAuthorProps { >; } +function pluginCardAuthorName(entry: PluginCardAuthorProps["entry"]): string { + return entry.marketplace === "bb-official" + ? "BB Official" + : (entry.author?.name ?? entry.publisherLabel); +} + +export function PluginCardAuthorAvatar({ entry }: PluginCardAuthorProps) { + return ( + + ); +} + +export function PluginCardAuthorName({ entry }: PluginCardAuthorProps) { + const name = pluginCardAuthorName(entry); + return entry.author === null ? ( + name + ) : ( + + {name} + + ); +} + export function PluginCardAuthor({ entry }: PluginCardAuthorProps) { - const name = - entry.marketplace === "bb-official" - ? "BB Official" - : (entry.author?.name ?? entry.publisherLabel); return ( - {entry.author === null ? ( - name - ) : ( - - {name} - - )} + ); } diff --git a/apps/app/src/components/plugin/management/PluginMarketplaceListing.tsx b/apps/app/src/components/plugin/management/PluginMarketplaceListing.tsx index 5cfffa7a0f5..904cb2066ad 100644 --- a/apps/app/src/components/plugin/management/PluginMarketplaceListing.tsx +++ b/apps/app/src/components/plugin/management/PluginMarketplaceListing.tsx @@ -1,4 +1,5 @@ import { useEffect, useMemo, useState, type ReactNode } from "react"; +import { Link } from "react-router-dom"; import { Carousel, CarouselContent, @@ -17,23 +18,57 @@ import { } from "@bb/shared-ui/resource-list"; import type { PluginCatalogSearchEntry } from "@/hooks/queries/plugin-catalog-queries"; import { PluginOverviewMarkdown } from "@/components/plugin/management/PluginOverviewMarkdown"; +import { getPluginsRoutePath } from "@/lib/route-paths"; +import { PluginCardAuthorName } from "./PluginCard"; import { CatalogEntryIconChip, formatUrlLabel, - PluginCategoryLabel, + pluginCatalogCategoryMutedAccentStyle, } from "./plugin-ui"; import { entriesByMarketplaceAuthor, pluginMarketplaceAuthorKey, } from "./plugin-marketplace-author"; -export function PluginMarketplaceCategoryPill({ +export function PluginMarketplaceByline({ entry, }: { - entry: PluginCatalogSearchEntry; + entry: Pick< + PluginCatalogSearchEntry, + "author" | "marketplace" | "publisherLabel" | "category" | "categoryId" + >; }) { - return entry.category === undefined ? null : ( - + return ( + + + + + {entry.category === undefined ? null : ( + + + {entry.categoryId === undefined ? ( + {entry.category} + ) : ( + + {entry.category} + + )} + + )} + ); } @@ -63,9 +98,11 @@ export function PluginMarketplaceDetailMetadata({ }) { return ( <> - - {entry.marketplaceDisplayName} - + {entry.marketplace === "bb-official" ? null : ( + + {entry.marketplaceDisplayName} + + )} {entry.publishedAt === undefined ? null : (