Commit Graph
67 Commits
Author SHA1 Message Date
Linus Rath 05f02402e3 feat: add move-to mailbox functionality in email viewer 2026-03-15 00:53:19 +01:00
Linus Rath 5accf0a86c feat: enhance contact group management with uid normalization and improved member handling 2026-03-15 00:40:32 +01:00
Linus Rath caed067cda feat: implement calendar management features including create, update, and delete functionalities 2026-03-15 00:14:58 +01:00
Linus Rath f149501dff feat: auto-fetch full email content when an email is auto-selected 2026-03-14 21:47:50 +01:00
Linus Rath a9a8710909 feat: mobile long-press context menu, settings logout button
Mobile:
- Add useLongPress hook (500ms, movement cancellation, press feedback)
- Disable drag-and-drop on mobile in useEmailDrag
- Wire long-press context menu to all email list item components
- Add select-none and visual press feedback (scale + ring)

Settings:
- Add logout button to settings page sidebar
2026-03-14 19:16:49 +01:00
Linus Rath d5404de224 feat: add extra-compact density option and fix font size scaling
- Add 'extra-compact' density level that hides avatars and preview
  text, showing only sender and subject for maximum information density
- Add visual density preview in appearance settings showing a 3-row
  email list mockup that reflects each density option
- Fix global font size setting only changing line height by moving
  font-size from body to :root so rem-based Tailwind classes scale
- Apply extra-compact behavior to email list items, thread list items,
  thread email items, and thread conversation view (EmailCard)
- Update email list virtualizer size estimates for extra-compact
- Add extra-compact translations for all 8 locales
2026-03-14 18:59:00 +01:00
Linus Rath 838de8e5da fix: make density setting functional across entire UI
Rename "List Density" to "Density" and apply spacing changes globally
instead of only to email list item heights.

- Replace hardcoded padding/gap values with CSS custom properties
  (--density-item-py, --density-item-gap, --density-header-py,
  --density-card-p, --density-sidebar-py) set via JS on :root
- Apply density-responsive spacing to email list items, thread views,
  email viewer, sidebar, navigation rail, contacts, and calendar
- Use inline styles instead of Tailwind arbitrary value classes to
  avoid Turbopack compilation hangs
- Rename listDensity → density in store, types, and components
- Add persist migration (v1 → v2) and onRehydrateStorage callback
- Update all 8 locale files with broadened labels/descriptions
2026-03-14 18:35:43 +01:00
Linus Rath 86673a7b45 chore: update version to 1.2.4 2026-03-14 17:17:22 +01:00
Linus Rath f7bbab5e4a feat: implement tag counts fetching and display in sidebar and email components 2026-03-14 17:12:38 +01:00
Linus Rath c024d89477 feat: enhance email search results display with pluralization and localization support 2026-03-14 16:37:24 +01:00
Linus Rath 1936a37f28 feat: add destructive color variables and enhance unsubscribe banner functionality 2026-03-14 16:29:26 +01:00
Linus Rath 85b5b3c4f1 feat: refactor authentication handling to use centralized Stalwart credentials management 2026-03-14 15:55:59 +01:00
Linus Rath 0ea79f29db fix: optimize theme store usage with shallow comparison in LoginPage 2026-03-13 23:11:12 +01:00
Linus Rath 2fe1b01d4d feat: add configurable logo to login page with light/dark mode support
- Display Bulwark logo on the login page, with theme-aware switching
  between light and dark variants based on the resolved theme
- Add LOGIN_LOGO_LIGHT_URL and LOGIN_LOGO_DARK_URL env variables to
  allow custom logo overrides (defaults to bundled Bulwark branding)
- Expose logo config through /api/config endpoint and useConfig hook
- Add logo URL prompts to the setup.sh installer branding step
- Rename branding assets to use underscores instead of spaces
2026-03-13 19:45:09 +01:00
Linus Rath 099434a125 chore: release v1.2.3
Bump version to 1.2.3 across package.json, VERSION, README badge,
and login page. Add changelog entry for features and fixes since v1.1.2.
2026-03-13 14:48:32 +01:00
Linus Rath 091c10d828 Add branding assets, update logos in README/CONTRIBUTING/ROADMAP, replace favicon with SVG icon 2026-03-13 14:27:35 +01:00
Linus Rath e85d0b946e chore: rename JMAP Webmail to Bulwark Webmail and update all URLs 2026-03-13 13:14:08 +01:00
Linus Rath b090bf6d52 feat: add support for OAuth-only login mode and update configuration handling 2026-03-12 22:05:29 +01:00
Linus Rath ae29e64197 feat: implement hover functionality for calendar events and enhance email deletion confirmation 2026-03-12 19:53:08 +01:00
Linus Rath 6f0d47cbd9 feat: improve email selection logic after deletion and archiving 2026-03-12 16:12:16 +01:00
Linus Rath 2a73adf588 feat: update layout height to use dynamic viewport height for better responsiveness 2026-03-12 16:05:40 +01:00
Linus Rath 7fedcb8e58 feat: enhance contact management and vCard support
- Added support for parsing and generating additional vCard properties including GENDER, LOGO, SOUND, LABEL, CALURI, CALADRURI, FBURL, and SOURCE.
- Extended ContactCard interface to include new fields such as gender, media, anniversaries, online services, and personal info.
- Implemented logic to handle multi-part TLDs for domain extraction in avatars.
- Improved avatar component to prioritize contact photos and handle inline images in emails.
- Updated localization files to include new fields and labels for contact details.
- Refactored contact store to expose a method for retrieving contact photos.
- Enhanced unit tests to cover new vCard properties and ensure correct parsing and generation.
2026-03-12 15:54:09 +01:00
Linus Rath 3efb292c3b feat: implement negative caching for favicon requests to improve performance 2026-03-12 03:14:07 +01:00
Linus Rath bb40326809 feat: implement tagging functionality for emails with drag-and-drop support 2026-03-12 03:10:40 +01:00
Linus Rath 2249741c61 feat: add login page customization options and corresponding translations 2026-03-12 02:31:56 +01:00
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 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 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 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 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 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 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 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