From bdeef45f2faf98a8594fa1c86e4882d72ac18c5b Mon Sep 17 00:00:00 2001 From: Anna Effort Date: Tue, 18 Aug 2026 23:20:41 -0700 Subject: [PATCH 1/4] Adjust tools, resources & prompts light theme MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Applies PR #34's light-mode pass to the three surfaces it missed. - Status tokens gain a `.dark` override; six sites that hardcoded the emerald/gray shades now use them, including the two server drawers. - Drawer body and right rail both inherit `bg-popover`. The dark-only override they carried split the panes in dark and did nothing in light, where both were pure white. - Scrim `bg-black/10` → `/50` on all five drawers. - The three drawer tables adopt `ServersTable`'s card-per-row pattern, with rows a step down from the drawer body rather than up from the page. Hover and selected are pinned to the row fill. - Page chrome moves to `text-foreground` / `text-muted-foreground`, the off-palette blue spinners are retinted, and two badges stop bypassing the icon tokens. Also fixes an unrelated bug in `VirtualServerDetailsPanel`: the status icon was unconditionally green while its label branched on `enabled`. Forms keep their hardcoded neutrals, matching what PR #34 left behind. 2896 tests pass; tsc, eslint, prettier and build are clean. Signed-off-by: Anna Effort --- .../gateways/VirtualServerDetailsPanel.tsx | 8 +++++-- .../prompts/PromptDefinitionTable.tsx | 20 ++++++++--------- src/components/prompts/PromptDetailsPanel.tsx | 12 +++++----- .../resources/ResourceDetailsPanel.tsx | 10 +++++---- src/components/resources/ResourcesTable.tsx | 16 +++++++------- .../servers/MCPServerDetailsPanel.tsx | 6 +++-- src/components/tools/ToolDetailsPanel.tsx | 10 ++++----- src/components/tools/ToolsTable.tsx | 18 +++++++-------- src/index.css | 6 +++-- src/pages/Prompts.tsx | 12 +++++----- src/pages/Resources.tsx | 22 +++++++++---------- src/pages/Tools.tsx | 12 +++++----- 12 files changed, 82 insertions(+), 70 deletions(-) diff --git a/src/components/gateways/VirtualServerDetailsPanel.tsx b/src/components/gateways/VirtualServerDetailsPanel.tsx index e97a34f..15eebaa 100644 --- a/src/components/gateways/VirtualServerDetailsPanel.tsx +++ b/src/components/gateways/VirtualServerDetailsPanel.tsx @@ -378,7 +378,7 @@ export function VirtualServerDetailsPanel({ aria-hidden="true" onClick={onClose} className={cn( - "absolute inset-0 z-10 bg-black/10 transition-opacity duration-150 supports-backdrop-filter:backdrop-blur-xs", + "absolute inset-0 z-10 bg-black/50 transition-opacity duration-150 supports-backdrop-filter:backdrop-blur-xs", "data-[state=open]:opacity-100 data-[state=closed]:opacity-0 data-[state=closed]:pointer-events-none", )} /> @@ -658,7 +658,11 @@ export function VirtualServerDetailsPanel({
- + {server.enabled ? intl.formatMessage({ id: "gateways.details.status.active" }) : intl.formatMessage({ id: "gateways.details.status.inactive" })} diff --git a/src/components/prompts/PromptDefinitionTable.tsx b/src/components/prompts/PromptDefinitionTable.tsx index b345273..5da3caf 100644 --- a/src/components/prompts/PromptDefinitionTable.tsx +++ b/src/components/prompts/PromptDefinitionTable.tsx @@ -36,9 +36,9 @@ export interface PromptDefinitionTableProps { * updates the Prompt details sidebar. The overflow menu replaces the one that * previously sat beside the panel title. * - * a11y: row selection is conveyed visually via `data-state` only, matching the - * Tools/Resources tables. Exposing it to assistive tech (grid role + - * aria-selected) is a cross-cutting follow-up across all three tables. + * Rows carry `data-state="selected"` but render no selected styling: all rows + * share one fill, matching the Tools/Resources tables. The attribute stays for + * tests and any future affordance. */ export function PromptDefinitionTable({ prompts, @@ -51,19 +51,19 @@ export function PromptDefinitionTable({ const intl = useIntl(); return ( - +
- - + + {intl.formatMessage({ id: "prompts.details.label.name" })} - + {intl.formatMessage({ id: "prompts.details.label.promptId" })} - + - + {prompts.map((prompt) => ( {prompt.displayName || prompt.name} diff --git a/src/components/prompts/PromptDetailsPanel.tsx b/src/components/prompts/PromptDetailsPanel.tsx index 0f979b1..ae2e95a 100644 --- a/src/components/prompts/PromptDetailsPanel.tsx +++ b/src/components/prompts/PromptDetailsPanel.tsx @@ -142,7 +142,7 @@ export function PromptDetailsPanel({ aria-hidden="true" onClick={onClose} className={cn( - "absolute inset-0 z-10 bg-black/10 transition-opacity duration-150 supports-backdrop-filter:backdrop-blur-xs", + "absolute inset-0 z-10 bg-black/50 transition-opacity duration-150 supports-backdrop-filter:backdrop-blur-xs", "data-[state=open]:opacity-100 data-[state=closed]:opacity-0 data-[state=closed]:pointer-events-none", )} /> @@ -161,13 +161,13 @@ export function PromptDetailsPanel({ )} >
-
+

{intl.formatMessage({ id: "prompts.details.srHeading" }, { title })}

- +
-
+
- - + + {intl.formatMessage({ id: "resources.table.resource" })} - + {intl.formatMessage({ id: "resources.table.uri" })} - + {intl.formatMessage({ id: "resources.table.resourceId" })} - + - + {resources.map((resource) => ( {resource.title || resource.name} diff --git a/src/components/servers/MCPServerDetailsPanel.tsx b/src/components/servers/MCPServerDetailsPanel.tsx index 2efd6a1..60a472a 100644 --- a/src/components/servers/MCPServerDetailsPanel.tsx +++ b/src/components/servers/MCPServerDetailsPanel.tsx @@ -306,7 +306,7 @@ export function MCPServerDetailsPanel({ aria-hidden="true" onClick={onClose} className={cn( - "absolute inset-0 z-10 bg-black/10 transition-opacity duration-150 supports-backdrop-filter:backdrop-blur-xs", + "absolute inset-0 z-10 bg-black/50 transition-opacity duration-150 supports-backdrop-filter:backdrop-blur-xs", "data-[state=open]:opacity-100 data-[state=closed]:opacity-0 data-[state=closed]:pointer-events-none", )} /> @@ -552,7 +552,9 @@ export function MCPServerDetailsPanel({ {server.enabled ? (server.reachable ? "Active" : "Unreachable") : "Inactive"} diff --git a/src/components/tools/ToolDetailsPanel.tsx b/src/components/tools/ToolDetailsPanel.tsx index 4cc79a2..8abf09e 100644 --- a/src/components/tools/ToolDetailsPanel.tsx +++ b/src/components/tools/ToolDetailsPanel.tsx @@ -147,7 +147,7 @@ export function ToolDetailsPanel({ aria-hidden="true" onClick={onClose} className={cn( - "absolute inset-0 z-10 bg-black/10 transition-opacity duration-150 supports-backdrop-filter:backdrop-blur-xs", + "absolute inset-0 z-10 bg-black/50 transition-opacity duration-150 supports-backdrop-filter:backdrop-blur-xs", "data-[state=open]:opacity-100 data-[state=closed]:opacity-0 data-[state=closed]:pointer-events-none", )} /> @@ -167,7 +167,7 @@ export function ToolDetailsPanel({ > {tools.length > 0 && (
-
+

{intl.formatMessage({ id: "tools.details.toolsFor" }, { name: gatewaySlug })}

@@ -197,7 +197,7 @@ export function ToolDetailsPanel({ />
-
+
- - + + {intl.formatMessage({ id: "tools.table.tool" })} - + {intl.formatMessage({ id: "tools.table.name" })} - + {intl.formatMessage({ id: "tools.table.toolId" })} - + {intl.formatMessage({ id: "tools.table.schema" })} - + - + {tools.map((tool) => ( {tool.displayName || tool.title || tool.name} diff --git a/src/index.css b/src/index.css index d4b28da..44f67d8 100644 --- a/src/index.css +++ b/src/index.css @@ -129,8 +129,9 @@ --destructive: oklch(0.577 0.245 27.325); --tool-icon-bg: var(--color-fuchsia-400); --prompt-icon-bg: #6fff9f; - --tool-status-active: var(--color-emerald-500); - --tool-status-inactive: var(--color-gray-500); + /* emerald-400 falls under 3:1 on white; .dark restores it */ + --tool-status-active: var(--color-emerald-600); + --tool-status-inactive: var(--color-neutral-500); --tool-badge-bg: var(--color-neutral-200); --tool-badge-fg: var(--color-neutral-800); --tool-add-icon-bg: var(--color-neutral-900); @@ -189,6 +190,7 @@ --tool-badge-fg: var(--color-white); --tool-add-icon-bg: var(--color-white); --tool-add-icon-fg: var(--color-neutral-900); + --tool-status-active: var(--color-emerald-400); --selection: var(--color-orange-500); /* Status-headline icon accent (brand cyan) — bright on the dark background. */ --status-icon: #70f9ff; diff --git a/src/pages/Prompts.tsx b/src/pages/Prompts.tsx index 8ba4f5f..40f767c 100644 --- a/src/pages/Prompts.tsx +++ b/src/pages/Prompts.tsx @@ -100,7 +100,7 @@ function PromptGroupCard({
{group.label} @@ -168,7 +168,7 @@ function PromptGroupCard({ : "prompts.details.status.inactive", })} className={`mr-1 inline-block h-1.5 w-1.5 flex-shrink-0 rounded-full ${ - enabled ? "bg-emerald-400" : "bg-gray-400" + enabled ? "bg-tool-status-active" : "bg-tool-status-inactive" }`} /> {getPromptLabel(prompt)} @@ -221,13 +221,13 @@ function AddPromptsCard({
- + {intl.formatMessage({ id: "prompts.add.title" })}
-

+

{intl.formatMessage({ id: "prompts.add.description" })}

@@ -502,7 +502,7 @@ export function Prompts() { /> ) : ( <> -

+

{intl.formatMessage({ id: "prompts.title" })}

@@ -514,7 +514,7 @@ export function Prompts() { className="flex items-center justify-center p-12" > {intl.formatMessage({ id: "prompts.loading" })} -
+
) : ( <> diff --git a/src/pages/Resources.tsx b/src/pages/Resources.tsx index 391d2da..1f9ed0d 100644 --- a/src/pages/Resources.tsx +++ b/src/pages/Resources.tsx @@ -98,11 +98,11 @@ const ResourceGroupCard = memo(function ResourceGroupCard({
{group.gatewaySlug} - + {intl.formatMessage( { id: "resources.card.resourceCount" }, { count: group.resources.length }, @@ -210,16 +210,16 @@ function AddResourcesCard({ onAddResource }: { onAddResource: () => void }) { >
-
- +
+
- + {intl.formatMessage({ id: "resources.addResources.title" })}
-

+

{intl.formatMessage({ id: "resources.addResources.description" })}

@@ -542,7 +542,7 @@ export function Resources() { {intl.formatMessage({ id: "resources.form.loadingContent" })} -
+
) : showForm && editingResource && resourceContentError ? (
@@ -561,10 +561,10 @@ export function Resources() {
) : showForm && editingResource && isEditingBinaryResource ? (
-

+

{intl.formatMessage({ id: "resources.form.binaryUnsupported" })}

-

+

{intl.formatMessage({ id: "resources.form.binaryUnsupportedDescription" })}

@@ -588,7 +588,7 @@ export function Resources() {

{intl.formatMessage({ id: "resources.title" })}

@@ -601,7 +601,7 @@ export function Resources() { className="flex items-center justify-center p-12" > {intl.formatMessage({ id: "resources.loading" })} -
+
)} diff --git a/src/pages/Tools.tsx b/src/pages/Tools.tsx index 5806822..eb202c5 100644 --- a/src/pages/Tools.tsx +++ b/src/pages/Tools.tsx @@ -74,11 +74,11 @@ function ToolGroupCard({
{group.gatewaySlug} - + {intl.formatMessage({ id: "tools.card.toolCount" }, { count: group.tools.length })} void }) {
- + {intl.formatMessage({ id: "tools.add.title" })}
-

+

{intl.formatMessage({ id: "tools.add.description" })}

@@ -425,7 +425,7 @@ export function Tools() { /> ) : ( <> -

+

{intl.formatMessage({ id: "tools.title" })}

@@ -437,7 +437,7 @@ export function Tools() { className="flex items-center justify-center p-12" > {intl.formatMessage({ id: "tools.loading" })} -
+
)} From 8a07588779918dcd6c6b231d7de4b0ce86285d5b Mon Sep 17 00:00:00 2001 From: Marek Dano Date: Wed, 19 Aug 2026 10:35:02 +0100 Subject: [PATCH 2/4] fix(ui): restore row hover/selected contrast and drawer rail background Signed-off-by: Marek Dano --- src/components/gateways/VirtualServerDetailsPanel.tsx | 2 +- src/components/prompts/PromptDefinitionTable.tsx | 8 ++++---- src/components/resources/ResourcesTable.tsx | 2 +- src/components/servers/MCPServerDetailsPanel.tsx | 2 +- src/components/tools/ToolsTable.tsx | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/gateways/VirtualServerDetailsPanel.tsx b/src/components/gateways/VirtualServerDetailsPanel.tsx index 15eebaa..a2e0338 100644 --- a/src/components/gateways/VirtualServerDetailsPanel.tsx +++ b/src/components/gateways/VirtualServerDetailsPanel.tsx @@ -637,7 +637,7 @@ export function VirtualServerDetailsPanel({
-
-