feat(timeline): show curator event note on Zeitstrahl (#844) #883

Merged
marcel merged 6 commits from feat/issue-844-event-note into main 2026-06-16 16:27:54 +02:00

6 Commits

Author SHA1 Message Date
Marcel
3ba5ae982b fix(timeline): restore justify-center on EventPill outer wrapper
All checks were successful
CI / Unit & Component Tests (pull_request) Successful in 4m9s
CI / OCR Service Tests (pull_request) Successful in 23s
CI / Backend Unit Tests (pull_request) Successful in 5m59s
CI / fail2ban Regex (pull_request) Successful in 47s
CI / Semgrep Security Scan (pull_request) Successful in 23s
CI / Compose Bucket Idempotency (pull_request) Successful in 1m11s
SDD Gate / RTM Check (pull_request) Successful in 17s
SDD Gate / Contract Validate (pull_request) Successful in 22s
SDD Gate / Constitution Impact (pull_request) Successful in 19s
CI / Unit & Component Tests (push) Successful in 5m33s
CI / OCR Service Tests (push) Successful in 28s
CI / Backend Unit Tests (push) Successful in 6m27s
CI / fail2ban Regex (push) Successful in 48s
CI / Semgrep Security Scan (push) Successful in 26s
CI / Compose Bucket Idempotency (push) Successful in 1m6s
YearBand.svelte.spec.ts queries '.justify-center .rounded-full' to assert
the pill is present. Replacing justify-center with items-center broke that
selector; adding both preserves the test contract while keeping flex-col
for the note below the pill.

Refs #844
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 15:41:42 +02:00
Marcel
82979be705 test(timeline): add Playwright e2e + RTM rows for event note (#844)
Some checks failed
CI / Unit & Component Tests (pull_request) Failing after 3m58s
CI / OCR Service Tests (pull_request) Successful in 25s
CI / Backend Unit Tests (pull_request) Successful in 6m21s
CI / fail2ban Regex (pull_request) Failing after 46s
CI / Semgrep Security Scan (pull_request) Successful in 24s
CI / Compose Bucket Idempotency (pull_request) Successful in 1m10s
SDD Gate / RTM Check (pull_request) Successful in 15s
SDD Gate / Contract Validate (pull_request) Successful in 23s
SDD Gate / Constitution Impact (pull_request) Successful in 20s
zeitstrahl-note.spec.ts seeds PERSONAL and HISTORICAL events with
descriptions via API and asserts the note appears in DOM (REQ-001, REQ-004).
RTM rows REQ-001–REQ-008 for #844 all marked Done.

Closes #844
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 15:08:25 +02:00
Marcel
a63b8115a1 feat(timeline): wire EventNote into EventPill + WorldBand (REQ-004)
EventPill (PERSONAL curated events) and WorldBand (HISTORICAL events) now
render the curator note immediately below the title line. Derived events
and letters carry null description so EventNote renders nothing.

Refs #844
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 15:06:04 +02:00
Marcel
ace9602f6e feat(timeline): add EventNote component with expand/collapse (REQ-002–008)
Handles XSS escaping, whitespace-pre-line, 3-line clamp via inline style,
and a toggle button that is only shown when content actually overflows.

Refs #844
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 15:04:24 +02:00
Marcel
9716319aad feat(timeline): add note toggle i18n keys + regenerate api.ts (REQ-001/007)
Adds timeline_note_show_more / _show_less Paraglide keys (de/en/es) for
the expand/collapse affordance on long event notes. Regenerates api.ts
to include description?: string on TimelineEntryDTO.

Refs #844
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 14:55:04 +02:00
Marcel
afee9df8c0 feat(timeline): add description field to TimelineEntryDTO (REQ-001)
Surfaces the existing TimelineEvent.description through the list DTO so
curated event notes reach the read view. Null for letters and derived
entries; populated from ev.getDescription() in mapEvent() only.

Refs #844
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 14:50:40 +02:00