The calendar displays task instances as colored event blocks on a time grid. Events are generated from local SQLite data via the useCalendarEvents hook, which maps task_instances rows into CalendarKit-compatible event objects.
Tapping an event sets selectedEventId in the CalendarStore, which triggers the EventDetailModal mounted at the (main)/_layout.tsx level. The modal displays full instance details including location map, penalty info, and verification status.
Events can be dragged vertically to change their time and horizontally to change their day. The drag operation updates the task instance in real-time via useTaskActions, triggering a Triple-Write to persist the change across Convex, SQLite, and the hardware AlarmManager.
The tab navigator has freezeOnBlur set to false specifically because of CalendarKit. When React Native freezes a component tree, it severs Reanimated gesture listener bindings. Upon thawing, native gestures fail to lock parent ScrollViews, causing events to float while the background scrolls. Disabling freeze prevents this class of interaction bugs.