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
7 changes: 3 additions & 4 deletions client/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,6 @@ import {
Tool,
} from "@modelcontextprotocol/sdk/types.js";
import { useCallback, useEffect, useRef, useState } from "react";
// Add dark mode class based on system preference
if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
document.documentElement.classList.add("dark");
}

import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
import {
Expand All @@ -52,6 +48,7 @@ import RootsTab from "./components/RootsTab";
import SamplingTab, { PendingRequest } from "./components/SamplingTab";
import Sidebar from "./components/Sidebar";
import ToolsTab from "./components/ToolsTab";
import useDarkModeSync from "./lib/useDarkModeSync";

const DEFAULT_REQUEST_TIMEOUT_MSEC = 10000;

Expand Down Expand Up @@ -138,6 +135,8 @@ const App = () => {
const dragStartY = useRef<number>(0);
const dragStartHeight = useRef<number>(0);

useDarkModeSync();

const handleDragStart = useCallback(
(e: React.MouseEvent) => {
setIsDragging(true);
Expand Down
6 changes: 3 additions & 3 deletions client/src/components/ListPane.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ const ListPane = <T extends object>({
isButtonDisabled,
}: ListPaneProps<T>) => (
<div className="bg-card rounded-lg shadow">
<div className="p-4 border-b border-gray-200">
<h3 className="font-semibold">{title}</h3>
<div className="p-4 border-b border-gray-200 dark:border-gray-700">
<h3 className="font-semibold dark:text-white">{title}</h3>
</div>
<div className="p-4">
<Button
Expand All @@ -36,7 +36,7 @@ const ListPane = <T extends object>({
{items.map((item, index) => (
<div
key={index}
className="flex items-center p-2 rounded hover:bg-gray-50 cursor-pointer"
className="flex items-center p-2 rounded hover:bg-gray-50 dark:hover:bg-gray-700 cursor-pointer"
onClick={() => setSelectedItem(item)}
>
{renderItem(item)}
Expand Down
2 changes: 1 addition & 1 deletion client/src/components/ResourcesTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ const ResourcesTab = ({
<AlertDescription>{error}</AlertDescription>
</Alert>
) : selectedResource ? (
<pre className="bg-gray-50 p-4 rounded text-sm overflow-auto max-h-96 whitespace-pre-wrap break-words">
<pre className="bg-gray-50 dark:bg-gray-800 p-4 rounded text-sm overflow-auto max-h-96 whitespace-pre-wrap break-words text-gray-900 dark:text-gray-100">
{resourceContent}
</pre>
) : selectedTemplate ? (
Expand Down
2 changes: 1 addition & 1 deletion client/src/components/ui/button.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ const buttonVariants = cva(
variants: {
variant: {
default:
"bg-primary text-primary-foreground shadow hover:bg-primary/90",
"bg-primary text-primary-foreground shadow hover:bg-primary/90 dark:bg-gray-800 dark:text-white dark:hover:bg-gray-700",
destructive:
"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
outline:
Expand Down
29 changes: 29 additions & 0 deletions client/src/lib/useDarkModeSync.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { useEffect } from "react";

// Listen for changes to the user's preferred color scheme
const useDarkModeSync = () => {
useEffect(() => {
const darkModeMediaQuery = window.matchMedia(
"(prefers-color-scheme: dark)",
);
const handleDarkModeChange = (e: MediaQueryListEvent) => {
if (e.matches) {
document.documentElement.classList.add("dark");
} else {
document.documentElement.classList.remove("dark");
}
};

if (darkModeMediaQuery.matches) {
document.documentElement.classList.add("dark");
}

darkModeMediaQuery.addEventListener("change", handleDarkModeChange);

return () => {
darkModeMediaQuery.removeEventListener("change", handleDarkModeChange);
};
}, []);
};

export default useDarkModeSync;
8 changes: 4 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.