mirror of
https://github.com/root-fr/jmap-webmail.git
synced 2026-09-24 16:01:18 +00:00
b6330642c222b37e10fc4bec0763ed18dd5dd188
- Add reusable focus trap hook (use-focus-trap.ts) - Traps Tab/Shift+Tab within modal - Restores focus on close - Handles disabled elements gracefully - Enhance identity modal with WCAG 2.1 compliance - Add role="dialog" and aria-modal="true" - Add aria-labelledby linking to modal title - Implement focus trap on open - Add ARIA live regions to identity form - Error messages announced to screen readers - aria-describedby links inputs to errors - aria-invalid state on validation failure Accessibility: Improves keyboard navigation and screen reader UX Standards: WCAG 2.1 AA compliant for modal interactions Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
JMAP Webmail
A modern, privacy-focused webmail client built with Next.js and the JMAP protocol.
Screenshots
Login
Inbox
Email Viewer
Compose
Dark Mode
Settings
Features
- Modern UI - Clean, minimalist three-pane layout
- Dark Mode - Full dark theme support
- Email Threading - Gmail-style conversation view
- Real-time Updates - Push notifications for new emails
- Keyboard Shortcuts - Navigate efficiently with hotkeys
- Drag & Drop - Move emails between folders
- Color Tags - Organize emails with color labels
- Attachments - Upload and download file attachments
- Search - Full-text email search
- i18n - English and French language support
- Mobile Responsive - Adaptive layout for all screen sizes
Tech Stack
- Framework: Next.js 16 with Turbopack
- Styling: Tailwind CSS v4
- State: Zustand
- Protocol: JMAP (RFC 8620)
- i18n: next-intl
Getting Started
# Install dependencies
npm install
# Run development server
npm run dev
Open http://localhost:3000 and connect to your JMAP server.
Configuration
Create a .env.local file:
APP_NAME=Your Webmail
JMAP_SERVER_URL=https://your-jmap-server.com
Runtime vs Build-time Configuration
| Variable | Type | Description |
|---|---|---|
APP_NAME |
Runtime | App name displayed in the UI |
JMAP_SERVER_URL |
Runtime | JMAP server URL (required) |
NEXT_PUBLIC_APP_NAME |
Build-time | Legacy fallback for app name |
NEXT_PUBLIC_JMAP_SERVER_URL |
Build-time | Legacy fallback for server URL |
Runtime variables are read at request time, enabling post-build configuration (ideal for Docker).
Build-time variables are baked into the bundle and require a rebuild to change.
License
MIT
Languages
TypeScript
99.1%
CSS
0.7%
JavaScript
0.1%





