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

@vladik.xyz/leva

v0.10.4

Published

[![npm (tag)](https://img.shields.io/npm/v/leva?style=flat&colorA=000000&colorB=000000)](https://www.npmjs.com/package/leva) [![npm bundle size](https://img.shields.io/bundlephobia/minzip/leva?style=flat&colorA=000000&colorB=000000&label=gzipped)](https:/

Downloads

432

Readme

npm (tag) npm bundle size GitHub Workflow Status Discord Shield

This fork

Published as @vladik.xyz/leva (the upstream leva name isn't ours to publish under). Same API — code still does import { useControls } from 'leva'; consumers alias it in package.json:

"leva": "npm:@vladik.xyz/leva@^0.10.4"
npm i @vladik.xyz/leva

What's different from pmndrs/leva

  • Resizable panel + folder search — drag the panel's edge to resize; a search box filters the control tree by label.
  • localStorage persistence — panel position/size/collapsed-folder state survives a reload.
  • Folder search auto-expands matches — a match nested inside a collapsed folder used to render but stay hidden behind maxHeight: 0. Folders now force-open while a filter is active and restore their prior collapsed state once it clears.
  • buttonGroup improvements — an optional activePath (dot-path to a sibling store value) highlights whichever button's key matches, styled like button()'s accent fill (stock buttonGroup had no notion of "currently selected"). Also fixed label truncation: a buttonGroup with a label reused the standard auto $controlWidth row grid (a fixed 160px control column), so long option words (e.g. "orthographic") overflowed past that column and visually overlapped the label instead of the label ellipsizing. The control column is now sized to its own content (max-content); the label column shrinks into whatever's left and ellipsizes as expected.
  • Number input: small and long valuesgetStep's floor went from 1e-3 to 1e-6 so sliders with sub-millesimal ranges (e.g. min:0 max:0.01) auto-derive a real step instead of clamping; the auto-pad decimal cap went from 2 to 6 so those steps actually render instead of collapsing to "0.00". The number column also widens past its default 4-character width once the displayed value needs more.

🚧🚧 This repo is under heavy development 🚧🚧

Features

  • ⭐️ Beautiful by default
  • 🎚 More than 12 different kinds of inputs available
  • 🧐 Smart input type recognition
  • 🔌 Easy-to-make plugins
  • ✅ Keyboard accessible
  • ⚡️ No setup necessary

Installation

npm i leva

Quick start

Simply call the useControls hook from anywhere in your app:

import { useControls } from 'leva'

function MyComponent() {
  const { name, aNumber } = useControls({ name: 'World', aNumber: 0 })

  return (
    <div>
      Hey {name}, hello! {aNumber}
    </div>
  )
}

NOTE: Using Leva with React 18 will cause a console error about createRoot which you can safely ignore, or fix by following the instructions here: discussion

Documentation

Contributors ✨

Thanks goes to these wonderful people (emoji key):

This project follows the all-contributors specification. Contributions of any kind welcome!