Replaces the legacy <ul.entity-events> Verlauf rendering with the new
SmartTimeline. Slice 1 wiring:
- loadTimeline(id) calls /api/projects/{id}/timeline (the new
endpoint backed by ProjectionService) and renderSmartTimeline
paints into <div#project-smart-timeline>.
- "Audit-Log anzeigen" header toggle re-fetches with
?include=audit_full, broadening the project_events filter to
every audit row (legacy Verlauf chronological view). State
persists per-project in localStorage so flipping it on for one
case doesn't carry across to others.
- "+ Eintrag" CTA opens a modal. "Eigener Meilenstein" submits
via POST /api/projects/{id}/timeline/milestone and re-renders;
Frist + Termin route to the existing /deadlines/new and
/appointments/new flows; CCR + R.30 are disabled-with-tooltip
"kommt mit Slice 3" per the design.
- Subtree toggle now also drives the timeline (passes
?direct_only=true when the user flips off "Inkl. Unterprojekte").
- Project-appointment add path also re-fetches the timeline so the
new appointment surfaces immediately.
The legacy renderEvents() rendering path stays as-is (dead, but the
function is still called in places). It will be removed once
/timeline?include=audit_full has had a deploy of soak time and the
audit-toggle is the only path that feeds the legacy markup. Slice 2
revisits.
The FilterBar from t-paliad-170 (riemann's port) keeps mounting and
driving its customRunner — facets still narrow the legacy `events`
array. The bar gaining timeline_* axes lands later in the slice
sequence (design §8); Slice 1 ships the timeline beneath the existing
bar untouched.
Design ref: docs/design-smart-timeline-2026-05-08.md §10 Slice 1.