RollingNumber
A numeric display that animates value changes with rolling digits.@coinbase/cds-web@8.56.1
import { RollingNumber } from '@coinbase/cds-web/numbers/RollingNumber'
Peer dependencies
- framer-motion: ^10.18.0
Basic Example
RollingNumber displays changing numeric values with a smooth per-digit roll animation and optional color pulse. It supports full Intl.NumberFormat options, custom typography, ReactNode prefixes/suffixes, and accessibility.
Pass a number in the value prop. Use the format prop for Intl formatting (currency, percent, grouping, compact) instead of pre-formatting the string yourself.
Loading...
Live Codefunction Example() { const values = [12345.67, 123340.011, 1220340.0123]; const [valIdx, setValIdx] = useState(0); return ( <VStack gap={3}> <RollingNumber value={values[valIdx]} font="display3" /> <Button onClick={() => { setValIdx((prev) => (prev + 1) % values.length); }} alignSelf="flex-start" > Next </Button> </VStack> ); }
Example Use Case
Loading...
Live Codefunction Examples() { const [price, setPrice] = useState<number>(12345.67); const [difference, setDifference] = useState<number>(0); const onNext = () => setPrice((p) => { const delta = (Math.random() - 0.5) * 200; // +/- 100 const next = Math.max(0, p + delta); const newPrice = Math.round(next * 100) / 100; setDifference(newPrice - p); return newPrice; }); const trendColor = difference >= 0 ? 'fgPositive' : 'fgNegative'; return ( <VStack gap={2}> <Text font="label1">Portfolio Balance</Text> <RollingNumber colorPulseOnUpdate font="display3" format={{ style: 'currency', currency: 'USD' }} value={price} /> <HStack alignItems="center"> <RollingNumber accessibilityLabelPrefix={difference > 0 ? 'up ' : difference < 0 ? 'down ' : ''} color={trendColor} font="body" format={{ style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2, }} prefix={ difference >= 0 ? ( <Icon color={trendColor} name="diagonalUpArrow" size="xs" /> ) : ( <Icon color={trendColor} name="diagonalDownArrow" size="xs" /> ) } styles={{ prefix: { paddingRight: 'var(--space-1)', }, }} suffix={`(${((Math.abs(difference) / price) * 100).toFixed(2)}%)`} value={Math.abs(difference)} /> </HStack> <Text font="label1">BTC Conversion</Text> <HStack alignItems="center" gap={1}> <Icon color="fgPrimary" name="arrowsVertical" size="xs" testID="swap-icon" /> <RollingNumber color="fgPrimary" fontFamily="body" fontSize="body" fontWeight="body" format={{ minimumFractionDigits: 8, maximumFractionDigits: 8 }} value={price / 150_000} /> </HStack> <Button alignSelf="flex-start" onClick={onNext}> Next </Button> </VStack> ); }