diff --git a/CLAUDE.md b/CLAUDE.md index 8ffc13b..0be4722 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -45,4 +45,5 @@ This project uses **next-intl** for internationalization with support for Englis 8. **User preference**: Language selection is persisted and overrides browser detection - When you are not sure, check the official documentation online. -- Always use last versions. Reduce external dependencies as well (less is better). \ No newline at end of file +- Always use last versions. Reduce external dependencies as well (less is better). +- Only commit/push when I confirm the issue/task you are working on is ok. \ No newline at end of file diff --git a/TODO.md b/TODO.md index 96ec747..8171715 100644 --- a/TODO.md +++ b/TODO.md @@ -204,4 +204,5 @@ - [x] Fixed plain text emails displaying on one line (smart HTML/text version selection) - [x] Fixed light mode not applying properly (replaced hardcoded colors with CSS variables) - [x] Fixed all hardcoded colors in email viewer for proper theme support +- [x] Fixed sidebar footer menu extending page height when scrolling (overflow containment) diff --git a/app/[locale]/layout.tsx b/app/[locale]/layout.tsx index a5a4511..12c881f 100644 --- a/app/[locale]/layout.tsx +++ b/app/[locale]/layout.tsx @@ -43,6 +43,26 @@ export default async function LocaleLayout({ return ( +
+ + diff --git a/app/globals.css b/app/globals.css index 9648b54..ebd90d6 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,5 +1,7 @@ @import "tailwindcss"; +@custom-variant dark (&:where(.dark, .dark *)); + :root { --color-border: #e2e8f0; --color-input: #e2e8f0; diff --git a/components/email/email-viewer.tsx b/components/email/email-viewer.tsx index ee71112..9c6bbaa 100644 --- a/components/email/email-viewer.tsx +++ b/components/email/email-viewer.tsx @@ -53,6 +53,8 @@ import { List, Code, Copy, + Brain, + Sparkles, } from "lucide-react"; import { useTranslations } from "next-intl"; @@ -184,20 +186,11 @@ export function EmailViewer({ // Additional headers if (email.headers) { source += '\n--- Additional Headers ---\n'; - // Check if headers is an array (which seems to be the case based on error) - if (Array.isArray(email.headers)) { - email.headers.forEach((header: any) => { - if (header && typeof header === 'object') { - source += `${header.name || 'Unknown'}: ${header.value || ''}\n`; - } - }); - } else { - // Handle as object - Object.entries(email.headers).forEach(([key, value]) => { - const val = Array.isArray(value) ? value.join(', ') : String(value); - source += `${key}: ${val}\n`; - }); - } + // Headers should now always be a Record after client processing + Object.entries(email.headers).forEach(([key, value]) => { + const val = Array.isArray(value) ? value.join('\n ') : String(value); + source += `${key}: ${val}\n`; + }); } // Authentication results @@ -803,8 +796,8 @@ export function EmailViewer({ {/* Security & Authentication Section */} {(email.authenticationResults || email.spamScore !== undefined) && (+ {email.spamLLM.explanation} +
+