Fix events displaying with +1h offset (e.g. 14h→15h) caused by
icsDateToJsDate() returning fake UTC (local.date) which then got
the browser offset applied again by dateToLocalISOString().
Changes:
- Return true UTC (icsDate.date) from icsDateToJsDate() instead of
fake UTC (local.date)
- Add getDateComponentsInTimezone() using Intl.DateTimeFormat with
formatter caching for correct cross-timezone write path
- Refactor jsDateToIcsDate() to use Intl instead of isFakeUtc flag
- Replace optimistic updates with refetchEvents() after modal save
to avoid fake UTC leaking into the display path
- Align standalone helper jsDateToIcsDate() with adapter conversion
- Narrow useCallback dependencies in useSchedulerHandlers
- Remove dead code addDurationToDate()
- Add 42 timezone conversion tests covering DST transitions,
cross-timezone round-trips, half-hour/45min offsets
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>