Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions packages/plugins-ui/src/plugin-card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,9 @@ export function PluginCard({
{pluginOutcome(plugin.descriptor.id, plugin.descriptor.displayName)}
</span>
</div>
<span className="hidden shrink-0 text-xs text-muted-foreground xl:block">
{caption}
</span>
{/* A dense directory row's status column is core information, not
* an overflow item to drop on narrow viewports (CL-6467). */}
<span className="shrink-0 text-xs text-muted-foreground">{caption}</span>
{plugin.status === "not_connected" ? (
// The same single Connect verb the MCP preset rows use — one
// idiom for "not connected yet" across the whole gallery, never
Expand Down
8 changes: 8 additions & 0 deletions packages/plugins-ui/src/plugins-gallery.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,14 @@ export function PluginsGallery({
<div className="flex flex-col gap-4 pt-3">
{active === "plugins" ? (
<>
<div>
<h1 className="text-xl font-extrabold">Plugins</h1>
<p className="mt-1 max-w-[65ch] text-sm text-muted-foreground">
A directory to scan, not tiles to admire — one dense row
per connector, grouped by what it does. Click a row's
name for the full page.
</p>
</div>
<McpPresetCardsSection tenantId={tenantId} query={query} />
<McpServersSection tenantId={tenantId} />
<PluginsTabPanel
Expand Down
29 changes: 29 additions & 0 deletions packages/plugins-ui/test/plugins-gallery.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,35 @@ describe("PluginsGallery", () => {
expect(container.textContent).toContain("Inherited");
});

test("the plugins tab renders the list heading and directory sub copy (CL-6467)", () => {
const { container } = renderGallery();

const heading = container.querySelector("h1");
expect(heading?.textContent).toBe("Plugins");
expect(container.textContent).toContain(
"A directory to scan, not tiles to admire — one dense row per connector, grouped by what it does. Click a row's name for the full page.",
);
});

test("a plugin row's status caption is never hidden — it is a core column, not overflow (CL-6467)", () => {
const { container } = renderGallery();

expect(container.textContent).toContain("Connected here");
const captions = [...container.querySelectorAll("span")].filter(
(span) => span.textContent === "Connected · Connected here",
);
expect(captions.length).toBeGreaterThan(0);
for (const caption of captions) {
expect(caption.className).not.toContain("hidden");
}
});

test("an empty plugin directory renders no group rows", () => {
const { container } = renderGallery([]);

expect(container.querySelector(".border.border-border")).toBeNull();
});

test("search narrows the plugin grid to matches only", () => {
const { container } = renderGallery(PLUGINS, "git");

Expand Down
Loading