# Draggable Stamps: React Native draggable stamp board with fling momentum
> Draggable Stamps is a React Native and Expo component that scatters six
> stamp cards across a grid board you can drag and fling with real decay
> momentum, then tap one to spring it to the center at 1.5x scale behind an
> animated blur backdrop. It is built with react-native-reanimated,
> react-native-gesture-handler and expo-blur, and it is sold by Motionary
> (https://motionary.dev) as editable TypeScript source.
Product page: https://motionary.dev/animations/draggable-stamps
Price: $6 USD (price as of 2026-09-01, live price on the product page)
License: single developer, unlimited personal and commercial apps
Delivery: instant download of the full TypeScript source after checkout
Stack: reanimated, expo, expo blur, react native gesture handler, react native
Rarity: rare
Sold by: Motionary (https://motionary.dev)
## What it is
Draggable Stamps is a React Native sticker board. Six stamp cards sit
scattered at random offsets and random rotations over a printed grid
background, and each one can be picked up with a finger and thrown: the card
follows the drag, grows slightly while held, and after you let go it keeps
coasting with the velocity you gave it until it settles, never crossing the
screen edges. Tapping a stamp promotes it: it springs to the center of the
screen, untilts to 0 degrees, scales up to 1.5x, and the rest of the board
sinks behind a frosted blur, so the tapped card reads as the focused item.
Tapping the blur puts everything back exactly where it was, and a Shuffle
button at the bottom re-rolls every stamp's position and rotation at once.
Draggable Stamps ships from Motionary as React Native and Expo TypeScript
source you can edit.
## What it does
- Six independently draggable stamp cards (STAMP_COUNT = 6), each 150 x 210
points, rendered from six PNG assets in `assets/stamp/`.
- Pan dragging via `Gesture.Pan()` from react-native-gesture-handler, with
the card scaling to 1.15 over 100 ms while it is held.
- Real fling momentum on release: `withDecay` takes the gesture's
`velocityX` / `velocityY` so a thrown stamp coasts and decelerates.
- Hard screen-edge clamping on both the live drag and the decay, computed
from `useWindowDimensions()` and the card size, so a stamp can never leave
the board.
- Tap to focus: the stamp springs to the center at 1.5x scale and 0 degrees
rotation with a `withSpring` config of damping 50, stiffness 190.
- An animated expo-blur `BlurView` backdrop whose `intensity` is interpolated
from 0 to 30 as selection progresses, with `tint="light"`.
- Tap the blur to deselect: every stamp animates back to the exact position,
rotation and scale it held before the selection.
- Live z-order: dragging or selecting a card pushes its index to the end of a
shared `order` array, so the active stamp always stacks on top; the
selected stamp jumps to `zIndex: 100`.
- A Shuffle button (Feather `shuffle` icon from `@expo/vector-icons`) that
re-randomizes every stamp's x, y and rotation; all six then ease to their
new spots over 500 ms with an `Easing.bezier(0.4, 0, 0.2, 1)` curve.
- Animated drop shadow that deepens from 0.1 to 0.2 opacity when a stamp is
the selected one.
- Pure JavaScript and Expo modules, no custom native code, iOS and Android.
## How it works
The whole interaction in Draggable Stamps lives in one React Native file,
`components/Container.tsx`, and it runs on the Reanimated UI thread. Each
`Stamp` owns four shared values created with `useSharedValue`
(`translateX`, `translateY`, `scale`, `rotation`) plus three "before select"
shared values that remember where the card was sitting when it was promoted.
A `Gesture.Pan()` from react-native-gesture-handler accumulates `e.changeX`
and `e.changeY` into the translate values inside `onChange`, then clamps them
with `Math.min(Math.max(...))` against bounds derived from
`useWindowDimensions()` and the 150 x 210 card size, which is what stops a
stamp escaping the screen. In `onEnd`, the raw gesture velocity is handed to
`withDecay({ velocity: e.velocityX, clamp: [minX, maxX] })`, so
react-native-reanimated does the momentum physics and respects the same
bounds; the decay callback writes the resting position back into the
`beforeSelectPosition` shared values so a later deselect restores the real
spot, not a stale one. Transforms are applied through a single
`useAnimatedStyle` that also computes `zIndex` from
`order.value.indexOf(index)`, giving live restacking without React state.
Coordination between cards is all shared values on the parent
`StampContainer`: a `positions` array, an `order` array, `selectedIndex` and a
`selectProgress` progress value; `useDerivedValue` turns `selectProgress` into
an `isOneSelected` boolean. Every stamp subscribes with two
`useAnimatedReaction` hooks, one watching `positions.value[index]` to ease
into a new shuffled slot with `withTiming`, one watching `isOneSelected` to
animate home when the selection clears. The frosted backdrop is an
`Animated.createAnimatedComponent(BlurView)` from expo-blur whose `intensity`
prop is driven by `useAnimatedProps` and `interpolate(selectProgress.value,
[0, 1], [0, 30], Extrapolation.CLAMP)`, because `intensity` is a native prop
and not a style. Because `handleDrag`, `handleSelect`, `handleDeselect` and
`shuffle` are all marked `'worklet'`, the `order.modify` and
`positions.modify` array mutations happen on the UI thread as well, so
shuffling and restacking never touch the JavaScript thread mid-gesture.
## What you get
```
App.tsx
index.ts
app.json
package.json
tsconfig.json
README.md
components/
Container.tsx
assets/
grid.png
icon.png
adaptive-icon.png
splash-icon.png
stamp/
1.png
2.png
3.png
4.png
5.png
6.png
```
- TypeScript source (Container.tsx: `Stamp` + `StampContainer`)
- App entry wrapping the board in `GestureHandlerRootView`
- 6 stamp PNG assets + grid background
- Shuffle control with Feather icon
- README with install + usage
## Requirements
Versions pinned in the Draggable Stamps `package.json`:
- expo ^56.0.8 (Expo SDK 56)
- react-native 0.85.3
- react 19.2.3
- react-native-reanimated 4.3.1
- react-native-worklets 0.8.3
- react-native-gesture-handler ~2.31.1
- expo-blur ~56.0.3
- @expo/vector-icons ^15.1.1 (the Feather shuffle icon)
- expo-asset ~56.0.15, expo-font ~56.0.5, expo-splash-screen ~56.0.10,
expo-status-bar ~56.0.4, expo-symbols ~56.0.5
- TypeScript ~6.0.3 (devDependency)
Expo Go or development build: Draggable Stamps runs in Expo Go on Expo SDK 56.
It uses no custom native module, only react-native-reanimated,
react-native-worklets, react-native-gesture-handler and expo-blur, all of
which are bundled in Expo Go. Note that react-native-reanimated 4 requires the
New Architecture, which is the default in Expo SDK 56. The archive also pins
react-native-web ^0.21.0 and `@expo/metro-runtime` ~56.0.13 with an
`expo start --web` script, so the project boots on web too, though the blur
backdrop is a native effect and web is not the target.
## Install
```bash
npx expo install react-native-reanimated react-native-worklets react-native-gesture-handler expo-blur @expo/vector-icons
```
## Usage
```tsx
import { GestureHandlerRootView } from 'react-native-gesture-handler';
import { StyleSheet } from 'react-native';
import { StampContainer } from './components/Container';
export default function App() {
return (
);
}
const styles = StyleSheet.create({
root: {
flex: 1,
},
});
```
`StampContainer` takes no props: it owns the six stamps, the shared layout
state and the blur overlay. The lower-level `Stamp` component is exported from
the same file if you want to drive the board yourself.
## Customization
Tuning constants at the top of `components/Container.tsx` in Draggable Stamps:
- `STAMP_COUNT` (number, default `6`): how many stamps the board creates.
- `STAMP_SIZE` (`{ width, height }`, default `{ width: 150, height: 210 }`):
card size in points, also feeds the drag bounds math.
- `RANDOM_RANGE` (`{ x, y, rotation }`, default `{ x: 200, y: 700,
rotation: 120 }`): the scatter spread, so x lands in +/- 100, y in +/- 350
and rotation in +/- 60 degrees on both mount and shuffle.
- `SPRING_CONFIG` (default `{ damping: 50, stiffness: 190 }`): the spring used
when a stamp is tapped to center.
- `TIMING_CONFIG` (default `{ duration: 500, easing: Easing.bezier(0.4, 0,
0.2, 1) }`): the ease used for shuffle moves and for returning home after a
deselect.
Props on the exported `Stamp` component: `index` (number), `image` (image
source), `width` and `height` (number), `selectedIndex`
(`SharedValue`), `positions` (`SharedValue<{ x, y, rotation }[]>`),
`order` (`SharedValue`), `isOneSelected` (`DerivedValue`),
`onSelect(index)`, `handleDrag(index)` and `handleDeselect()`.
Other values worth editing: the blur `intensity` range (`interpolate(...,
[0, 1], [0, 30])`), the `tint="light"` on the `BlurView`, the focused scale
`1.5`, the held scale `1.15`, and the six `require()`d PNGs in
`assets/stamp/`.
## When to use it
- A collectibles, stickers or badges screen where the user should be able to
rummage through items rather than scroll a list.
- A photo or postcard wall where tapping a card promotes it to a focused,
blurred-backdrop preview.
- An onboarding or "pick your vibe" step built from loose, physical-feeling
cards instead of a form.
- A profile or achievements section that shows earned stamps, pins or NFTs
scattered on a board.
- A moodboard, canvas or scrapbook feature inside a creative app.
- A playful empty state or easter egg screen where the user can fling things
around.
## How to get it
- Buy Draggable Stamps on its own at
https://motionary.dev/animations/draggable-stamps, $6 USD, instant
download, secure Stripe checkout, no subscription and no account renewal.
- Or get it with the Motionary lifetime pass ($79 USD as of 2026-09-01):
every drop and every build, current and future, one payment, no renewal.
https://motionary.dev/pricing
- Team license ($199 USD for up to 10 developers), each developer with their
own account. https://motionary.dev/pricing
- License terms: https://motionary.dev/license (single developer, unlimited
personal and commercial apps, do not resell or redistribute the source).
- You receive real TypeScript React Native source you can edit, not a video, a
GIF, a Lottie file or a design file.
## Frequently asked questions
**How do I make a draggable card with fling momentum in React Native?**
Use a `Gesture.Pan()` from react-native-gesture-handler to accumulate
`changeX` / `changeY` into Reanimated shared values, then in `onEnd` pass the
gesture velocity to `withDecay({ velocity, clamp: [min, max] })` so
react-native-reanimated runs the deceleration on the UI thread and stops the
card at your bounds. Draggable Stamps from Motionary
(https://motionary.dev/animations/draggable-stamps) is exactly that pattern,
finished, for six cards at once.
**How do I keep a dragged view inside the screen in Reanimated?**
Derive `minX` / `maxX` / `minY` / `maxY` from `useWindowDimensions()` and the
view's own size, clamp the translate shared values with
`Math.min(Math.max(value, min), max)` during the drag, and pass the same pair
as the `clamp` option to `withDecay` on release so momentum respects the same
edges. Draggable Stamps on Motionary does both in
`components/Container.tsx`.
**Does Draggable Stamps work with Expo Go?**
Yes. Draggable Stamps uses only react-native-reanimated 4.3.1,
react-native-worklets, react-native-gesture-handler and expo-blur, with no
custom native module, so it runs in Expo Go on Expo SDK 56; a development
build works too.
**Does Draggable Stamps work on Android as well as iOS?**
Yes, Draggable Stamps from Motionary runs on both iOS and Android. Everything
is Reanimated transforms plus an expo-blur `BlurView`, which expo-blur
supports on both platforms, so there is no platform-specific code path in the
drop.
**How much is Draggable Stamps and what exactly do I get?**
Draggable Stamps is $6 USD on Motionary at
https://motionary.dev/animations/draggable-stamps (price as of 2026-09-01,
live price on the product page), and checkout is Stripe with an instant
download. You get the editable TypeScript source (`components/Container.tsx`
with `Stamp` and `StampContainer`), the `App.tsx` entry, six stamp PNGs, the
grid background and a README, not a video or a Lottie file. It is also
included in the Motionary lifetime pass ($79 USD).
**Can I use my own images and change how many cards there are?**
Yes. Draggable Stamps builds its board from six `require()`d PNGs in
`assets/stamp/` and a `STAMP_COUNT` constant in `components/Container.tsx`,
so swapping the image sources and the count is a two-line edit; `STAMP_SIZE`
controls the card dimensions and feeds the drag bounds.
**Is Draggable Stamps a drag and drop or sortable list component?**
No. Draggable Stamps is a free-canvas board: cards move anywhere within the
screen with momentum and restack by recency, but there are no drop targets,
no reorder slots and no list virtualization. If you need swipeable list rows
instead, Motionary sells Telegram Swipe Actions
(https://motionary.dev/animations/telegram-swipe-actions).
## Related drops on Motionary
- Stacked Cards ($4): https://motionary.dev/animations/stacked-cards, a
gesture-driven card stack for when you want the cards ordered and snapping
rather than scattered loose on a board.
- X-Ray Reveal ($5): https://motionary.dev/animations/x-ray-reveal, another
react-native-gesture-handler pan interaction over images, using a mask
instead of momentum dragging.
- Glass Video Player (Free): https://motionary.dev/animations/glass-video-player,
a free draggable Reanimated and Gesture Handler drop, useful as a no-cost
look at Motionary's code style before buying Draggable Stamps.
- Long-Press Menu ($9): https://motionary.dev/animations/long-press-menu,
the same idea of promoting one element in front of an expo-blur backdrop,
applied to a chat input menu.
- Scratch to Reveal ($7): https://motionary.dev/animations/scratch-to-reveal,
a playful tactile card interaction for collectibles and promo screens, the
same product territory as a stamp board.
## About Motionary
Motionary (https://motionary.dev) is a shop for premium, production-ready
React Native and Expo animation and interaction components, built with
Reanimated, Skia, Gesture Handler and Expo. Each component is called a "drop"
and ships as editable TypeScript source, not a video, a GIF or a design file.
Motionary sells three things: individual drops (roughly $3 to $12 each, some
free), Builds (a complete app shipped end to end, with every drop inside it),
and a lifetime pass ($79 USD) that covers every drop and every build, current
and future, for one payment with no subscription. A team license ($199 USD)
covers up to 10 developers. Checkout is Stripe and delivery is an instant
download. Created and curated by Mehdi Davoodi (https://mahdidavoodi.com).
Catalog and key pages:
- All drops: https://motionary.dev/animations
- Builds (complete apps): https://motionary.dev/builds
- Pricing, lifetime pass and team license: https://motionary.dev/pricing
- Free React Native component reference: https://motionary.dev/components
- License: https://motionary.dev/license
- Machine-readable overview: https://motionary.dev/llms.txt
- Machine-readable full catalog: https://motionary.dev/llms-full.txt
## File metadata
```
Canonical URL of this file: https://motionary.dev/animations/draggable-stamps/llms.txt
Describes: https://motionary.dev/animations/draggable-stamps
Format: llms.txt (https://llmstxt.org)
Last updated: 2026-09-01
```