diff --git a/src/components/ui/alert-dialog.tsx b/src/components/ui/alert-dialog.tsx
index 5284517e..1c376739 100644
--- a/src/components/ui/alert-dialog.tsx
+++ b/src/components/ui/alert-dialog.tsx
@@ -34,7 +34,7 @@ function AlertDialogOverlay({
))}
diff --git a/src/components/ui/sonner.tsx b/src/components/ui/sonner.tsx
index 04e0013c..264f0503 100644
--- a/src/components/ui/sonner.tsx
+++ b/src/components/ui/sonner.tsx
@@ -1,4 +1,4 @@
-import { useTheme } from "next-themes";
+import { useTheme } from "@/components/theme-provider";
import { Toaster as Sonner, type ToasterProps, toast } from "sonner";
import { useRef } from "react";
diff --git a/src/index.css b/src/index.css
index 54785e07..7ce244ea 100644
--- a/src/index.css
+++ b/src/index.css
@@ -79,6 +79,9 @@
--scrollbar-thumb: #c1c1c3;
--scrollbar-thumb-hover: #a1a1a3;
--scrollbar-track: #f3f4f6;
+
+ /* Modal Overlay - Light Mode */
+ --bg-overlay: rgba(0, 0, 0, 0.5);
}
@theme inline {
@@ -168,6 +171,9 @@
/* NEW SEMANTIC TEXT COLOR MAPPINGS - Creates Tailwind text classes */
--color-foreground-secondary: var(--foreground-secondary);
--color-foreground-subtle: var(--foreground-subtle);
+
+ /* Modal Overlay Mapping - Creates Tailwind bg-overlay class */
+ --color-overlay: var(--bg-overlay);
}
.dark {
@@ -233,6 +239,9 @@
--scrollbar-thumb: #434345;
--scrollbar-thumb-hover: #5a5a5d;
--scrollbar-track: #18181b;
+
+ /* Modal Overlay - Dark Mode */
+ --bg-overlay: rgba(0, 0, 0, 0.7);
}
@layer base {
diff --git a/src/locales/en.json b/src/locales/en.json
index d3d522c2..d83a9b2a 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -2427,5 +2427,9 @@
"stats": "Stats",
"consoleTab": "Console",
"startContainerToAccess": "Start the container to access the console"
+ },
+ "theme": {
+ "switchToLight": "Switch to Light",
+ "switchToDark": "Switch to Dark"
}
}
diff --git a/src/ui/desktop/DesktopApp.tsx b/src/ui/desktop/DesktopApp.tsx
index 9fd5c141..d5c38610 100644
--- a/src/ui/desktop/DesktopApp.tsx
+++ b/src/ui/desktop/DesktopApp.tsx
@@ -200,8 +200,8 @@ function AppContent() {
225deg,
transparent,
transparent 35px,
- rgba(255, 255, 255, 0.03) 35px,
- rgba(255, 255, 255, 0.03) 37px
+ var(--border-subtle) 35px,
+ var(--border-subtle) 37px
)`,
}}
>
@@ -310,17 +310,16 @@ function AppContent() {
{isTransitioning && (
diff --git a/src/ui/desktop/apps/features/docker/components/ConsoleTerminal.tsx b/src/ui/desktop/apps/features/docker/components/ConsoleTerminal.tsx
index 6b953860..30b474ff 100644
--- a/src/ui/desktop/apps/features/docker/components/ConsoleTerminal.tsx
+++ b/src/ui/desktop/apps/features/docker/components/ConsoleTerminal.tsx
@@ -103,8 +103,8 @@ export function ConsoleTerminal({
.trim();
terminal.options.theme = {
- background: backgroundColor || "#ffffff",
- foreground: foregroundColor || "#09090b",
+ background: backgroundColor || "var(--bg-elevated)",
+ foreground: foregroundColor || "var(--foreground)",
};
setTimeout(() => {
diff --git a/src/ui/desktop/apps/features/docker/components/ContainerCard.tsx b/src/ui/desktop/apps/features/docker/components/ContainerCard.tsx
index c45ab169..788bb581 100644
--- a/src/ui/desktop/apps/features/docker/components/ContainerCard.tsx
+++ b/src/ui/desktop/apps/features/docker/components/ContainerCard.tsx
@@ -312,7 +312,7 @@ export function ContainerCard({
-
+
{container.state !== "running" && (
@@ -325,7 +325,7 @@ export function ContainerCard({
disabled={isLoading}
>
{isStarting ? (
-
+
) : (
)}
@@ -346,7 +346,7 @@ export function ContainerCard({
disabled={isLoading}
>
{isStopping ? (
-
+
) : (
)}
@@ -368,7 +368,7 @@ export function ContainerCard({
disabled={isLoading}
>
{isPausing ? (
-
+
) : container.state === "paused" ? (
) : (
@@ -394,7 +394,7 @@ export function ContainerCard({
disabled={isLoading || container.state === "exited"}
>
{isRestarting ? (
-
+
) : (
)}
diff --git a/src/ui/desktop/apps/features/docker/components/LogViewer.tsx b/src/ui/desktop/apps/features/docker/components/LogViewer.tsx
index e00d2387..0babe7f7 100644
--- a/src/ui/desktop/apps/features/docker/components/LogViewer.tsx
+++ b/src/ui/desktop/apps/features/docker/components/LogViewer.tsx
@@ -184,7 +184,7 @@ export function LogViewer({
className="flex-1 h-full"
>
{isLoading ? (
-
+
) : (
)}
@@ -197,7 +197,7 @@ export function LogViewer({
className="flex-1 h-full"
>
{isDownloading ? (
-
+
) : (
)}
diff --git a/src/ui/desktop/apps/features/file-manager/FileManagerGrid.tsx b/src/ui/desktop/apps/features/file-manager/FileManagerGrid.tsx
index 11768f29..020c7a7b 100644
--- a/src/ui/desktop/apps/features/file-manager/FileManagerGrid.tsx
+++ b/src/ui/desktop/apps/features/file-manager/FileManagerGrid.tsx
@@ -1091,7 +1091,7 @@ export function FileManagerGrid({
onKeyDown={handleEditKeyDown}
onBlur={handleEditConfirm}
className={cn(
- "max-w-[120px] min-w-[60px] w-fit rounded-md border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 px-2 py-1 text-xs shadow-xs transition-[color,box-shadow] outline-none",
+ "max-w-[120px] min-w-[60px] w-fit rounded-md border border-edge bg-elevated px-2 py-1 text-xs shadow-xs transition-[color,box-shadow] outline-none",
"text-center text-foreground placeholder:text-muted-foreground",
"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[2px]",
)}
@@ -1180,7 +1180,7 @@ export function FileManagerGrid({
onKeyDown={handleEditKeyDown}
onBlur={handleEditConfirm}
className={cn(
- "flex-1 min-w-0 max-w-[200px] rounded-md border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 px-2 py-1 text-sm shadow-xs transition-[color,box-shadow] outline-none",
+ "flex-1 min-w-0 max-w-[200px] rounded-md border border-edge bg-elevated px-2 py-1 text-sm shadow-xs transition-[color,box-shadow] outline-none",
"text-foreground placeholder:text-muted-foreground",
"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[2px]",
)}
@@ -1370,7 +1370,7 @@ function CreateIntentGridItem({
onChange={(e) => setInputName(e.target.value)}
onKeyDown={handleKeyDown}
onBlur={() => onConfirm?.(inputName.trim())}
- className="w-full max-w-[120px] rounded-md border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 px-2 py-1 text-xs text-center text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[2px] outline-none"
+ className="w-full max-w-[120px] rounded-md border border-edge bg-elevated px-2 py-1 text-xs text-center text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[2px] outline-none"
placeholder={
intent.type === "directory"
? t("fileManager.folderName")
@@ -1426,7 +1426,7 @@ function CreateIntentListItem({
onChange={(e) => setInputName(e.target.value)}
onKeyDown={handleKeyDown}
onBlur={() => onConfirm?.(inputName.trim())}
- className="flex-1 min-w-0 max-w-[200px] rounded-md border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 px-2 py-1 text-sm text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[2px] outline-none"
+ className="flex-1 min-w-0 max-w-[200px] rounded-md border border-edge bg-elevated px-2 py-1 text-sm text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[2px] outline-none"
placeholder={
intent.type === "directory"
? t("fileManager.folderName")
diff --git a/src/ui/desktop/apps/features/file-manager/components/FileViewer.tsx b/src/ui/desktop/apps/features/file-manager/components/FileViewer.tsx
index 8de9c877..f294c83b 100644
--- a/src/ui/desktop/apps/features/file-manager/components/FileViewer.tsx
+++ b/src/ui/desktop/apps/features/file-manager/components/FileViewer.tsx
@@ -1255,7 +1255,7 @@ export function FileViewer({
-
+
{pdfError ? (
diff --git a/src/ui/desktop/apps/features/server-stats/widgets/NetworkWidget.tsx b/src/ui/desktop/apps/features/server-stats/widgets/NetworkWidget.tsx
index 00299ee6..08eaf348 100644
--- a/src/ui/desktop/apps/features/server-stats/widgets/NetworkWidget.tsx
+++ b/src/ui/desktop/apps/features/server-stats/widgets/NetworkWidget.tsx
@@ -57,7 +57,7 @@ export function NetworkWidget({ metrics }: NetworkWidgetProps) {
className={`text-xs px-2.5 py-0.5 rounded-full font-medium ${
iface.state === "UP"
? "bg-green-500/20 text-green-400"
- : "bg-gray-500/20 text-foreground-subtle"
+ : "bg-surface text-foreground-subtle"
}`}
>
{iface.state}
diff --git a/src/ui/desktop/apps/features/terminal/command-history/CommandAutocomplete.tsx b/src/ui/desktop/apps/features/terminal/command-history/CommandAutocomplete.tsx
index 40ef12b9..9099ca2e 100644
--- a/src/ui/desktop/apps/features/terminal/command-history/CommandAutocomplete.tsx
+++ b/src/ui/desktop/apps/features/terminal/command-history/CommandAutocomplete.tsx
@@ -56,7 +56,7 @@ export function CommandAutocomplete({
className={cn(
"px-3 py-1.5 text-sm font-mono cursor-pointer transition-colors",
"hover:bg-hover",
- index === selectedIndex && "bg-gray-500/20 text-muted-foreground",
+ index === selectedIndex && "bg-surface text-muted-foreground",
)}
onClick={() => onSelect(suggestion)}
onMouseEnter={() => {}}
diff --git a/src/ui/desktop/apps/features/tunnel/TunnelManager.tsx b/src/ui/desktop/apps/features/tunnel/TunnelManager.tsx
index 11110b40..ea7346cc 100644
--- a/src/ui/desktop/apps/features/tunnel/TunnelManager.tsx
+++ b/src/ui/desktop/apps/features/tunnel/TunnelManager.tsx
@@ -127,10 +127,10 @@ export function TunnelManager({
) : (
-
+
{t("tunnel.noTunnelsConfigured")}
-
+
{t("tunnel.configureTunnelsInHostSettings")}
diff --git a/src/ui/desktop/apps/host-manager/credentials/CredentialEditor.tsx b/src/ui/desktop/apps/host-manager/credentials/CredentialEditor.tsx
index bc9ff2fe..795ffdec 100644
--- a/src/ui/desktop/apps/host-manager/credentials/CredentialEditor.tsx
+++ b/src/ui/desktop/apps/host-manager/credentials/CredentialEditor.tsx
@@ -616,12 +616,12 @@ export function CredentialEditor({
(tag: string, idx: number) => (
{tag}