Commit Graph
63 Commits
Author SHA1 Message Date
Matthieu MALVACHEandClaude Sonnet 4.5 a4e2fcf81b feat(i18n): Enable instant client-side language switching
Refactored i18n implementation to support seamless language switching
without page reload by pre-loading all translations and using
locale-aware navigation helpers.

Changes:
- Created centralized routing config (i18n/routing.ts) with localePrefix: 'never'
- Added type-safe navigation helpers (i18n/navigation.ts)
- Implemented custom IntlProvider with pre-loaded EN/FR translations
- Updated all pages to use new useRouter from i18n/navigation
- Added language switcher to appearance settings
- Removed URL-based locale routing (no more /en/ or /fr/ prefixes)
- Language preference persisted via Zustand localStorage

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-08 03:59:29 +01:00
Matthieu MALVACHE 4032692700 feat(ui): Improve tablet and mobile email viewing experience
- Add tablet list auto-hide: email list collapses when selecting an email
  on tablet (768-1024px), with back button to return to two-pane view
- Make sender info scrollable on mobile/tablet while keeping subject bar
  with action buttons sticky at top for quick access
- Extend overlay sidebar behavior to tablet viewport (768-1024px)
- Add body scroll lock when sidebar is open on mobile/tablet
- Fix backdrop only rendering on mobile/tablet (not desktop)
- Add proper i18n keys for back_to_list, important, close
- Simplify desktop-only CSS classes by removing redundant breakpoint prefixes
2026-01-08 03:10:23 +01:00
Matthieu MALVACHE d6614fa5f7 fix(security): Update preact to fix JSON VNode Injection vulnerability
- preact: 10.28.1 → 10.28.2 (high severity fix)
- next-intl: 4.6.1 → 4.7.0 (minor update)
2026-01-08 02:12:44 +01:00
Matthieu MALVACHE e5cb0305d5 docs: Add instruction to update public docs during release 2026-01-08 02:06:34 +01:00
Matthieu MALVACHE 1306ce56f8 feat(config): Add runtime environment variables for Docker support
Enable post-build configuration by reading env vars at request time
instead of build time. This allows Docker containers to be configured
without rebuilding the image.

- Add /api/config endpoint for runtime config
- Add useConfig hook with caching
- Update login page with proper loading/error states
- Add i18n translations for config errors
- Maintain backwards compatibility with NEXT_PUBLIC_* vars
2026-01-08 02:00:09 +01:00
Matthieu MALVACHE 6cea985396 feat(privacy): Add trusted senders for automatic image loading
Allow users to trust specific senders so their images load automatically
without clicking "Show images" each time. Addresses privacy while
improving UX for known senders.

- Add trustedSenders state to settings store with add/remove/check methods
- Show "Always trust this sender" button in email viewer (ask/block modes)
- Add TrustedSendersModal for managing trusted senders in settings
- Include search, manual add, and avatar display in modal
- Full i18n support (en/fr)

Closes #3
2026-01-08 01:43:24 +01:00
Matthieu MALVACHE e50404cf42 feat(identities): Use JMAP identities for email sender address
- Add getIdentities() method to JMAP client
- Fetch and store identities in auth store on login
- Add From selector in composer (dropdown for multiple identities)
- Pass identity email/ID through send flow instead of using username
- Add translations for From field (en/fr)

This allows proper sender address handling for LDAP and other auth
backends where username differs from email address.

Closes #5
2026-01-08 01:19:09 +01:00
Matthieu MALVACHE 60aff695fe fix(email-composer): Improve readability and add discard button
- Fix textarea colors for proper theme support (light/dark mode)
- Fix modal height to prevent composer from collapsing
- Add explicit "Discard" button in footer for better UX
- Fix hardcoded colors in attachments section for theme support
- Use translations for all user-facing text

Closes #6
2026-01-08 01:01:37 +01:00
Matthieu MALVACHE dbadb38703 chore: Add package.json metadata and improve release script
- Add metadata to master's package.json (description, author, license, etc.)
- Update release script to merge dependencies instead of copying package.json
- Automatically removes 'private' and dev-only scripts for public release
2025-12-24 04:08:03 +01:00
Matthieu MALVACHE 1924c36a2c fix(email-viewer): Enable horizontal scroll for wide HTML emails
- Change overflow-hidden to overflow-x-auto on email body container
- Add CSS for email-content-wrapper with inline-block display
- Use width: max-content on email-content to respect intrinsic width
- Prevent tables with width="100%" from shrinking below content

