Files
jmap-webmail/package.json
T
Matthieu MALVACHEandClaude Sonnet 4.5 da9fa4e28a feat(email): add spam reporting with bidirectional handling
Implement comprehensive spam management allowing users to report spam emails and restore false positives. Emails are moved to/from the Junk folder with toast notifications and undo support.

Key features:
- Mark as spam: moves email to Junk folder with 5-second undo
- Mark as not spam: restores email from Junk to inbox
- Batch spam operations via context menu
- Smart toggle based on current folder (Junk vs other folders)
- Keyboard shortcut (Shift+!) for quick spam reporting
- Full i18n support (EN/FR)
- Shared mailbox compatibility

UX improvements:
- Toast notifications with undo action using sonner library
- Auto-deselect email after spam action
- Visual distinction with red destructive styling
- Desktop button + context menu + keyboard shortcuts

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-08 17:55:24 +01:00

78 lines
2.0 KiB
JSON

{
"name": "jmap-webmail",
"version": "0.1.0",
"private": true,
"description": "A modern JMAP webmail client built for Stalwart Mail Server",
"author": "Matthieu MALVACHE <matthieu@root.cloud>",
"license": "MIT",
"repository": {
"type": "git",
"url": "git+https://github.com/root-fr/jmap-webmail.git"
},
"homepage": "https://github.com/root-fr/jmap-webmail",
"bugs": {
"url": "https://github.com/root-fr/jmap-webmail/issues"
},
"keywords": [
"jmap",
"webmail",
"stalwart",
"email",
"nextjs",
"react",
"typescript"
],
"scripts": {
"dev": "next dev --turbopack",
"build": "next build --turbopack",
"start": "next start",
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"prepare": "husky",
"typecheck": "tsc --noEmit",
"seed:demo": "npx tsx scripts/seed-demo.ts",
"test": "vitest",
"test:ui": "vitest --ui",
"test:coverage": "vitest --coverage"
},
"dependencies": {
"@types/dompurify": "^3.0.5",
"clsx": "^2.1.1",
"date-fns": "^4.1.0",
"dompurify": "^3.2.7",
"jmap-jam": "^0.13.1",
"lucide-react": "^0.562.0",
"next": "^16.0.8",
"next-auth": "^4.24.11",
"next-intl": "^4.5.8",
"react": "^19.2.1",
"react-dom": "^19.2.1",
"sonner": "^2.0.7",
"tailwind-merge": "^3.3.1",
"zustand": "^5.0.9"
},
"devDependencies": {
"@tailwindcss/postcss": "^4",
"@testing-library/dom": "^10.4.1",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.1",
"@types/node": "^22",
"@types/react": "^19",
"@types/react-dom": "^19",
"@typescript-eslint/eslint-plugin": "^8.49.0",
"@typescript-eslint/parser": "^8.49.0",
"@vitejs/plugin-react": "^5.1.2",
"@vitest/ui": "^4.0.16",
"eslint": "^9.39.1",
"eslint-config-next": "^16.0.8",
"eslint-plugin-react": "^7.37.5",
"globals": "^16.5.0",
"husky": "^9.1.7",
"jsdom": "^27.4.0",
"lint-staged": "^16.2.7",
"tailwindcss": "^4.1.17",
"typescript": "^5",
"vitest": "^4.0.16"
}
}