Files
webmail/package.json
T
dealerweb 2b5110e0e4 feat: mention a recipient by first name with @ in the message body
Typing @ at the start of a word in the rich-text body offers the To and
Cc recipients (contact groups expanded) and inserts the chosen one's
first name as plain text. The name comes from the display name; with a
firstname.lastname@ address, the address tells which word of the name is
the first name, and without a name the address supplies it. A bare
initial keeps the mailbox name (@m.mustermann), and recipients who share
a first name get their full name. Bcc recipients are never offered -
naming one in the text would disclose them to everyone else.

The list only opens while a recipient matches, so Enter and Escape
otherwise keep their usual meaning. While it is open, Escape closes the
list rather than the composer, which handles Escape in the capture phase,
and the list closes when the editor loses focus.

Built on @tiptap/suggestion, at the version of the other TipTap packages.
2026-09-30 22:43:59 +02:00

115 lines
3.6 KiB
JSON

{
"name": "bulwark-webmail",
"version": "1.12.0",
"description": "Bulwark Webmail - a modern webmail client built for Stalwart Mail Server",
"author": "Bulwark Mail <dev@bulwarkmail.org>",
"license": "AGPL-3.0-only",
"repository": {
"type": "git",
"url": "git+https://github.com/bulwarkmail/webmail.git"
},
"homepage": "https://github.com/bulwarkmail/webmail",
"bugs": {
"url": "https://github.com/bulwarkmail/webmail/issues"
},
"keywords": [
"jmap",
"webmail",
"stalwart",
"email",
"nextjs",
"react",
"typescript"
],
"scripts": {
"dev": "next dev --turbopack",
"build": "next build --turbopack",
"build:lite": "node scripts/lite/build.mjs",
"lite:serve": "node scripts/lite/serve.mjs out 4173",
"test:lite-smoke": "playwright test -c scripts/lite/smoke/playwright.config.ts",
"test:lite-smoke:stalwart": "playwright test -c scripts/lite/smoke/playwright.stalwart.config.ts",
"start": "next start",
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"test:translations": "vitest run --no-isolate lib/__tests__/translations.test.ts",
"test:integration": "bash integration/run-tests.sh",
"prepare": "husky",
"typecheck": "next typegen && tsc --noEmit"
},
"dependencies": {
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@noble/curves": "^2.4.0",
"@noble/hashes": "^2.4.0",
"@tabler/icons-react": "^3.47.0",
"@tanstack/react-virtual": "^3.13.24",
"@tiptap/extension-color": "^3.31.3",
"@tiptap/extension-heading": "^3.31.3",
"@tiptap/extension-link": "^3.31.3",
"@tiptap/extension-paragraph": "^3.31.3",
"@tiptap/extension-placeholder": "^3.31.3",
"@tiptap/extension-table": "^3.31.3",
"@tiptap/extension-table-cell": "^3.31.3",
"@tiptap/extension-table-header": "^3.31.3",
"@tiptap/extension-table-row": "^3.31.3",
"@tiptap/extension-text-align": "^3.31.3",
"@tiptap/extension-text-style": "^3.31.3",
"@tiptap/extension-underline": "^3.31.3",
"@tiptap/pm": "^3.31.3",
"@tiptap/react": "^3.31.3",
"@tiptap/starter-kit": "^3.31.3",
"@tiptap/suggestion": "^3.31.3",
"clsx": "^2.1.1",
"date-fns": "^4.1.0",
"dompurify": "^3.4.12",
"jalaali-js": "^2.0.0",
"jszip": "^3.10.1",
"next": "^16.2.6",
"next-intl": "^4.13.3",
"otpauth": "^9.5.0",
"pdfjs-dist": "^6.0.227",
"postal-mime": "^2.7.4",
"qrcode": "^1.5.4",
"react": "^19.2.5",
"react-dom": "^19.2.5",
"sharp": "^0.35.4",
"tailwind-merge": "^3.4.0",
"undici": "^7.29.1",
"zustand": "^5.0.12"
},
"devDependencies": {
"@eslint/js": "^9.39.4",
"@playwright/test": "^1.59.1",
"@tailwindcss/postcss": "^4.2.4",
"@testing-library/dom": "^10.4.1",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.1",
"@types/node": "^25.6.0",
"@types/qrcode": "^1.5.6",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"@typescript-eslint/eslint-plugin": "^8.59.0",
"@typescript-eslint/parser": "^8.59.0",
"@vitejs/plugin-react": "^6.0.1",
"@vitest/ui": "^4.1.11",
"esbuild": "^0.28.0",
"eslint": "^9.39.4",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^7.1.1",
"fake-indexeddb": "^6.2.5",
"globals": "^17.5.0",
"husky": "^9.1.7",
"jsdom": "^28.1.0",
"tailwindcss": "^4.2.4",
"tw-animate-css": "^1.4.0",
"typescript": "^5.9.3",
"vitest": "^4.1.11"
},
"overrides": {
"flatted": "^3.4.2",
"picomatch": "^4.0.4",
"undici": "$undici"
}
}