Also updates dependencies:
- next: 16.0.10 -> 16.1.1
- react/react-dom: 19.2.1 -> 19.2.3
- next-intl: 4.5.8 -> 4.6.1
- tailwindcss: 4.1.17 -> 4.1.18
- eslint: 9.39.1 -> 9.39.2
- jmap-jam: 0.11.0 -> 0.13.1
- lucide-react: 0.556.0 -> 0.562.0

Adds test script for injecting HTML emails via JMAP (dev only)
2025-12-24 04:02:32 +01:00
Matthieu MALVACHE 792f775ad2 fix(security): Update Next.js to 16.0.10
Patches high severity vulnerabilities:
- Server Actions Source Code Exposure (GHSA-w37m-7fhw-fmv9)
- DoS with Server Components (GHSA-mwv6-3258-q52c)
2025-12-18 03:31:25 +01:00
Matthieu MALVACHE ee034314ae docs: Update release process documentation 2025-12-17 18:50:46 +01:00
Matthieu MALVACHE 601d9ad47b chore: Fix lint command and add release script
- Fix lint command (use eslint directly instead of broken next lint)
- Add scripts/release.sh for safe GitHub releases
- Fix lint warnings in seed-demo.ts
2025-12-17 18:48:42 +01:00
Matthieu MALVACHE 7d77415801 feat: Add search pagination and UX improvements
- Add pagination support to searchEmails (was limited to 50 results)
- Search now scoped to current mailbox/folder
- Support shared mailbox folders in search
- Display total results count (e.g., "50 of 1400 conversations")
- Add clear (X) button to search input
- Re-run search when changing folders during active search
- Remove unused sidebar screenshot
2025-12-17 18:32:47 +01:00
Matthieu MALVACHE 35963d3f0f feat: Add demo screenshots and seed script
- Add 7 screenshots showcasing the webmail UI
- Create seed-demo.ts script for populating demo accounts
- Update README with screenshot gallery and project overview
- Document git workflow for releases in CLAUDE.md
2025-12-15 01:03:30 +01:00
Matthieu MALVACHE 38eba603e4 feat: Add configurable app name via environment variable
- Add NEXT_PUBLIC_APP_NAME env variable for custom branding
- Update login page to use configurable app name
- Simplify default title in locales to 'Webmail'
2025-12-10 17:42:58 +01:00
Matthieu MALVACHE 8eefba5047 feat: Add email threading support with Gmail-style conversation view
- Implement thread grouping by threadId in email list
- Add ThreadListItem with collapsed/expanded states for desktop
- Create ThreadConversationView for full-screen mobile experience
- Add thread utility functions for grouping and sorting
- Extend JMAP client with getThread() and getThreadEmails() methods
- Add keyboard shortcut 'x' to expand/collapse threads
- Add thread expansion state management in email store
- Fix React hooks order in login page
- Add .env.example for environment configuration
- Add husky for git hooks
2025-12-10 17:38:03 +01:00
Matthieu MALVACHE f344725e2c feat: Add keyboard shortcuts, drag-drop, context menus, and mobile responsive design
New features:
- Keyboard shortcuts (j/k navigation, r/R/f for reply/forward, s star, e archive, # delete)
- Drag-and-drop emails to mailbox folders with multi-select support
- Right-click context menus on email list items with all actions
- Mobile-responsive adaptive layout with hamburger menu navigation

New files:
- hooks/use-keyboard-shortcuts.ts - Global keyboard shortcut handling
- hooks/use-email-drag.ts, hooks/use-mailbox-drop.ts - Native HTML5 DnD API
- hooks/use-context-menu.ts, components/ui/context-menu.tsx - Context menu system
- hooks/use-media-query.ts, stores/ui-store.ts - Responsive breakpoint handling
- components/layout/mobile-header.tsx - Mobile navigation header
- contexts/drag-drop-context.tsx - Drag-drop state management
- components/keyboard-shortcuts-modal.tsx - Help modal (? key)
- components/email/email-context-menu.tsx - Email-specific context menu

Updated TODO.md with completed tasks and code audit summary
2025-12-10 16:58:01 +01:00
Matthieu MALVACHE 81ec4cb471 feat: Add error boundaries and real-time push notifications
- Implement error boundaries with graceful fallbacks for all major components
  (sidebar, email list, email viewer, composer)
- Add push notifications via EventSource for real-time email updates
- Show connection status indicator in sidebar footer
- Play notification sound and show toast for new emails
- Add global error handler and error reporting utilities
- Configure ESLint with modern flat config
- Various fixes: unused variable warnings, proper cleanup on disconnect
- Update translations for error messages (EN/FR)
2025-12-10 00:43:46 +01:00
Matthieu MALVACHE 1da81fb305 fix: Prevent multiple data refreshes when navigating from settings
Use existing store data (mailboxes.length) as indicator instead of
separate dataLoaded flag. Simpler and cleaner approach.
2025-12-09 23:55:16 +01:00
Matthieu MALVACHE 63cb80cb1d feat: Wire up disconnected settings to actual functionality
- showPreview: Conditionally render email preview in list based on setting
- externalContentPolicy: Control external content (ask/block/allow modes)
- deleteAction: Move to trash or permanently delete based on preference
- debugMode: Add conditional logging via new lib/debug.ts utility

Also includes:
- Add moveToTrash method to JMAP client for trash-based deletion
- Update TODO.md with verified implementation status
- Migrate middleware.ts to proxy.ts (Next.js deprecation)
2025-12-09 23:51:20 +01:00
Matthieu MALVACHEandClaude 2f454cd673 fix: Improve UI/UX with dark mode selection visibility and auto-select inbox on login
- Fix dark mode folder selection not visible by improving accent color contrast (#1e3a8a)
- Fix inbox not selected by default on login (auto-select primary account inbox)
- Fix email store not cleared on logout (proper state reset between sessions)
- Add settings page with appearance, email behavior, and advanced options
- Integrate mark-as-read delay setting with proper useEffect implementation
- Reset dataLoaded flag on logout to ensure fresh data load on next login

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-02 16:39:10 +02:00
Matthieu MALVACHEandClaude 1e563a8973 fix: Fix sidebar footer overflow causing page height extension
- Add overflow-hidden to sidebar container to prevent absolute positioned menu from extending page height
- Improve theme consistency in email viewer security indicators
- Add AI spam analysis display (X-Spam-LLM header support)
- Enhance dark mode support with better color variables
- Update CLAUDE.md with commit/push guidelines

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-02 14:48:45 +02:00
Matthieu MALVACHE b2598caf90 fix: Implement infinite scroll without total count from server
Fix pagination to work with Stalwart JMAP server which doesn't return
the total count. Instead of relying on total:
- If we get exactly limit emails (50), assume there might be more
- If we get fewer than limit, we've reached the end

Also fixed observer target rendering - it now always renders instead of
being conditional, ensuring the intersection observer can work properly.
2025-10-02 14:44:37 +02:00
Matthieu MALVACHE aa7b8c1604 feat: Implement infinite scroll with pagination for email list
Add pagination support to load emails progressively as user scrolls:
- Update JMAP client getEmails() to accept position parameter
- Return pagination metadata (hasMore, total) from getEmails()
- Add loadMoreEmails() method to email store for loading next page
- Implement intersection observer in EmailList for automatic loading
- Display loading indicator while fetching more emails
- Show "no more emails" message at end of list

Users can now seamlessly scroll through all emails, loading 50 at a time.
2025-10-02 14:34:31 +02:00
Matthieu MALVACHE 5f45cbe993 feat: Add comprehensive shared folders support with multi-account access
Implemented full support for JMAP shared folders (delegated mailboxes):

Core Features:
- Multi-account mailbox fetching from all available JMAP accounts
- Virtual "Shared Folders" parent with account grouping in sidebar
- ID namespacing to prevent collisions across accounts (e.g., "b0:a" for shared Inbox)
- Account-aware email operations (fetch, view, mark as read)

Technical Implementation:
- Store all accounts from JMAP session (primary + shared)
- Transform mailbox IDs: primary uses original, shared use "accountId:mailboxId" format
- Store originalId for JMAP queries while using namespaced IDs in UI
- Transform email mailboxIds to match namespaced mailbox IDs for proper counter updates
- Pass accountId parameter through entire operation chain (fetch, view, mark read)

UI/UX Enhancements:
- Blue Users/User icons for shared folders in sidebar
- Hierarchical display with account grouping
- Proper unread counters that update when marking emails read
- Auto-mark emails as read when opened in shared folders

Bug Fixes:
- Fixed email content fetching showing wrong message in shared folders
- Fixed unread counters not updating for shared mailboxes
- Fixed mark-as-read not working on server for shared accounts
- Cleaned up debug logging
2025-10-02 13:57:19 +02:00
Matthieu MALVACHE 11cc516bb7 feat: Implement dynamic page titles with context awareness
Added dynamic page titles that update based on current context:
- Mailbox view: "Inbox (3) - Webmail" (with unread count)
- Reading email: "[Subject] - Webmail"
- Composing: "New Message - Webmail" (or Reply/Forward)
- Login page: "Login - Webmail"

Improved UX with at-a-glance information in browser tabs and better
navigation context. Supports i18n for all title components.
2025-10-02 13:25:55 +02:00
Matthieu MALVACHE f4ec48ad4a fix: Mark sent emails as seen to prevent unread indicator
When sending emails, they were not being marked with the $seen keyword,
causing them to appear as unread in the Sent folder. Added $seen: true
to keywords for both draft-based sends and new email sends.
2025-10-02 13:21:54 +02:00
Matthieu MALVACHE 0abb9d5f80 fix: Allow sending emails with attachments but no body text
The send validation was requiring body text, which prevented sending
emails that only have attachments. Changed validation to allow sending
when there's either body text OR uploaded attachments.
2025-10-02 13:19:13 +02:00
Matthieu MALVACHE aebdbc1687 fix: Capture latest draft ID after save to prevent race condition
When sending an email with attachments, saveDraft() would destroy+create
the draft (generating a new ID), but handleSend() was using the old ID
from React state which hadn't updated yet. This caused "notFound" errors.

Fixed by making saveDraft() return the draft ID and using it directly
in handleSend() instead of relying on async state updates.
2025-10-02 13:15:40 +02:00
Matthieu MALVACHE a453585e2d fix: Remove partId from attachment objects to comply with JMAP spec
JMAP spec states "The client may specify a partId OR a blobId, but not both."
We were incorrectly including both fields, causing "Cannot specify both partId
and blobId" errors when creating drafts with attachments.

Fixed by removing partId and size fields from attachment objects. The server
calculates size automatically from the blob content.
2025-10-02 13:11:27 +02:00
Matthieu MALVACHE 8b52fa4719 fix: Implement destroy+create pattern for draft updates with attachments
JMAP doesn't allow updating immutable properties (from, to, subject) on
existing drafts. Changed createDraft to destroy old draft and create new
one when updating, which allows attachments to be added/modified properly.

Also added comprehensive debug logging to uploadBlob and createDraft to
help troubleshoot upload issues.
2025-10-02 13:09:00 +02:00
Matthieu MALVACHEandClaude ec515c7da9 chore: Remove debug console.log statements
Cleaned up console output by removing all debug console.log statements
throughout the codebase:

- Removed 31 debug logs from lib/jmap/client.ts (connection, requests, etc.)
- Removed 4 debug logs from stores/email-store.ts (quota fetch, markAsRead)

Kept all console.error() statements for proper error handling.
The console is now clean with only relevant error messages displayed.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-02 13:03:19 +02:00
Matthieu MALVACHE 1a46281d49 docs: Update TODO.md to reflect quick reply and draft fixes
- Mark quick reply form as completed
- Mark draft auto-save integration fixes as completed
- Mark draft discard confirmation as completed
2025-10-02 13:02:23 +02:00
Matthieu MALVACHEandClaude 258f10d4ba feat: Implement functional quick reply and fix draft auto-save integration
Email Sending:
- Fix identity lookup for email submission (now properly fetches identities from server)
- Add Sent mailbox requirement for sending emails
- Add proper error handling and validation for email submission

Quick Reply Form:
- Replace dummy input with fully functional quick reply system
- Add state management for reply text with auto-expand on focus
- Implement direct send functionality without modal
- Add loading states and error handling
- Show character counter and action buttons (Cancel, More options, Send)
- Use real user avatar and email from auth store
- Auto-refresh email list after sending

Draft Auto-Save Integration:
- Fix critical issue where auto-saved drafts were ignored when sending
- Pass draftId through entire send chain (composer → store → client)
- Wait for pending auto-save before sending to prevent race conditions
- Add draft cleanup with discard confirmation when closing composer
- Delete orphaned drafts when user confirms discard
- Add i18n support for discard confirmation (EN/FR)

Benefits:
- No more orphaned drafts in Drafts folder
- Better performance (updates existing draft vs creating new email)
- Cleaner UX with proper draft lifecycle management
- Quick replies are truly quick (no modal needed)
- All user-facing messages properly translated

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-02 13:01:14 +02:00
Matthieu MALVACHE 216149af35 docs: Update TODO.md - mark loading states and transitions as completed 2025-10-02 12:57:03 +02:00
Matthieu MALVACHEandClaude 8bba87648c feat: Add smooth cross-fade transition when opening emails
Improved email loading UX with a polished cross-fade approach:

**Visual Continuity:**
- Removed jarring selectEmail(null) call that caused blank screen
- Current email stays visible while new one loads
- Smooth transition instead of abrupt pop-in

**Loading Feedback:**
- Semi-transparent overlay with subtle backdrop blur (2px)
- Centered loading card with spinner and message
- Small loading indicator in email header
- Both overlays fade in smoothly (200ms)

**React Optimization:**
- Added key prop based on email.id to email viewer
- Triggers proper React animations on email change
- Combined with 300ms fade-in creates smooth cross-fade effect

**Result:**
When clicking an email, the current email remains visible with a subtle
dimming effect while the new email loads, then smoothly transitions to
the new content. No more visual glitches or jarring blank screens.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-02 12:45:46 +02:00
Matthieu MALVACHEandClaude 09fb46c109 fix: Improve batch operations colors for better light mode support
Replaced hardcoded blue colors with theme CSS variables for consistent
appearance across light and dark modes:

**Color Changes:**
- Batch toolbar background: `bg-blue-50` → `bg-accent/30` (uses theme)
- Selection count text: `text-blue-700` → `text-foreground` (theme-aware)
- Checkbox checked color: `text-blue-600` → `text-primary` (theme variable)
- Selected email ring: `ring-blue-500/20` → `ring-primary/20` (theme-aware)
- Selected email background: `bg-blue-50/50` → `bg-accent/40` (consistent)
- Button hover states: `hover:bg-blue-100` → `hover:bg-accent` (theme-based)

**Benefits:**
- Consistent with application theme system
- Proper light/dark mode contrast
- Uses CSS variables from Tailwind config
- More subtle selection highlighting in light mode
- Better accessibility with theme-aware colors

All selection states now adapt seamlessly to the active theme.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-02 12:41:25 +02:00
Matthieu MALVACHEandClaude 3dea5e232b fix: Remove visual glitch when opening emails
Removed the jarring "Loading full email content..." banner that appeared
while email content was loading, which caused a visual flash/glitch.

Added smooth fade-in animation (300ms) to email viewer for better UX.

The loading state is now properly handled by the skeleton loader that
was added in the previous commit, so this intermediate loading banner
is no longer needed and was causing the visual glitch reported by the user.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-02 12:40:52 +02:00
Matthieu MALVACHEandClaude f66f7eaaa5 feat: Add smooth animations and visual feedback to batch operations
Enhanced the batch operations UI with polished animations and transitions:

**Toolbar Animations:**
- Smooth slide-down transition for batch actions toolbar (300ms ease-in-out)
- Animated slide-in effects for selection count and action buttons
- Collapsible toolbar with max-height and opacity transitions

**Checkbox Animations:**
- Zoom-in animation when checkboxes are checked (200ms)
- Scale effects on hover (110%) and active (95%) states
- Smooth opacity transitions for unchecked states
- Color transitions for checked state (blue theme)

**Selection Feedback:**
- Blue ring highlight on selected email items
- Subtle background tint for selected emails
- Animated "select all" button with scale and zoom effects
- Visual separator between action buttons

**Loading States:**
- Spinning loader icons during batch operations
- Disabled state with reduced opacity during processing
- 500ms delay after operations for smooth visual feedback
- Prevents multiple simultaneous batch operations

**Visual Polish:**
- Hover effects with background color transitions
- Active state feedback on all interactive elements
- Proper pluralization (email/emails) in selection count
- Consistent transition timing across all animations

All animations use Tailwind's built-in utilities and follow smooth easing curves for a premium feel.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-02 12:39:29 +02:00
Matthieu MALVACHEandClaude 642f36490a docs: Update TODO.md - mark batch operations as completed
Batch email operations feature has been implemented with:
- Checkbox selection for individual emails
- Select all/none functionality
- Bulk actions toolbar with mark read/unread and delete
- Batch operations in JMAP client and email store
- UI updates to support batch selections

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-02 12:36:09 +02:00
Matthieu MALVACHE 5f7dafeeba fix: Prevent autocomplete menu from reopening after selection on login page
- Add justSelectedSuggestion ref to track when a suggestion is selected
- Skip showing suggestions in useEffect when selection just occurred
- Fixes issue where menu would reopen immediately after Enter key selection
2025-10-02 12:34:36 +02:00
Matthieu MALVACHE c7104424b3 docs: Update TODO.md - mark login error handling as completed 2025-10-02 12:31:54 +02:00
Matthieu MALVACHE 5f804e7703 fix: Improve invalid credentials error handling for login
- Update auth store to properly detect 'Invalid username or password' error
- Map error to existing 'invalid_credentials' translation key
- Provide better user feedback when login fails
2025-10-02 12:31:29 +02:00
Matthieu MALVACHEandClaude 7c6ace427f feat: Add server capabilities, keep-alive, draft auto-save, and attachment upload
- Added server capability detection to check supported features
- Implemented keep-alive mechanism with periodic ping (every 30s)
- Added automatic session reconnection on connection failure
- Implemented draft auto-save with 2-second debounce
- Added visual indicators for draft save status
- Implemented attachment upload support with progress indication
- Added file attachment UI in email composer
- Updated JMAP client with blob upload functionality
- Enhanced disconnect handling to properly cleanup resources
- Updated TODO.md to reflect completed tasks

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-02 12:29:53 +02:00
Matthieu MALVACHE faef8f8197 docs: Update TODO.md with additional fixes 2025-10-02 12:19:36 +02:00
Matthieu MALVACHE 8f2f0e575e fix: Use theme variables for reply-to section colors 2025-10-02 12:19:20 +02:00
Matthieu MALVACHE 4ef7b662c3 docs: Update TODO.md with completed authentication and deployment tasks
- Added custom username autocomplete implementation
- Added modern minimalist UI redesign for login page
- Marked environment variable management as completed
2025-10-02 12:15:12 +02:00
Matthieu MALVACHE 37422b96af fix: Fix sender area colors in light mode
- Changed sender name from text-gray-900 to text-foreground
- Fixed To and CC field text colors from text-gray-700 to text-foreground
- Removed duplicate hover state on More actions button
- Changed More actions icon to use text-muted-foreground

All sender information now properly adapts to light/dark themes.
2025-10-02 12:10:53 +02:00
Matthieu MALVACHE dba80fe9a8 fix: Improve light mode styling in email viewer
- Replaced all hardcoded colors with theme-aware CSS variables
- Fixed duplicate hover states (removed hover:bg-gray-100)
- Changed dividers from bg-gray-200 to bg-border
- Updated dropdown menus to use bg-background instead of bg-white
- Fixed text colors to use text-foreground and text-muted-foreground
- Improved no-email-selected gradient background
- Removed prose-gray class for better theme compatibility

All UI elements now properly adapt to light/dark mode using CSS variables.
2025-10-02 12:07:12 +02:00