Replaces the Angular 18 app with Next.js 16 / React 19 / Tailwind 4 / shadcn, the same stack and design system as nachklang-feedback, planned in docs/rewrite-plan.md. - Admin: all calendars in one mobile-friendly list (month groups, calendar chips, Kommend/Vergangen/Alle, search, sort, filters in the URL), an edit sheet for create/edit/duplicate/delete, publish confirmation, and an "Abonnieren" dialog with subscription links for every calendar. - Public landing page: subscribe links from env instead of hardcoded, plus the next public events, server-rendered and revalidated every 5 minutes. - All times handled explicitly as Europe/Berlin; whole-day events stored as 00:00-23:59. Fixes carried over from the Angular app: the move dialog leaking a cancelled calendar change, saves that looked saved when they failed, in-place Date mutation, and duplicated calendar-id mappings. - Same shared-session auth as before (proxy.ts gate, /admin/me, 401 vs 403). - 112 Vitest tests over lib/; docs in docs/ (architecture, features, gotchas, API wish list, deployment). Needs the API branch feature/calendar-ical-escaping-subscriptions deployed first (GET /calendar/events/subscriptions). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
32 lines
1.1 KiB
Markdown
32 lines
1.1 KiB
Markdown
# Nachklang Calendar
|
|
|
|
Event calendar for Nachklang e.V.: a public landing page for subscribing to the calendar, and an
|
|
admin area (`/admin`) for editing events in all calendars.
|
|
|
|
Next.js (App Router) + TypeScript + Tailwind + shadcn, the same stack as `nachklang-feedback`.
|
|
Rewritten from Angular in September 2026 ([docs/rewrite-plan.md](docs/rewrite-plan.md)).
|
|
|
|
Documentation: [architecture](docs/architecture.md) · [features](docs/features.md) ·
|
|
[gotchas](docs/gotchas.md) · [deployment](docs/deployment.md) · [API wish list](docs/api-wishlist.md)
|
|
|
|
## Development
|
|
|
|
```bash
|
|
cp .env.local.example .env.local # then adjust if needed
|
|
npm install
|
|
npm run dev # http://localhost:4200
|
|
```
|
|
|
|
Port 4200 is not arbitrary: it is the port the API's better-auth origins and the admin app's
|
|
redirect allow-list trust. Another port breaks sign-out and the return redirect after sign-in.
|
|
|
|
The admin area needs the API (`:3000`) and the admin app (`:3002`) running locally.
|
|
|
|
## Other scripts
|
|
|
|
```bash
|
|
npm run build # production build (output: standalone; see docs/deployment.md)
|
|
npm run lint
|
|
npm test # Vitest, pure logic in lib/
|
|
```
|