Commit Graph
56 Commits
Author SHA1 Message Date
Linus Rath 9b3a47f9be feat: enhance contact management with import functionality and keyword filtering 2026-03-19 08:38:59 +01:00
Linus Rath 0fcc932e66 fix: adjust popover alignment to the right 2026-03-19 07:44:11 +01:00
Linus Rath fc79bf4f9b fix: resolve default sender to canonical identity on local-part login
When authenticating with a local-part username (e.g. 'user' instead of
'user@domain.tld') on Stalwart 0.15.x, the default sender could resolve
to an alias identity instead of the canonical mailbox address.

- Add emailMatchesUsername() helper that matches local-part usernames
  against full email addresses (e.g. 'user' matches 'user@domain.tld')
- Prefer canonical identities (mayDelete=false) over aliases as tiebreaker
- Add preferredPrimaryId to identity store (persisted to localStorage)
  so users can explicitly set their default sender
- Add 'Set as Primary' star button in identity manager modal
- Fix sendEmail() fallback identity resolution for local-part usernames
- Add i18n strings for all 8 supported locales

Fixes #43
2026-03-18 20:05:35 +01:00
Linus Rath b844b88733 fix: enhance calendar event handling with IMIP invitation and cancellation support 2026-03-18 19:59:47 +01:00
Linus Rath bcdde9f454 fix: add support for email attachments in sendEmail functionality and update related components 2026-03-18 18:51:20 +01:00
Linus Rath bb72ac92ae fix: implement draft editing functionality across email components and add localization keys 2026-03-18 18:39:46 +01:00
Linus Rath 6457b27125 fix: enhance calendar event creation with double-click support and modal date handling 2026-03-18 18:13:33 +01:00
Linus Rath ef562bcaad fix: add email export/import localization keys for multiple languages 2026-03-18 18:00:51 +01:00
Linus Rath 9fdbb62205 fix: update gender handling to use speakToAs structure and adjust localization keys 2026-03-18 17:55:29 +01:00
Linus Rath 2edbf379e2 fix: implement unwrapping of embedded message/rfc822 attachments and enhance HTML body validation 2026-03-18 17:32:25 +01:00
Linus Rath cdc521b693 fix: add time-based sorting for events in buildWeekSegments function 2026-03-18 17:02:37 +01:00
Linus Rath a57492d7c0 fix: refactor overflow handling in EmailViewer component to use hidden priorities and layout effects 2026-03-18 16:56:24 +01:00
Linus Rath 2b4ff2f3de fix: remove debugMode usage from EmailViewer component 2026-03-18 16:33:55 +01:00
Linus Rath 5a3f9faafe fix: update dompurify to version 3.3.3 and elliptic to version 6.6.1, add undici override 2026-03-18 16:10:47 +01:00
Linus Rath 38c04099e2 Bump version to 1.4.1 2026-03-18 15:42:37 +01:00
Linus Rath ae14e09f66 fix: enforce image and table styling 2026-03-18 15:40:08 +01:00
Linus Rath ada356e440 fix: menu overvlow fixed with submenu support for move and tag actions 2026-03-18 15:35:17 +01:00
Linus Rath a886edda6f fix: deduplicate toolbar and fix overflow detection
Extract shared renderToolbarItems() function to eliminate ~850 lines of
duplicated toolbar code between 'top' and 'below-subject' positions.

Add overflow support to Reply, Reply All, and Forward buttons with
data-overflow-item attributes and corresponding More menu entries.

Fix overflow detection algorithm: temporarily disable flex-shrink on
child groups during measurement so scrollWidth reflects natural widths
instead of flex-compressed values. Add overflow-hidden to toolbar
container to prevent visual overflow during recalculation.
2026-03-18 15:29:16 +01:00
Linus Rath ff97d8bc4c feat: enhance TNEF parsing with detailed debug logging for better traceability 2026-03-18 15:00:53 +01:00
Linus Rath b1db100c3a feat: enhance email body handling by prioritizing textBody for minimal HTML and expanding JMAPClient properties 2026-03-18 14:53:08 +01:00
Linus Rath 19584cfef6 feat: add email import/export functionality with .eml support 2026-03-18 14:44:12 +01:00
Linus Rath 8a2ef5a6c5 feat: integrate webcrypto-liner for legacy algorithm support in S/MIME handling 2026-03-18 14:29:29 +01:00
Linus Rath 6ed30059e5 Merge branch 'dev' of https://github.com/bulwarkmail/webmail into dev 2026-03-17 20:53:53 +01:00
Linus Rath a2cb2b2c86 fix: proper support for all-day events 2026-03-17 20:51:47 +01:00
Linus Rath e759056d5f Merge branch 'main' of https://github.com/bulwarkmail/webmail 2026-03-16 15:18:29 +01:00
Linus Rath 1b35c9e3d6 feat: enhance contacts management with sidebar and selection features 2026-03-16 15:15:58 +01:00
Linus Rath ed4be96706 fix: update sidebar border styling for consistency across pages 2026-03-16 11:02:34 +01:00
Linus Rath 8044c60905 Merge branch 'main' of https://github.com/bulwarkmail/webmail 2026-03-16 09:54:03 +01:00
Linus Rath 8d0c525e68 fix: update avatar background color logic based on image source 2026-03-16 09:50: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 d1478fa46b feat: expand supported locales in request configuration 2026-03-14 19:03:37 +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 f995558bf5 feat: update email list messages for improved clarity and localization support 2026-03-14 16:59:36 +01:00
Linus Rath f1f31df0af feat: implement wildcard query functionality for enhanced search capabilities 2026-03-14 16:50:43 +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 98cb3e158b feat: implement dropdown menus for actions in EmailViewer component 2026-03-14 16:14:13 +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 6fc27804d6 feat: integrate dev mode configuration for profile picture retrieval in Avatar component 2026-03-14 15:46:55 +01:00
Linus Rath 4a90cf4fa0 feat: enhance email search functionality to support OR conditions across multiple fields 2026-03-14 15:43:29 +01:00
Linus Rath 528515611e fix: add local private data directory to .gitignore 2026-03-14 15:32:12 +01:00
Linus Rath 6c4acdc655 fix: prevent browser auth dialog when viewing emails with inline images
Inline CID images were replaced with raw JMAP download URLs that require authentication. When the browser loaded these as <img src>, the server responded with WWW-Authenticate: Basic, triggering a native login popup.

- Add fetchBlobAsObjectUrl() to JMAPClient that fetches blobs via authenticated request and returns blob: object URLs
- Update email-viewer and thread-conversation-view to fetch CID images asynchronously with auth, using blob: URLs instead of raw server URLs
- Add ALLOWED_URI_REGEXP to DOMPurify config so blob: URLs are not stripped during sanitization
- Add tests for fetchBlobAsObjectUrl and CID/blob URL sanitization
2026-03-14 13:39:56 +01:00
Linus Rath 202a75db0c Merge branch 'main' of https://github.com/bulwarkmail/webmail 2026-03-14 01:22:32 +01:00
Linus Rath d7b99ac95c docs: add acknowledgments section to README.md 2026-03-14 01:22:07 +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 4396bc9943 Merge branch 'main' of https://github.com/bulwarkmail/webmail 2026-03-13 19:48:07 +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 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 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 481d566eb6 feat: sender favicon avatars 2026-03-09 18:55:44 +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