The console demanded a second factor and refused to open without one, but
enrolment lived on the other surface - so an operator whose only account
was the administrator had no way in. The password was already verified at
that point, so the refusal now carries a short-lived grant that permits
enrolling a factor and nothing else, and the admin login screen walks
through it: secret, confirmation, recovery codes, sign in. Two tests cover
it, including that the grant opens no other endpoint.
The rewrite also undid work that was already in place:
- The postcss override was dropped and the advisory came back, along
with a critical one in vitest. postcss is a direct dependency now, so
the fix is the version plus an override scoped to Next's own copy;
vitest moves to 3.2.7. The lockfile needed regenerating for either to
take effect. Zero advisories now.
- 100 language-lint violations: the admin console had been rewritten
with its strings in Portuguese, hardcoded. That fails CI, and it also
puts those strings beyond the reach of the translation bundles - an
English or Spanish user would have read Portuguese. They are English
in the source again.
- The mail screen put a fixed 320px list beside the reader with no
breakpoint, so on a phone the viewport overflowed and the message was
a few pixels wide. One pane at a time below md, with a way back.
- The icon-only navigation toggles had nothing for a screen reader to
announce.
The layouts' own mobile navigation and every previously fixed behaviour
survived the rewrite - checked rather than assumed.
Also fixes a marker collision I introduced: the E2E helper locates the
repository by a migrations directory, and services/migrations satisfied
that one directory too early. It now requires the SQL to actually be
there.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
40 lines
861 B
JSON
40 lines
861 B
JSON
{
|
|
"name": "@lambdamail/webmail",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"scripts": {
|
|
"dev": "next dev",
|
|
"build": "next build",
|
|
"start": "next start -p 3000",
|
|
"test": "vitest run",
|
|
"lint": "tsc --noEmit"
|
|
},
|
|
"dependencies": {
|
|
"clsx": "^2.1.1",
|
|
"dompurify": "^3.4.12",
|
|
"framer-motion": "^11.18.2",
|
|
"lucide-react": "^0.474.0",
|
|
"next": "15.5.21",
|
|
"react": "^18.3.1",
|
|
"react-dom": "^18.3.1",
|
|
"tailwind-merge": "^3.0.1"
|
|
},
|
|
"devDependencies": {
|
|
"@types/dompurify": "^3.0.5",
|
|
"@types/node": "^20.14.0",
|
|
"@types/react": "^18.3.3",
|
|
"autoprefixer": "^10.4.20",
|
|
"jsdom": "^29.1.1",
|
|
"postcss": "^8.5.25",
|
|
"tailwindcss": "^3.4.17",
|
|
"typescript": "^5.5.4",
|
|
"vitest": "^3.2.7"
|
|
},
|
|
"overrides": {
|
|
"sharp": "^0.35.0",
|
|
"next": {
|
|
"postcss": "^8.5.25"
|
|
}
|
|
}
|
|
}
|