Commit Graph
72 Commits
Author SHA1 Message Date
Linus Rath ab72fc06ff feat: add Stalwart account security management
- Add Stalwart API client library (lib/stalwart/client.ts)
- Add server-side proxy routes for auth, crypto, password, principal, probe
- Add account security Zustand store with full state management
- Add Security settings tab with password change, display name, TOTP 2FA,
  app passwords, and encryption-at-rest controls
- Add stalwartFeaturesEnabled config flag (opt-out via STALWART_FEATURES=false)
- Add i18n translations for all 8 locales (en, de, es, fr, it, ja, nl, pt)
- Add tests for Stalwart client (24 tests) and security store (29 tests)
2026-03-12 02:20:56 +01:00
Linus Rath 68d4a9a641 feat: add email selection functionality with toggle and update translations 2026-03-12 00:32:36 +01:00
Linus Rath 5598c436f2 feat: add connection loss handling and update auth store 2026-03-12 00:08:52 +01:00
Linus Rath 256ff7698d feat: enhance email selection with checkbox functionality and improve session handling 2026-03-11 23:57:06 +01:00
Linus Rath 7848c90625 feat: add error handling for sessionStorage in redirect logic across multiple pages 2026-03-11 23:35:27 +01:00
Linus Rath f996ab77b8 feat: implement redirect after login functionality across multiple pages 2026-03-11 23:35:00 +01:00
Linus Rath a88b4e4407 feat: enhance folder settings with subfolder creation and navigation improvements 2026-03-11 23:19:01 +01:00
Linus Rath cc8195209b feat: add toolbar position setting and update email viewer layout
- Introduced a new setting for toolbar position in appearance settings, allowing users to choose between 'top' and 'below-subject'.
- Updated the EmailViewer component to conditionally render the toolbar based on the selected position.
- Enhanced the UI for the toolbar with action buttons for replying, archiving, and deleting emails.
- Added translations for the new toolbar position setting in multiple languages.
2026-03-11 22:42:21 +01:00
Linus Rath 288205fbac feat: add recipient popover component for enhanced contact interaction 2026-03-11 21:23:57 +01:00
Linus Rath 15dbb3d349 feat: update email composer to handle trailing commas and improve recipient input handling 2026-03-11 21:07:00 +01:00
Linus Rath 5f539161d5 feat: enhance toast component with enter/exit animations and progress bar 2026-03-11 20:40:24 +01:00
Linus Rath d3a5b4189e feat: enhance event modal for desktop and mobile views 2026-03-11 20:35:25 +01:00
Linus Rath e5c1cd45c5 feat: europeanize mock JMAP data and refine email list layout
Replace all mock data in the dev JMAP server with European-themed
content: 42 emails (was 13), 20 contacts across 2 address books
(was 3), 5 calendars and 35 events with recurrence, overlaps,
and all-day entries.

Move keyword tags in email/thread list items from the subject line
to the header row alongside the date for a cleaner layout.

Update test assertions to match the new mock data.
2026-03-11 20:21:39 +01:00
Linus Rath 454d51e283 feat: refactor email tagging system to use labels instead of colors
- Updated EmailContextMenu to replace color tag functionality with label tags.
- Modified EmailListItem to display label badges for emails based on keywords.
- Enhanced EmailViewer to include a tag picker for emails.
- Adjusted ThreadListItem to show label badges for email subjects.
- Added tests for email list item and keyword settings to ensure proper functionality of the new tagging system.
- Updated localization files to reflect changes from color tags to labels in multiple languages.
2026-03-11 18:56:43 +01:00
Linus Rath ffeb534740 feat: implement email keyword management with color tagging
- Introduced a new settings section for managing email keywords (labels/tags) with associated colors.
- Updated email context menu, viewer, and list item components to support the new keyword system.
- Refactored color tag handling to accommodate both new $label: and legacy $color: prefixes.
- Added utility functions for retrieving email color tags based on keywords.
- Enhanced localization files to include translations for the new keyword management features.
- Updated the settings store to manage keyword definitions, including add, update, delete, and reorder functionalities.
- Added tests for the new keyword handling logic.
2026-03-11 18:40:09 +01:00
Linus Rath 61459c4923 feat: update bottom navigation to support tablet view in mobile layout 2026-03-11 18:13:19 +01:00
Linus Rath d23e9a642c feat: enhance mobile responsiveness across calendar and contact components
- Added `isMobile` prop to `CalendarWeekView`, `EventDetailPopover`, `ContactDetail`, `ContactGroupDetail`, and `EmailComposer` components for improved mobile layout.
- Adjusted layout and styles in `CalendarWeekView` to display a 3-day view on mobile.
- Updated `EventDetailPopover` to adapt its size and layout for mobile devices.
- Modified `ContactDetail` and `ContactGroupDetail` to adjust padding and font sizes based on mobile view.
- Enhanced `EmailComposer` with mobile-friendly header and field layouts, including auto-saving draft functionality.
- Added confirmation dialog for unsaved changes when closing the email composer.
- Updated localization files to include new strings for draft management.
2026-03-11 18:07:44 +01:00
Linus Rath 723aff38f2 feat: add settings synchronization feature with server, including UI toggle and localization 2026-03-11 16:46:43 +01:00
Linus Rath a8a1ad1d54 feat: implement settings synchronization with server, including encryption and API endpoints 2026-03-11 16:22:47 +01:00
Linus Rath cf5f271be2 Merge branch 'main' of https://github.com/rathlinus/jmap-webmail 2026-03-11 16:04:59 +01:00
Linus Rath d09022378b feat: add devMode configuration to runtime settings and update LoginPage for theme management 2026-03-11 16:01:31 +01:00
Linus Rath 4576d37c7a feat: enhance settings page with mobile layout and add tab groups to localization files 2026-03-11 11:11:27 +01:00
Linus Rath 40e7fa3776 style: format CSS 2026-03-10 16:12:48 +01:00
Linus Rath c1956bfb2d feat: enhance WelcomeBanner with settings button and update styles for better layout 2026-03-10 16:11:14 +01:00
Linus Rath c7485f532c Merge fix/sieve-filter-save-21: fix sieve activation (RFC 9661) - fixes #21 2026-03-10 15:30:24 +01:00
Linus Rath 9008a3decf fix: use onSuccessActivateScript for sieve activation - fixes #21 2026-03-10 15:25:58 +01:00
Linus Rath fed508d5b7 fix: demo-only features for gender inference and custom avatars in development 2026-03-09 21:08:45 +01:00
Linus Rath 8985865843 feat: inline search filters, folder icon picker, richer demo data & UI polish
- Replace advanced search panel with inline filter chips and collapsible fields
  (from/to/subject/body inputs, folder dropdown, attachment/flagged/read toggles)
