npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

expo-ios-popover

v0.1.5

Published

Native iOS Popover for React Native.

Readme

expo-ios-popover

A native iOS popover component for React Native + Expo — built on UIPopoverPresentationController for that authentic platform feel.

https://github.com/user-attachments/assets/1eedbd6b-1991-4588-862f-eb6e2175997d

Features

  • Native UIPopoverPresentationController under the hood
  • Compound component API — Popover, Popover.Trigger, Popover.Content, Popover.Pressable
  • Configurable arrow direction, trigger type, background color, and animation
  • Auto-sizing popover based on content
  • Visibility and dismiss callbacks

Installation

bun install expo-ios-popover

This module includes native iOS code, so you need to prebuild and run on a real device or simulator — Expo Go is not supported.

bunx expo prebuild --platform ios
bunx expo run:ios

If you've already prebuilt your project, just re-run expo run:ios after installing.

Usage

Named import (compound component style):

import { Popover } from "expo-ios-popover";

<Popover>
  <Popover.Trigger>…</Popover.Trigger>
  <Popover.Content>…</Popover.Content>
</Popover>;

Namespace import:

import * as Popover from "expo-ios-popover";

<Popover.Root>
  <Popover.Trigger>…</Popover.Trigger>
  <Popover.Content>…</Popover.Content>
</Popover.Root>;

Quick Start

import { Popover } from "expo-ios-popover";
import { Text, View } from "react-native";

export default function App() {
  return (
    <Popover>
      <Popover.Trigger>
        <Text style={{ color: "#fff" }}>Tap me</Text>
      </Popover.Trigger>
      <Popover.Content style={{ backgroundColor: "#1c1c1e" }}>
        <View style={{ padding: 20 }}>
          <Text style={{ color: "#fff" }}>Hello from the popover!</Text>
        </View>
      </Popover.Content>
    </Popover>
  );
}

API

<Popover> / <Popover.Root>

The root wrapper. Manages trigger gestures and popover presentation.

| Prop | Type | Default | Description | | -------------------- | ---------------------------- | ------- | --------------------------------------- | | direction | ArrowEdge | "any" | Permitted arrow direction | | trigger | TriggerType | "tap" | Gesture that opens the popover | | animated | boolean | true | Animate presentation and dismissal | | onVisibilityChange | (visible: boolean) => void | — | Called when the popover opens or closes |

<Popover.Trigger>

Wrap any element to make it the anchor for the popover. Accepts an optional style prop.

<Popover.Content>

The popover body. Sizes itself automatically to fit its children.

| Prop | Type | Default | Description | | ----------- | ------------ | ------- | -------------------------------------------------------------------------------------------------- | | style | ViewStyle | — | Style applied to the inner container. backgroundColor is forwarded to the native popover chrome. | | onDismiss | () => void | — | Called when the popover is dismissed |

<Popover.Pressable>

A pressable view for use inside the popover content. Useful for action buttons that need touch feedback.

| Prop | Type | Description | | --------- | ------------ | --------------- | | style | ViewStyle | Container style | | onPress | () => void | Press handler |

Enums

ArrowEdge

Controls which direction the popover arrow is allowed to point.

| Value | Native direction | | -------------------- | ----------------------------------------- | | ArrowEdge.Top | Arrow points down (popover above trigger) | | ArrowEdge.Bottom | Arrow points up (popover below trigger) | | ArrowEdge.Leading | Arrow points right (popover to the left) | | ArrowEdge.Trailing | Arrow points left (popover to the right) | | ArrowEdge.Any | System decides (default) | | ArrowEdge.None | No arrow |

TriggerType

| Value | Gesture | | ----------------------- | -------------------- | | TriggerType.Tap | Single tap (default) | | TriggerType.LongPress | Long press | | TriggerType.DoubleTap | Double tap |

Full Example

import * as Popover from "expo-ios-popover";
import { ArrowEdge, TriggerType } from "expo-ios-popover";
import { Text, View } from "react-native";

export default function App() {
  return (
    <Popover.Root
      direction={ArrowEdge.Top}
      trigger={TriggerType.LongPress}
      onVisibilityChange={(visible) => console.log("open:", visible)}
    >
      <Popover.Trigger>
        <View style={{ padding: 16, backgroundColor: "#333", borderRadius: 8 }}>
          <Text style={{ color: "#fff" }}>Long press me</Text>
        </View>
      </Popover.Trigger>

      <Popover.Content
        style={{ borderRadius: 12, padding: 16 }}
        onDismiss={() => console.log("dismissed")}
      >
        <Text style={{ color: "#fff", fontSize: 16 }}>
          You are an awesome developer!
        </Text>
      </Popover.Content>
    </Popover.Root>
  );
}

Background Color

Pass backgroundColor through the style prop on Popover.Content — it's automatically forwarded to the native popover chrome (the arrow and outer container). Supports hex values (#1c1c1e, #FF000080) and named colors (red, black, transparent, etc.).

Requirements

  • iOS only — this module uses UIPopoverPresentationController, an iOS-specific API
  • Expo SDK with a development build or bare workflow (Expo Go is not supported)
  • React Native 0.74+

License

MIT © 2026