Each month in the 4x3 year grid now shows a compact calendar with
day numbers, matching the iOS Calendar year view style. Today is
highlighted with a filled circle. Selected month title uses primary color.
- CalendarViewModel: year view state and animation methods
- CalendarMonthView: graphicsLayer zoom overlay, BottomCard hiding
- MonthHeader: toggle year view on click, "今天" button
- CalendarViewModel: add isYearView, yearViewProgress, yearViewYear state
with toggleYearView(), selectMonthFromYearView(), year navigation methods
- YearGridView: new 4x3 month grid with year navigation header
- MonthHeader: onClick now toggles year view, added "今天" button
- CalendarMonthView: overlay year view with graphicsLayer anchor-based
scale transition, hide BottomCard during year view
Sync CalendarPager's pagerState to selectedDate in CalendarMonthView
via LaunchedEffect(selectedDate), so the page is already correct when
CalendarPager re-enters composition during expand. Remove the now-
redundant LaunchedEffect(Unit) sync in CalendarPager.
alignByBaseline caused layout jumps during AnimatedContent transitions.
Switch to Bottom alignment with 2dp bottom padding on week number for
stable visual alignment with month text baseline.
- MonthHeader: align week number text baseline with month text (Bottom)
- WeekPager: scroll to selectedDate's week when it changes externally,
fixing the case where clicking "back to today" in collapsed state
didn't navigate the week pager to the current week
Replace plain lunar text with priority-based annotations:
legal holidays > lunar festivals > solar terms > solar festivals > lunar day.
Holiday/festival text uses error color to stand out from regular lunar text.
Phase 1: all rows slide up together until selected row reaches y=0.
Phase 2: rows below selected row slide up as a group.
No per-row height scaling, only y-offset translation + fade.
Rows now keep full height and slide upward sequentially instead of
compressing. The anchor row (selected) moves to y=0 and stays fixed;
other rows exit top-to-bottom with staggered timing.
Apply consistent formatting: import ordering, line wrapping,
indentation, and XML normalization. No functional changes.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
When month or week number changes, the text slides vertically with fade:
upward for increasing values, downward for decreasing values, using
slideInVertically/slideOutVertically with tween(250).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Replace hard-switched background/border modifiers with updateTransition-based
animated properties: revealProgress for circular indicator radius, contentColor
and selectedColor via animateColor, borderAlpha for today stroke. Use drawBehind
for custom circle drawing with tween(250, FastOutSlowInEasing) spec.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Use pagerState.currentPageOffsetFraction to compute alpha for page content:
alpha drops from 1 to 0 as offset goes from 0% to 30%, preventing
mid-point brightness dip (combined alpha of adjacent pages always >= 1f).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Non-selected rows now fade out with alpha = 1f - collapseProgress via
graphicsLayer, naturally following the spring animation curve. When
rowScale < 0.1f and collapseProgress > 0.9f, DayCell rendering is
skipped and replaced with an empty Spacer to reduce draw overhead at
the end of the collapse animation.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Collapse triggers when progress > 0.25 (was 0.5). Expand triggers when
progress < 0.75 (1 - threshold), creating asymmetric thresholds that make
both fold and unfold easy to trigger with a short drag.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Quick swipe now snaps to the target state regardless of progress position,
matching the behavior of HorizontalPager's fling logic. Uses VelocityTracker
to measure release velocity and a 800 dp/s threshold (FLING_VELOCITY_THRESHOLD_DP).
Slow drags still use the positional COLLAPSE_THRESHOLD (50%) as before.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The fixed DRAG_RANGE_DP=200dp caused the collapse progress to advance faster
than the visual height change, making the calendar feel like it "outruns" the
finger. Now dragRangePx is computed as (weeks-1)×rowHeight, matching the
actual visual height delta during collapse so finger movement maps 1:1 to
visual change.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>