- Add debounced auto-search on filter field changes
- Folder settings: add icon picker for custom per-folder icons, toast feedback,
  reorder sections (folder list first, roles second), empty-state illustration
- Avatar: show sender favicon for company domains, randomuser.me portraits for
  personal emails, custom avatars for demo senders, fallback to initials
- Add /api/favicon proxy route for fetching domain favicons
- Settings store: add senderFavicons toggle and folderIcons persistence
- Richer mock inbox with 11 realistic emails (GitHub, Slack, Stripe, Vercel, etc.)
- Navigation rail & sidebar cleanup, permanent-delete warning i18n (all 8 locales)
- Rename search toggle label to 'More', add body/folder filter translations
2026-03-09 20:59:32 +01:00
Linus Rath d41718768b feat: folder management settings with CRUD and standard role assignment 2026-03-09 19:27:32 +01:00
Linus Rath cf02f587de feat: resizable columns, nav rail overhaul, multi-select & drag-drop, UI polish
Resizable Columns
- Add ResizeHandle component with mouse drag, keyboard (Arrow keys),
  and double-click to reset to default width
- Add sidebarWidth/emailListWidth to ui-store with clamping + persistence
- Wire resize handles between sidebar/email-list panels on desktop

Navigation Rail Overhaul
- Move StorageQuotaCircle, push-status, sign-out from Sidebar to NavigationRail
- Interactive SVG ring with popover breakdown (used/free/total)
- Sidebar collapse state lifted to ui-store
- Show total email count per mailbox alongside unread badge

Email Multi-Selection & Drag-and-Drop
- Ctrl+Click (toggle) and Shift+Click (range) on all list items
- Add selectRangeEmails and lastSelectedEmailId to email-store
- Enable drag-and-drop on thread items and thread headers
- useEmailDrag accepts optional threadEmails for full-thread drag

Email Viewer Layout
- Remove card wrapper for cleaner full-width reading
- Always render HTML body when available
- Adjust skeleton loader to match flat layout

Modal & UI Polish
- Standardise backdrops, close buttons, padding, border-radius, transitions
- Migrate template-string classNames to cn() in settings
- Unify focus-ring token to ring-ring on form controls

i18n
- Add storage_used/free/total keys to all 8 locales

Dev Mock JMAP Server (new, gated by DEV_MOCK_JMAP=true)
- Session, Mailbox/Email/Thread/Identity CRUD, back-references, upload
- GET /download with Content-Disposition, GET /eventsource SSE

