The ChangelogScreen provides a narrative-driven history of the app’s development. It utilizes a vertical timeline layout with a dynamic “progress beam” that fills as the user scrolls. The screen distinguishes between the Latest Release (highlighted with a high-contrast card and pulse animation) and Historical Versions (minimalist list items).
The UI manages its own local for interactions that don’t require business logic processing.
Accordion Logic: The screen uses to track which feature is currently expanded (expandedFeature). Tapping a feature title toggles its description via AnimatedVisibility.
Scroll-Driven Drawing: The “Beam” line uses the scrollState.value to calculate its height dynamically. As the user scrolls, the primary-colored line “follows” the viewport, creating a sense of progression.
Event Bubbling:
Navigation: Clicks on “Read My Story” bubble up to the NavController.
Expansion: Taps on features trigger a state change in the Timeline parent, which then flows back down to the ExpandableFeatureItem.
Typography: Uses DisplayFontFamily (Black weight) for version numbers to create a strong visual hierarchy and BodyFontFamily for descriptions.
Shapes: The ScreenScaffold utilizes MaterialShapes (Expressive API) to generate randomized, playful shapes for the back button (e.g., Sunny, Clover, Cookie).
Colors: Uses surfaceContainer for the app bar when scrolled and primaryContainer for the featured “Latest” release card.
A reusable wrapper that provides a consistent experience. It supports three modes: Small, Large, and Hidden. It also manages the nestedScroll connection required for the app bar to collapse smoothly as the user scrolls the content.
A stateless that renders a single feature bullet. It uses animateFloatAsState to rotate the chevron icon 180 degrees when expanded, providing clear visual feedback.