Summary
Switching between the Calendar views (Month / Week / Day / Table) has a jarring, abrupt transition. The current view unmounts and the next one mounts instantly with no animation, and because the four layouts have very different heights (Month = 6-row grid, Week = single row of 7 columns, Day = single column, Table = list), the page content and height snap between states.
Steps to reproduce
- Go to
/calendar.
- Use the view switch in the top-right (
Month | Week | Day | Table).
- Toggle between the options and watch the calendar body swap.
Expected
A smooth transition when switching views — e.g. a short crossfade/slide, and ideally a settled height change rather than an instant snap.
Actual
Instant hard swap of the whole calendar body; content and page height jump.
Technical detail
Views are rendered as plain conditional swaps with no transition wrapper:
frontend/src/components/screens/Calendar.tsx:252-255
{!loading && view === "month" && <MonthView ... />}
{!loading && view === "week" && <WeekView ... />}
{!loading && view === "day" && <DayView ... />}
{!loading && view === "table" && ( ... )}
There is no AnimatePresence / motion wrapper around the view body.
Suggested fix
There's already an in-repo precedent: Study.tsx wraps its mode-content switch in AnimatePresence mode="wait" with a keyed motion.div (initial={{opacity:0,y:8}} → animate={{opacity:1,y:0}}). The same pattern could wrap the Calendar view body, keyed on view, for a consistent fade/slide. (Respect prefers-reduced-motion.)
Notes
Summary
Switching between the Calendar views (Month / Week / Day / Table) has a jarring, abrupt transition. The current view unmounts and the next one mounts instantly with no animation, and because the four layouts have very different heights (Month = 6-row grid, Week = single row of 7 columns, Day = single column, Table = list), the page content and height snap between states.
Steps to reproduce
/calendar.Month | Week | Day | Table).Expected
A smooth transition when switching views — e.g. a short crossfade/slide, and ideally a settled height change rather than an instant snap.
Actual
Instant hard swap of the whole calendar body; content and page height jump.
Technical detail
Views are rendered as plain conditional swaps with no transition wrapper:
frontend/src/components/screens/Calendar.tsx:252-255There is no
AnimatePresence/motionwrapper around the view body.Suggested fix
There's already an in-repo precedent:
Study.tsxwraps its mode-content switch inAnimatePresence mode="wait"with a keyedmotion.div(initial={{opacity:0,y:8}} → animate={{opacity:1,y:0}}). The same pattern could wrap the Calendar view body, keyed onview, for a consistent fade/slide. (Respectprefers-reduced-motion.)Notes
<Toggle>; the view-body rendering at the lines above was untouched).refactor/component-system.