Tests (46 new)
- ui-store (13), email-selection (10), resize-handle (9), mock-server (14)
2026-03-09 16:46:25 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 58b9b70871 fix: resolve context menu submenu and move-to-folder issues (#19) 2026-03-02 09:10:03 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 92620fb790 fix: details toggle UX, Edge Runtime warnings, minimatch CVE
- Keep show/hide details button in place when expanded (#18)
- Use i18n translations for details toggle text
- Split instrumentation for Edge Runtime compatibility
- Patch minimatch ReDoS (CVE-2026-27903)
2026-02-28 21:03:02 +01:00
Matthieu MALVACHEandMatthieu MALVACHE a3fe9deaa6 feat: add server-side version update check
Logs current version on startup and checks GitHub for newer releases.
Only runs in production, output stays in server logs (no client exposure).
2026-02-28 14:59:11 +01:00
Matthieu MALVACHEandMatthieu MALVACHE c65a6454c5 fix: remove jmap-jam reference, clean up README language 2026-02-26 13:50:39 +01:00
Matthieu MALVACHEandMatthieu MALVACHE a7908692ef fix(docker): resolve 4 CVEs in production image
Remove npm/npx from runner stage and upgrade Alpine packages to
patch minimatch, tar, busybox, and zlib vulnerabilities.
2026-02-26 13:39:57 +01:00
Matthieu MALVACHEandMatthieu MALVACHE c59bf63603 chore: disable Next.js telemetry in Docker image 2026-02-26 01:16:24 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 29f186b6f2 feat(ci): publish Docker image to Docker Hub and GHCR
Add dual-registry publishing to both Docker Hub (rootfr/jmap-webmail)
and GitHub Container Registry. Multi-arch support for amd64/arm64.
2026-02-26 01:13:29 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 1b0e3e41c6 feat: add "Remember me" session persistence and simplify 2FA UX 2026-02-26 00:47:53 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 7b6b8fc132 feat(auth): add RP-initiated logout and OAuth unit tests
OAuth logout now terminates the IdP session via end_session_endpoint
with HTTPS-only URL validation. Adds 14 unit tests for PKCE and
OAuth discovery.
2026-02-26 00:08:57 +01:00
Matthieu MALVACHEandMatthieu MALVACHE ec06b0c494 feat: add OAuth2/OIDC with PKCE for SSO login
Add opt-in SSO authentication alongside Basic Auth. OAuth endpoints are
auto-discovered via .well-known, with support for external IdPs
(Keycloak, Authentik) via configurable OAUTH_ISSUER_URL. Sessions
persist through httpOnly refresh token cookies with automatic renewal.
2026-02-25 23:41:37 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 110dd98ad4 fix(spam): use correct mailbox ID when moving emails out of junk 2026-02-25 16:14:05 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 08ee6b6932 fix: robust session URL rewriting for default port normalization 2026-02-25 12:45:10 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 02f4ce81e3 fix: include sender display name in From header and default identity selection
- Emails now include the identity display name in the From field so recipients
  see "Name <email>" instead of bare "<email>"
- Primary identity (matching login username) is pre-selected in composer dropdown
2026-02-25 12:35:39 +01:00
Matthieu MALVACHEandMatthieu MALVACHE ff3ae80f23 fix: rewrite JMAP session URLs to match user-configured server origin
Fixes Docker/reverse proxy deployments where the JMAP server returns
its internal hostname in session URLs, causing all requests after
login to fail.
2026-02-24 15:17:49 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 913f673f73 feat: detect CORS errors and show actionable guidance on login
Distinguish CORS-blocked requests from genuine network failures using
a no-cors probe, so users deploying via Docker see a specific message
pointing to their JMAP server's CORS settings instead of a misleading
"unable to reach the server" error.
2026-02-23 18:21:23 +01:00
Matthieu MALVACHEandMatthieu MALVACHE a0bb200da4 chore: remove unused dependencies and explicit phantom deps 2026-02-22 23:00:35 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 15c14b1833 chore: update dependencies and fix calendar event hooks
Bump tailwindcss 4.2.0, lucide-react 0.575.0, @typescript-eslint 8.56.0,
tailwind-merge 3.5.0, and patch-level updates across 48 transitive packages.
Fix missing useCallback dependency in calendar event card.
2026-02-22 18:07:30 +01:00
Matthieu MALVACHEandMatthieu MALVACHE 838ee4b8e5 fix(calendar): produce correct JMAP patch when removing recurrence rules
Include recurrenceRules, recurrenceOverrides, and excludedRecurrenceRules
in the update patch when clearing recurrence from an event. Also fix
"this and future" scope overriding user's recurrence changes.

Fixes #14
2026-02-22 17:52:21 +01:00
Matthieu MALVACHEandMatthieu MALVACHE ccbab654f3 feat(calendar): add drag-create, resize, recurring scope, quick-create, and duplication
- Click-drag on empty time slots to create events with pre-filled time range
- Resize events by dragging bottom edge (15-min snap, optimistic JMAP update)
- Recurring event edit/delete scope dialog (this/following/all occurrences)
- Double-click quick event creation with inline title input
- Event duplication button in modal (+1 day offset)
- Shared interaction hook for pointer-based calendar interactions

Fixes #13
2026-02-22 17:32:10 +01:00
Matthieu MALVACHEandMatthieu MALVACHE fb7cfe1634 fix(ci): add path filters to Docker workflow to avoid unnecessary rebuilds 2026-02-21 23:59:03 +01:00