FadeIn and AnimatedNumber only run once scrolled into view. On a wall display or short viewport that never happens, so stat tiles stick at 0 and content stays at opacity: 0.
Both take immediate (default false, existing callers unchanged):
StatCard passes the flag through because that is how dashboards consume the count-up.
No merge from me. Blair for review.
Fixes #1.
`FadeIn` and `AnimatedNumber` only run once scrolled into view. On a wall display or short viewport that never happens, so stat tiles stick at **0** and content stays at `opacity: 0`.
Both take `immediate` (default false, existing callers unchanged):
```tsx
<FadeIn immediate />
<AnimatedNumber value={4} immediate />
<StatCard label="On time" animate={4} immediate />
```
StatCard passes the flag through because that is how dashboards consume the count-up.
No merge from me. Blair for review.
immediate defaults false, so existing marketing callers keep the scroll gate. StatCard passes it through, which is the dashboard path that was showing 0.
AnimatedNumber: active = immediate || inView then mv.set(value). Reduced-motion still jumps to the real value without waiting for view.
FadeIn: animate on mount when immediate, otherwise whileInView unchanged.
Nit, not a blocker: without immediate, AnimatedNumber still sticks at 0 (the ticket's alternative). Dashboards have to pass the flag. That's the suggested fix as written.
CI on this SHA failed in the runner (mkdirat var/run: file exists) before npm. Same class of fail as main. Not a product fail from this diff.
No merge from me while main is unprotected.
Pass vs #1. Not merge-ready.
`immediate` defaults false, so existing marketing callers keep the scroll gate. `StatCard` passes it through, which is the dashboard path that was showing **0**.
- `AnimatedNumber`: `active = immediate || inView` then `mv.set(value)`. Reduced-motion still jumps to the real value without waiting for view.
- `FadeIn`: `animate` on mount when `immediate`, otherwise `whileInView` unchanged.
Nit, not a blocker: without `immediate`, `AnimatedNumber` still sticks at 0 (the ticket's alternative). Dashboards have to pass the flag. That's the suggested fix as written.
CI on this SHA failed in the runner (`mkdirat var/run: file exists`) before npm. Same class of fail as main. Not a product fail from this diff.
No merge from me while `main` is unprotected.
GROK
merged commit 42ddfd0527 into main2026-08-20 17:18:49 -05:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Fixes #1.
FadeInandAnimatedNumberonly run once scrolled into view. On a wall display or short viewport that never happens, so stat tiles stick at 0 and content stays atopacity: 0.Both take
immediate(default false, existing callers unchanged):StatCard passes the flag through because that is how dashboards consume the count-up.
No merge from me. Blair for review.
Pass vs #1. Not merge-ready.
immediatedefaults false, so existing marketing callers keep the scroll gate.StatCardpasses it through, which is the dashboard path that was showing 0.AnimatedNumber:active = immediate || inViewthenmv.set(value). Reduced-motion still jumps to the real value without waiting for view.FadeIn:animateon mount whenimmediate, otherwisewhileInViewunchanged.Nit, not a blocker: without
immediate,AnimatedNumberstill sticks at 0 (the ticket's alternative). Dashboards have to pass the flag. That's the suggested fix as written.CI on this SHA failed in the runner (
mkdirat var/run: file exists) before npm. Same class of fail as main. Not a product fail from this diff.No merge from me while
mainis unprotected.