From ae8d00d75cc0183ad4c3f2c2797ead0971599a94 Mon Sep 17 00:00:00 2001 From: Daniel-Warner-X Date: Wed, 19 Nov 2025 17:32:30 -0500 Subject: [PATCH 01/20] add dark mode --- components/frontend/package-lock.json | 23 ++++++++++ components/frontend/package.json | 1 + components/frontend/src/app/globals.css | 6 ++- .../app/integrations/IntegrationsClient.tsx | 4 +- .../app/integrations/github/setup/page.tsx | 2 +- components/frontend/src/app/layout.tsx | 18 ++++++-- .../frontend/src/app/projects/[name]/page.tsx | 4 +- .../accordions/artifacts-accordion.tsx | 2 +- .../accordions/repositories-accordion.tsx | 6 +-- .../accordions/workflows-accordion.tsx | 6 +-- .../components/k8s-resource-tree.tsx | 26 +++++------ .../[name]/sessions/[sessionName]/page.tsx | 32 ++++++------- .../sessions/[sessionName]/session-header.tsx | 4 +- .../app/projects/[name]/sessions/new/page.tsx | 4 +- components/frontend/src/app/projects/page.tsx | 8 ++-- .../frontend/src/components/RepoBrowser.tsx | 6 +-- .../components/create-workspace-dialog.tsx | 2 +- .../frontend/src/components/file-tree.tsx | 2 +- .../src/components/github-connection-card.tsx | 12 ++--- .../frontend/src/components/navigation.tsx | 6 ++- .../components/providers/theme-provider.tsx | 8 ++++ .../src/components/session-details-modal.tsx | 44 +++++++++--------- .../src/components/session/MessagesTab.tsx | 12 ++--- .../src/components/session/OverviewTab.tsx | 36 +++++++-------- .../src/components/session/ResultsTab.tsx | 6 +-- .../src/components/session/WorkspaceTab.tsx | 4 +- .../frontend/src/components/status-badge.tsx | 16 +++---- .../frontend/src/components/theme-toggle.tsx | 46 +++++++++++++++++++ .../frontend/src/components/ui/alert.tsx | 4 +- .../frontend/src/components/ui/dialog.tsx | 4 +- .../frontend/src/components/ui/message.tsx | 20 ++++---- .../src/components/ui/stream-message.tsx | 4 +- .../src/components/ui/system-message.tsx | 2 +- .../src/components/ui/thinking-message.tsx | 8 ++-- .../src/components/ui/tool-message.tsx | 40 ++++++++-------- .../workspace-sections/sessions-section.tsx | 8 ++-- .../workspace-sections/sharing-section.tsx | 6 +-- .../frontend/src/utils/session-helpers.ts | 12 ++--- 38 files changed, 273 insertions(+), 181 deletions(-) create mode 100644 components/frontend/src/components/providers/theme-provider.tsx create mode 100644 components/frontend/src/components/theme-toggle.tsx diff --git a/components/frontend/package-lock.json b/components/frontend/package-lock.json index 247672243..fb9716801 100644 --- a/components/frontend/package-lock.json +++ b/components/frontend/package-lock.json @@ -28,6 +28,7 @@ "highlight.js": "^11.11.1", "lucide-react": "^0.542.0", "next": "15.5.2", + "next-themes": "^0.4.6", "react": "19.1.0", "react-dom": "19.1.0", "react-hook-form": "^7.62.0", @@ -2479,6 +2480,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.7.tgz", "integrity": "sha512-wAHc/cgKzW7LZNFloThyHnV/AX9gTg3w5yAv0gvQHPZoCnepwqCMtzbuPbb2UvfvO32XZ46e8bPOYbfZhzVnnQ==", "license": "MIT", + "peer": true, "dependencies": { "@tanstack/query-core": "5.90.7" }, @@ -2595,6 +2597,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -2605,6 +2608,7 @@ "integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==", "devOptional": true, "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -2661,6 +2665,7 @@ "integrity": "sha512-tK3GPFWbirvNgsNKto+UmB/cRtn6TZfyw0D6IKrW55n6Vbs7KJoZtI//kpTKzE/DUmmnAFD8/Ca46s7Obs92/w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.46.4", "@typescript-eslint/types": "8.46.4", @@ -3184,6 +3189,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4176,6 +4182,7 @@ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -4349,6 +4356,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -7158,6 +7166,16 @@ } } }, + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -7568,6 +7586,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -7577,6 +7596,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.26.0" }, @@ -7589,6 +7609,7 @@ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.66.0.tgz", "integrity": "sha512-xXBqsWGKrY46ZqaHDo+ZUYiMUgi8suYu5kdrS20EG8KiL7VRQitEbNjm+UcrDYrNi1YLyfpmAeGjCZYXLT9YBw==", "license": "MIT", + "peer": true, "engines": { "node": ">=18.0.0" }, @@ -8512,6 +8533,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -8691,6 +8713,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/components/frontend/package.json b/components/frontend/package.json index f5931698c..a2fb96690 100644 --- a/components/frontend/package.json +++ b/components/frontend/package.json @@ -29,6 +29,7 @@ "highlight.js": "^11.11.1", "lucide-react": "^0.542.0", "next": "15.5.2", + "next-themes": "^0.4.6", "react": "19.1.0", "react-dom": "19.1.0", "react-hook-form": "^7.62.0", diff --git a/components/frontend/src/app/globals.css b/components/frontend/src/app/globals.css index 51ac5e9b6..dcf720cc8 100644 --- a/components/frontend/src/app/globals.css +++ b/components/frontend/src/app/globals.css @@ -125,5 +125,9 @@ /* Thin scrollbar styling */ .scrollbar-thin { scrollbar-width: thin; - scrollbar-color: #d1d5db #f3f4f6; + scrollbar-color: hsl(var(--muted-foreground)) hsl(var(--muted)); +} + +.dark .scrollbar-thin { + scrollbar-color: hsl(var(--muted-foreground)) hsl(var(--background)); } diff --git a/components/frontend/src/app/integrations/IntegrationsClient.tsx b/components/frontend/src/app/integrations/IntegrationsClient.tsx index 4d81fea81..8c21d1bf7 100644 --- a/components/frontend/src/app/integrations/IntegrationsClient.tsx +++ b/components/frontend/src/app/integrations/IntegrationsClient.tsx @@ -8,9 +8,9 @@ type Props = { appSlug?: string } export default function IntegrationsClient({ appSlug }: Props) { return ( -
+
{/* Sticky header */} -
+
{error} ) : ( -
{message}
+
{message}
)}
diff --git a/components/frontend/src/app/layout.tsx b/components/frontend/src/app/layout.tsx index ed7e98006..5c90a7ff3 100644 --- a/components/frontend/src/app/layout.tsx +++ b/components/frontend/src/app/layout.tsx @@ -3,6 +3,7 @@ import { Inter } from "next/font/google"; import "./globals.css"; import { Navigation } from "@/components/navigation"; import { QueryProvider } from "@/components/providers/query-provider"; +import { ThemeProvider } from "@/components/providers/theme-provider"; import { Toaster } from "@/components/ui/toaster"; import { env } from "@/lib/env"; @@ -27,11 +28,18 @@ export default function RootLayout({ - - -
{children}
- -
+ + + +
{children}
+ +
+
); diff --git a/components/frontend/src/app/projects/[name]/page.tsx b/components/frontend/src/app/projects/[name]/page.tsx index 7a1d327d3..818ceb95e 100644 --- a/components/frontend/src/app/projects/[name]/page.tsx +++ b/components/frontend/src/app/projects/[name]/page.tsx @@ -56,9 +56,9 @@ export default function ProjectDetailsPage() { } return ( -
+
{/* Sticky header */} -
+
+
diff --git a/components/frontend/src/app/projects/[name]/sessions/[sessionName]/components/accordions/repositories-accordion.tsx b/components/frontend/src/app/projects/[name]/sessions/[sessionName]/components/accordions/repositories-accordion.tsx index 1dbf807d4..ee82ecd14 100644 --- a/components/frontend/src/app/projects/[name]/sessions/[sessionName]/components/accordions/repositories-accordion.tsx +++ b/components/frontend/src/app/projects/[name]/sessions/[sessionName]/components/accordions/repositories-accordion.tsx @@ -38,7 +38,7 @@ export function RepositoriesAccordion({ }; return ( - +
@@ -59,8 +59,8 @@ export function RepositoriesAccordion({ {/* Repository List */} {repositories.length === 0 ? (
-
- +
+

No context added yet

@@ -142,12 +142,12 @@ export function K8sResourceTree({
@@ -181,10 +181,10 @@ export function K8sResourceTree({ {container.state} {container.exitCode !== undefined && ( - Exit: {container.exitCode} + Exit: {container.exitCode} )} {container.reason && ( - ({container.reason}) + ({container.reason}) )}
))} @@ -204,7 +204,7 @@ export function K8sResourceTree({ {pvcExists ? 'Exists' : 'Not Found'} - {pvcSize && {pvcSize}} + {pvcSize && {pvcSize}}
)}
diff --git a/components/frontend/src/app/projects/[name]/sessions/[sessionName]/page.tsx b/components/frontend/src/app/projects/[name]/sessions/[sessionName]/page.tsx index a3cd93e30..efe0bed85 100644 --- a/components/frontend/src/app/projects/[name]/sessions/[sessionName]/page.tsx +++ b/components/frontend/src/app/projects/[name]/sessions/[sessionName]/page.tsx @@ -520,7 +520,7 @@ export default function ProjectSessionDetailPage({ // Loading state if (isLoading || !projectName || !sessionName) { return ( -
+
Loading session... @@ -532,8 +532,8 @@ export default function ProjectSessionDetailPage({ // Error state if (error || !session) { return ( -
-
+
+
- + -

Error: {error instanceof Error ? error.message : "Session not found"}

+

Error: {error instanceof Error ? error.message : "Session not found"}

@@ -561,9 +561,9 @@ export default function ProjectSessionDetailPage({ return ( <> -
+
{/* Fixed header */} -
+
{/* Blocking overlay when first message hasn't loaded and session is pending */} {!firstMessageLoaded && session?.status?.phase === 'Pending' && ( -
+
@@ -648,7 +648,7 @@ export default function ProjectSessionDetailPage({ /> {/* Experimental - File Explorer */} - +
@@ -670,12 +670,12 @@ export default function ProjectSessionDetailPage({ {gitOps.gitStatus?.hasChanges && (
{(gitOps.gitStatus?.totalAdded ?? 0) > 0 && ( - + +{gitOps.gitStatus.totalAdded} )} {(gitOps.gitStatus?.totalRemoved ?? 0) > 0 && ( - + -{gitOps.gitStatus.totalRemoved} )} @@ -811,8 +811,8 @@ export default function ProjectSessionDetailPage({ {/* Remote Configuration */} {!currentRemote ? ( -
- Set up Git remote for version control +
+ Set up Git remote for version control