# Numpad A keypad for entering numbers. ## Import ```tsx import { Numpad } from '@coinbase/cds-mobile/numpad/Numpad' ``` ## Examples import useBaseUrl from '@docusaurus/useBaseUrl'; import ThemedImage from '@theme/ThemedImage'; ### Pin Numpad Primary use case for this is when a user is inputing a PIN code. Notice it does not have any of the hallmarks of a transactional numpad (CTA, utility button, suggested amounts). ```jsx const PinNumpadExample = () => { // localState const [visible, { toggleOn, toggleOff }] = useToggler(false); const [value, setValue] = useState(''); // hooks const safeBottomPadding = useSafeBottomPadding(); const palette = usePalette(); // callbacks const onPress = useCallback((input: NumpadValue) => { if (input === DELETE) { setValue((preValue) => preValue.slice(0, -1)); } else if (input !== SEPARATOR) { setValue((prevValue) => (prevValue.length < 4 ? prevValue + input : prevValue)); } }, []); const onLongPress = useCallback((input: NumpadValue) => { if (input === DELETE) { setValue(''); } else if (input !== SEPARATOR) { setValue((prevValue) => (prevValue.length < 4 ? prevValue + input : prevValue)); } }, []); return ( {Array.from({ length: 4 }).map((_, index) => ( ))} Unlock with your PIN ); }; ``` ### Transactional Numpad Best when used in the context of a transactional scenario. This could range from the standard Buy / Sell, all the way to Gift, Convert, Stake, etc. ```jsx const VALUE_MAX = 1000000; const TransactionalNumpadExample = () => { const [visible, { toggleOn, toggleOff }] = useToggler(false); const [value, setValue] = useState('100'); const safeBottomPadding = useSafeBottomPadding(); const onPress = useCallback((value: NumpadValue) => { switch (value) { case DELETE: setValue((prev) => prev.slice(0, -1)); break; case SEPARATOR: setValue((prev) => (prev.includes('.') ? prev : `${prev}.`)); break; default: setValue((prev) => { const newValue = prev + value; return parseFloat(newValue) > VALUE_MAX ? prev : newValue; }); } }, []); const onLongPress = useCallback((value: NumpadValue) => { switch (value) { case DELETE: setValue(''); break; case SEPARATOR: if (!value.includes('.')) { setValue((prevValue) => `${prevValue}.00`); } break; default: setValue((prev) => { const newValue = prev + value; return parseFloat(newValue) > VALUE_MAX ? prev : newValue; }); } }, []); const setValueCallback = useCallback((value: string) => () => setValue(value), []); const accessory = useMemo(() => { if (value === '') return ( Enter an amount greater than zero. ); if (parseFloat(value) >= VALUE_MAX) { return ( Max ${VALUE_MAX} ); } return ( ); }, [setValueCallback, value]); return ( } deleteAccessibilityLabel="delete" onLongPress={onLongPress} onPress={onPress} separatorAccessibilityLabel="period" /> ); }; ``` ## Props | Prop | Type | Required | Default | Description | | --- | --- | --- | --- | --- | | `onPress` | `(value: NumpadValue) => void` | Yes | `-` | - | | `accessory` | `null \| string \| number \| false \| true \| ReactElement> \| Iterable \| ReactPortal` | No | `-` | - | | `action` | `null \| string \| number \| false \| true \| ReactElement> \| Iterable \| ReactPortal` | No | `-` | - | | `alignContent` | `flex-start \| flex-end \| center \| stretch \| space-between \| space-around \| space-evenly` | No | `-` | - | | `alignItems` | `flex-start \| flex-end \| center \| stretch \| baseline` | No | `-` | - | | `alignSelf` | `auto \| FlexAlignType` | No | `-` | - | | `animated` | `boolean` | No | `-` | - | | `aspectRatio` | `string \| number` | No | `-` | - | | `background` | `currentColor \| fg \| fgMuted \| fgInverse \| fgPrimary \| fgWarning \| fgPositive \| fgNegative \| bg \| bgAlternate \| bgInverse \| bgOverlay \| bgElevation1 \| bgElevation2 \| bgPrimary \| bgPrimaryWash \| bgSecondary \| bgTertiary \| bgSecondaryWash \| bgNegative \| bgNegativeWash \| bgPositive \| bgPositiveWash \| bgWarning \| bgWarningWash \| bgLine \| bgLineHeavy \| bgLineInverse \| bgLinePrimary \| bgLinePrimarySubtle \| accentSubtleRed \| accentBoldRed \| accentSubtleGreen \| accentBoldGreen \| accentSubtleBlue \| accentBoldBlue \| accentSubtlePurple \| accentBoldPurple \| accentSubtleYellow \| accentBoldYellow \| accentSubtleGray \| accentBoldGray \| transparent` | No | `-` | - | | `borderBottomLeftRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - | | `borderBottomRightRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - | | `borderBottomWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - | | `borderColor` | `currentColor \| fg \| fgMuted \| fgInverse \| fgPrimary \| fgWarning \| fgPositive \| fgNegative \| bg \| bgAlternate \| bgInverse \| bgOverlay \| bgElevation1 \| bgElevation2 \| bgPrimary \| bgPrimaryWash \| bgSecondary \| bgTertiary \| bgSecondaryWash \| bgNegative \| bgNegativeWash \| bgPositive \| bgPositiveWash \| bgWarning \| bgWarningWash \| bgLine \| bgLineHeavy \| bgLineInverse \| bgLinePrimary \| bgLinePrimarySubtle \| accentSubtleRed \| accentBoldRed \| accentSubtleGreen \| accentBoldGreen \| accentSubtleBlue \| accentBoldBlue \| accentSubtlePurple \| accentBoldPurple \| accentSubtleYellow \| accentBoldYellow \| accentSubtleGray \| accentBoldGray \| transparent` | No | `-` | - | | `borderEndWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - | | `borderRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - | | `borderStartWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - | | `borderTopLeftRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - | | `borderTopRightRadius` | `0 \| 100 \| 200 \| 300 \| 400 \| 500 \| 600 \| 700 \| 800 \| 900 \| 1000` | No | `-` | - | | `borderTopWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - | | `borderWidth` | `0 \| 100 \| 200 \| 300 \| 400 \| 500` | No | `-` | - | | `bordered` | `boolean` | No | `-` | Add a border around all sides of the box. | | `borderedBottom` | `boolean` | No | `-` | Add a border to the bottom side of the box. | | `borderedEnd` | `boolean` | No | `-` | Add a border to the trailing side of the box. | | `borderedHorizontal` | `boolean` | No | `-` | Add a border to the leading and trailing sides of the box. | | `borderedStart` | `boolean` | No | `-` | Add a border to the leading side of the box. | | `borderedTop` | `boolean` | No | `-` | Add a border to the top side of the box. | | `borderedVertical` | `boolean` | No | `-` | Add a border to the top and bottom sides of the box. | | `bottom` | `string \| number` | No | `-` | - | | `color` | `currentColor \| fg \| fgMuted \| fgInverse \| fgPrimary \| fgWarning \| fgPositive \| fgNegative \| bg \| bgAlternate \| bgInverse \| bgOverlay \| bgElevation1 \| bgElevation2 \| bgPrimary \| bgPrimaryWash \| bgSecondary \| bgTertiary \| bgSecondaryWash \| bgNegative \| bgNegativeWash \| bgPositive \| bgPositiveWash \| bgWarning \| bgWarningWash \| bgLine \| bgLineHeavy \| bgLineInverse \| bgLinePrimary \| bgLinePrimarySubtle \| accentSubtleRed \| accentBoldRed \| accentSubtleGreen \| accentBoldGreen \| accentSubtleBlue \| accentBoldBlue \| accentSubtlePurple \| accentBoldPurple \| accentSubtleYellow \| accentBoldYellow \| accentSubtleGray \| accentBoldGray \| transparent` | No | `-` | - | | `columnGap` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - | | `dangerouslySetBackground` | `string` | No | `-` | - | | `deleteAccessibilityLabel` | `string` | No | `-` | - | | `disabled` | `boolean` | No | `-` | - | | `display` | `flex \| none` | No | `-` | - | | `elevation` | `0 \| 1 \| 2` | No | `-` | Determines box shadow styles. Parent should have overflow set to visible to ensure styles are not clipped. | | `feedback` | `none \| light \| normal \| heavy` | No | `none` | Haptic feedback to trigger when being pressed. | | `flexBasis` | `string \| number` | No | `-` | - | | `flexDirection` | `row \| column \| row-reverse \| column-reverse` | No | `-` | - | | `flexGrow` | `number` | No | `-` | - | | `flexShrink` | `number` | No | `-` | - | | `flexWrap` | `wrap \| nowrap \| wrap-reverse` | No | `-` | - | | `font` | `inherit \| FontFamily` | No | `-` | - | | `fontFamily` | `inherit \| FontFamily` | No | `-` | - | | `fontSize` | `inherit \| FontSize` | No | `-` | - | | `fontWeight` | `inherit \| FontWeight` | No | `-` | - | | `gap` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - | | `height` | `string \| number` | No | `-` | - | | `justifyContent` | `flex-start \| flex-end \| center \| space-between \| space-around \| space-evenly` | No | `-` | - | | `key` | `Key \| null` | No | `-` | - | | `left` | `string \| number` | No | `-` | - | | `lineHeight` | `inherit \| LineHeight` | No | `-` | - | | `margin` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - | | `marginBottom` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - | | `marginEnd` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - | | `marginStart` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - | | `marginTop` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - | | `marginX` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - | | `marginY` | `0 \| -1 \| -2 \| -3 \| -4 \| -5 \| -6 \| -7 \| -8 \| -9 \| -10 \| -0.25 \| -0.5 \| -0.75 \| -1.5` | No | `-` | - | | `maxHeight` | `string \| number` | No | `-` | - | | `maxWidth` | `string \| number` | No | `-` | - | | `minHeight` | `string \| number` | No | `-` | - | | `minWidth` | `string \| number` | No | `-` | - | | `onLongPress` | `((value: NumpadValue) => void)` | No | `-` | - | | `onPointerCancel` | `((event: PointerEvent) => void)` | No | `-` | - | | `onPointerCancelCapture` | `((event: PointerEvent) => void)` | No | `-` | - | | `onPointerDown` | `((event: PointerEvent) => void)` | No | `-` | - | | `onPointerDownCapture` | `((event: PointerEvent) => void)` | No | `-` | - | | `onPointerEnter` | `((event: PointerEvent) => void)` | No | `-` | - | | `onPointerEnterCapture` | `((event: PointerEvent) => void)` | No | `-` | - | | `onPointerLeave` | `((event: PointerEvent) => void)` | No | `-` | - | | `onPointerLeaveCapture` | `((event: PointerEvent) => void)` | No | `-` | - | | `onPointerMove` | `((event: PointerEvent) => void)` | No | `-` | - | | `onPointerMoveCapture` | `((event: PointerEvent) => void)` | No | `-` | - | | `onPointerUp` | `((event: PointerEvent) => void)` | No | `-` | - | | `onPointerUpCapture` | `((event: PointerEvent) => void)` | No | `-` | - | | `opacity` | `number \| AnimatedNode` | No | `-` | - | | `overflow` | `visible \| hidden \| scroll` | No | `-` | - | | `padding` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - | | `paddingBottom` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - | | `paddingEnd` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - | | `paddingStart` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - | | `paddingTop` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - | | `paddingX` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - | | `paddingY` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - | | `pin` | `top \| bottom \| left \| right \| all` | No | `-` | Direction in which to absolutely pin the box. | | `position` | `absolute \| relative \| static \| fixed \| sticky` | No | `-` | - | | `ref` | `((instance: View \| null) => void) \| RefObject \| null` | No | `-` | - | | `right` | `string \| number` | No | `-` | - | | `rowGap` | `0 \| 1 \| 2 \| 3 \| 4 \| 5 \| 6 \| 7 \| 8 \| 9 \| 10 \| 0.25 \| 0.5 \| 0.75 \| 1.5` | No | `-` | - | | `separator` | `string` | No | `-` | - | | `separatorAccessibilityLabel` | `string` | No | `-` | - | | `style` | `false \| RegisteredStyle \| Value \| AnimatedInterpolation \| WithAnimatedObject \| WithAnimatedArray \| RecursiveArray> \| readonly (Falsy \| ViewStyle \| RegisteredStyle)[]> \| null` | No | `-` | - | | `testID` | `string` | No | `-` | Used to locate this element in unit and end-to-end tests. Under the hood, testID translates to data-testid on Web. On Mobile, testID stays the same - testID Used to locate this element in unit and end-to-end tests. Used to locate this view in end-to-end tests. | | `textAlign` | `left \| right \| auto \| center \| justify` | No | `-` | - | | `textDecorationLine` | `none \| underline \| line-through \| underline line-through` | No | `-` | - | | `textDecorationStyle` | `solid \| dotted \| dashed \| double` | No | `-` | - | | `textTransform` | `none \| capitalize \| uppercase \| lowercase` | No | `-` | - | | `top` | `string \| number` | No | `-` | - | | `transform` | `string \| (({ scaleX: AnimatableNumericValue; } & { scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ scaleY: AnimatableNumericValue; } & { scaleX?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ translateX: AnimatableNumericValue \| ${number}%; } & { scaleX?: undefined; scaleY?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ translateY: AnimatableNumericValue \| ${number}%; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ perspective: AnimatableNumericValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ rotate: AnimatableStringValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ rotateX: AnimatableStringValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ rotateY: AnimatableStringValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ rotateZ: AnimatableStringValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ scale: AnimatableNumericValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; skewX?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ skewX: AnimatableStringValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewY?: undefined; matrix?: undefined; }) \| ({ skewY: AnimatableStringValue; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; matrix?: undefined; }) \| ({ matrix: AnimatableNumericValue[]; } & { scaleX?: undefined; scaleY?: undefined; translateX?: undefined; translateY?: undefined; perspective?: undefined; rotate?: undefined; rotateX?: undefined; rotateY?: undefined; rotateZ?: undefined; scale?: undefined; skewX?: undefined; skewY?: undefined; }))[]` | No | `-` | - | | `userSelect` | `none \| auto \| contain \| text \| all` | No | `-` | - | | `width` | `string \| number` | No | `-` | - | | `zIndex` | `number` | No | `-` | - |