rit3zh GitHub avatar

expo-morphing-menu

rit3zh

A morphing, keyboard-aware composer and picker menu for React Native that animates the input bar into a menu surface.

Stars

119

7-day growth

No data

Forks

10

Open issues

0

License

MIT

Last updated

2026-07-12

AI repository intelligence
FR-AI / ANALYSIS

Why it is worth attention

It provides a novel UI pattern where the composer seamlessly morphs into a menu with spring-driven animations, follows the keyboard in real time, and supports multi-panel navigation and single-image morph effects.

Who it is for

  • React Native developers building chat or social apps
  • Expo SDK 57 users wanting advanced input menus
  • UI component library maintainers seeking inspiration for animated menus
  • Mobile app developers needing a keyboard-aware attachment picker

Use cases

  • Building a composer with photo, camera, and file attachment panels
  • Creating a morphing input bar that expands into a selection menu
  • Implementing an AI chat assistant input with multiple tool options
  • Designing a bottom-input UI that stays glued above the keyboard

Strengths

  • Spring-driven morphing smoothly transitions width, height, corner radius, and position together
  • Keyboard-following via react-native-keyboard-controller prevents floating or overlapping
  • Multi-panel navigation with morphing between item list and content panels
  • TypeScript-first with fully typed surfaces and hooks

Considerations

  • Tightly coupled with Expo SDK 57 and specific native dependencies
  • Fixed Content height can overflow when keyboard is mounted; requires careful use
  • Provided as a template repository, not a standalone npm package

README quick start

expo-morphing-menu

A morphing, keyboard-aware composer + picker menu for React Native.

✨ Features

  • 🫧 Morphing presentation — a single spring machine drives the composer's width, height, corner radius, and position together, so the input bar grows into the menu surface instead of a separate sheet sliding up
  • ⌨️ Keyboard-following via react-native-keyboard-controller — the surface reads live keyboard height and stays glued above it as it opens and closes
  • 🧭 Multi-panel navigation — register rows (Camera, Photos, Files, Plugins…) and matching panels; open(id) morphs the surface to that panel and back() returns to the item list
  • 🖼️ Single-image morph — tapping a photo runs a shared-element morph from its grid cell into an attachment thumb, coordinated through the root via reportFrame / run
  • 🧠 TypeScript-first, fully typed surface

⚙️ Installation

git clone https://github.com/rit3zh/expo-morphing-menu
cd expo-morphing-menu
bun install
bun start -c

Core dependencies (already wired up in this template):

bun add react-native-reanimated react-native-gesture-handler \
  react-native-safe-area-context react-native-keyboard-controller \
  expo-symbols expo-glass-effect expo-image expo-document-picker

Expo SDK 57. Read the exact versioned docs at https://docs.expo.dev/versions/v57.0.0/ before changing native code.


🚀 Usage

Wrap your app once with KeyboardProvider, then compose a `` at the bottom of your screen.

// app/_layout.tsx
import { KeyboardProvider } from "react-native-keyboard-controller";
import { Stack } from "expo-router";

export default function RootLayout() {
  return (
    
      
    
  );
}

The simplest composer — a placeholder, one trigger, one menu item:

import { BottomInput } from "@/components/bottom-input";
import { SymbolView } from "expo-symbols";

export function Composer() {
  return (
    
      
        
      

      
        }
        />
      

      
        {/* your panel here */}
      
    
  );
}

Preview

https://github.com/user-attachments/assets/15abbea3-644f-4680-8795-4d16182a70ec

Controlling open state

Pass open / onOpenChange to drive the menu from outside (e.g. to prefetch the photo library the moment it opens):

const [menuOpen, setMenuOpen] = useState(false);

}
>
  {/* …

Description

🗂️ A morphing, keyboard-aware composer + picker menu.

Related repositories

Similar projects matched by category, topics, and programming language.

TanStack
Featured
TanStack GitHub avatar

router

TanStack Router is a type-safe, data-driven React router with built-in caching, prefetching, and nested layouts, while TanStack Start extends it into a full-stack SSR framework.

Web DevelopmentFrontend Frameworks
14,861
vercel-labs
Featured
vercel-labs GitHub avatar

scriptc

scriptc compiles ordinary TypeScript into small, fast native executables without needing Node.js, V8, or any JavaScript runtime in the binary.

Developer ToolsCode Quality & Build
1,985
Jakubantalik
Featured
Jakubantalik GitHub avatar

thinking-orbs

A React component library that renders six hand-tuned animated thought orb loading indicators on a plain 2D canvas, with two purpose-tuned sizes and automatic theme detection for AI and agent UIs.

AI & Machine LearningAI Agents
1,191