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

@velnai/form-react

v0.1.0

Published

Drop a Velnai form into any React app. Thin iframe wrapper with typed props + event callbacks.

Downloads

90

Readme

@velnai/form-react

Drop a Velnai lead-capture form into any React app.

npm install @velnai/form-react

Usage

import { VelnaiForm } from '@velnai/form-react'

export function ContactPage() {
  return (
    <VelnaiForm
      publicKey="frm_abc123"
      prefill={{ email: '[email protected]', name: 'Alex' }}
      onSubmit={() => alert('Thanks!')}
    />
  )
}

Props

| Prop | Type | Default | What it does | |---|---|---|---| | publicKey | string | required | The form's public key. Find it in the dashboard's Install tab (e.g. frm_abc123). | | prefill | Record<string, unknown> | — | Field values to pre-populate, keyed by field name. Re-sent if the prop reference changes. | | lang | string | — | Locale code (e.g. 'es'). Forwarded as ?lang= so the renderer picks the matching translation. | | previewToken | string | — | Optional preview token for DRAFT forms. Copy it from the dashboard's Preview button URL. | | onView | () => void | — | Fires once the iframe boots and the form is interactive. | | onSubmit | () => void | — | Fires when the visitor submits the form successfully. | | onClose | () => void | — | Fires when a modal-mode form requests to close. | | onRedirect | (url: string) => boolean \| void | — | Called with a target URL before top-level navigation. Return true to suppress default navigation. | | formsBase | string | 'https://forms.velnai.com' | Override the forms host (self-hosted / staging). | | autoResize | boolean | true | Auto-resize iframe height to match content. | | initialHeight | number | 600 | Initial iframe height (px) before auto-resize takes over. | | className | string | — | CSS class on the iframe. | | style | React.CSSProperties | — | Inline style on the iframe. |

Security

The form renders inside a sandboxed iframe — the host page cannot access the iframe's DOM, cookies, or localStorage. The iframe sandbox is:

allow-forms allow-scripts allow-top-navigation-by-user-activation allow-popups

No allow-same-origin, so any attempt by host-page JS to reach into the iframe document raises a SecurityError. Submissions go directly from the iframe to forms.velnai.com — the host page never sees the data.

Why iframe instead of native rendering?

The form has 30+ field types (signature, file upload, payment, scheduling, address autocomplete, etc.) with conditional logic, A/B variants, theming, and i18n. A native React port would have to ship those again and stay in sync forever. Iframe keeps you on the same renderer as everyone else — features land in your React app the day they ship.

License

MIT