Close out the read-only surface before cutover with three families of
small fixes that the previous phases left unfinished:
- Error boundaries: add src/app/error.tsx (route-segment), global-error.tsx
(root crash fallback with its own minimal html/body — no Providers
dependency since those may be the thing that crashed), and not-found.tsx
for a Hebrew 404 instead of the default Next page.
- Accessibility: wire usePathname() into AppShell so the current nav item
gets aria-current="page" and a gold underline. Add aria-label + aria-hidden
on the icon-only buttons that Phase 5 left text-less (corpus trash,
parties-field Plus). Nav gets an aria-label of its own.
- Metadata template: title on each route now reads "X · עוזר משפטי" via
the layout.tsx title.template. Description localized to Jerusalem.
- README: full E2E smoke test checklist covering all 9 screens, plus a
backend contract table so future phases know which hook wraps which
endpoint. Documents the known Gitea→Coolify webhook issue.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New /cases/new route with a 3-step wizard (basics / parties / details)
backed by react-hook-form + the caseCreateSchema. Each step validates
only its own fields so the user fixes errors in context. On success
useCreateCase invalidates the case list and the router pushes to the
freshly created case detail page.
PartiesField is a small chip-style editor for the appellants/respondents
arrays. The Home page now has a navy "+ תיק חדש" button that links to
the wizard.
Dropped .default() from the create schema — zod's input/output type
mismatch broke the RHF zodResolver generics; dropping the defaults is
simpler than plumbing z.input vs z.output through the mutation hook.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>