ZAYX logo
XGitHubDiscordReddit

FinPanel

An edge-swipe quick actions drawer with a second swappable insights page and staggered entrance animations.

Open in Github
Open in ChatGPT
Open in Claude
Open in Cursor

Edge pill trigger

Tap or swipe left on the right-edge pill to open; it fades out the instant the drawer appears.

Two-page swipeable drawer

Quick Actions and Insights sit side by side in one carousel, with an animated pill-dot indicator tracking the active page.

Staggered entrance animations

Each action springs and fades in with a per-index delay, driven by a reusable animation primitive.

Independent, non-conflicting gestures

Pill tap/swipe, drawer paging, and overlay tap-to-dismiss are separate gesture recognizers, so none of them fight.

Installation

Copy the command directly into your project.

npx degit ManasCodeXart/ZAYX/components/fin-panel components/fin-panel

Install the needed dependencies

npx expo install react-native-reanimated react-native-worklets react-native-gesture-handler

Use in your app

Built to match the preview exactly — for the complete implementation, check the repo on GitHub.

import { StyleSheet, View } from 'react-native' import { GestureHandlerRootView } from 'react-native-gesture-handler' import QuickActionsDrawer from '../../components/fin-panel/components/QuickActionsDrawer' export default function Index() { return ( <GestureHandlerRootView style={styles.root}> <View style={styles.container}> <QuickActionsDrawer /> </View> </GestureHandlerRootView> ) } const styles = StyleSheet.create({ root: { flex: 1, }, container: { flex: 1, backgroundColor: '#000000', }, })

API

<QuickActionsDrawer>

PropTypeDefaultDescription
actionsreadonly ActionItem[]5 built-in fintech actions (Cards, Quick Pay, Savings, Crypto, Your Bills)Actions rendered in the grid on page one.
onActionPress(actionId: string) => voidCalled when an action is tapped. The drawer closes automatically before this fires.
onOpenChange(isOpen: boolean) => voidCalled whenever the drawer opens or closes, whether by gesture or overlay tap.

<ActionPanel>

PropTypeDefaultDescription
actionsreadonly ActionItem[]Actions to render in the grid.
visiblebooleanControls the stagger entrance animation.
onActionPress(id: string) => voidFired on tap.
widthnumberPanel width — driven by the parent drawer's page width.

<InsightPanel>

PropTypeDefaultDescription
visiblebooleanControls the entrance animation.
widthnumberPanel width — driven by the parent drawer.

Ships as a placeholder — swap it for your own content (spending stats, subscriptions, a savings streak, etc.), and wrap it in AnimatedStaggerItem to keep the same entrance motion as the rest of the drawer.

<AnimatedStaggerItem>

PropTypeDefaultDescription
indexnumberPosition in the stagger sequence.
visiblebooleanTriggers entrance (true) or resets (false).
baseDelaynumber80ms before the first item starts entering.
staggerMsnumber60ms added per subsequent index.
translateDistancenumber40px the item translates in from.
springConfigWithSpringConfig{ damping: 18, stiffness: 220, mass: 0.6 }Spring driving the translate.
fadeConfigWithTimingConfig{ duration: 180 }Timing driving the opacity fade.
childrenReactNodeContent to animate in.

Gestures

GestureResult
Tap or swipe left on the edge pillOpens the drawer
Swipe left on the drawerAdvances from Quick Actions → Insights
Swipe right on InsightsGoes back to Quick Actions
Swipe right on Quick ActionsCloses the drawer
Tap the overlayCloses the drawer from any page

Types

interface ActionItem { readonly id: string; readonly label: string; readonly icon: ImageSourcePropType; } type DrawerPage = 'actions' | 'insights';

Project Structure

fin-panel/
├── components/
│ ├── QuickActionsDrawer.tsx # Root component — edge pill, overlay, open/close gestures
│ ├── ActionPanel.tsx # Page 1 — quick actions grid
│ ├── InsightPanel.tsx # Page 2 — placeholder, swap for your own content
│ └── AnimatedStaggerItem.tsx # Shared per-item fade + spring entrance primitive
├── constants/
│ ├── types.ts # ActionItem, DrawerPage types
│ └── scaling.ts # verticalScale helpers
└── assets/