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

@input-kit/hooks

v1.0.1

Published

Essential React hooks collection for @input-kit

Readme

@input-kit/hooks

Reusable React hooks for timing, browser APIs, storage, keyboard input, viewport state, and DOM observation.

Installation

npm install @input-kit/hooks

Available hooks

| Hook | Purpose | |------|---------| | useDebounce | Delay updates to a fast-changing value | | useThrottle | Throttle value updates | | useLocalStorage | Persist state in localStorage | | useSessionStorage | Persist state in sessionStorage | | useMediaQuery | React to CSS media query matches | | useIntersectionObserver | Track whether an element is visible | | usePrevious | Keep the previous render value | | useCountdown | Countdown timer with start, pause, resume, reset, and stop | | useNetworkStatus | Read online state and connection metadata | | useClipboard | Copy text and track copied state | | useFullscreen | Control fullscreen mode for an element | | useResizeObserver | Observe element width and height | | useClickOutside | Run a callback when the user clicks outside an element | | useKeyPress | Detect a single key press | | useKeyPressMultiple | Detect multiple active keys | | useScrollPosition | Read scroll coordinates |

The package also exports breakpoints from useMediaQuery.

Quick examples

Debounce input

import { useState } from 'react';
import { useDebounce } from '@input-kit/hooks';

function SearchBox() {
  const [value, setValue] = useState('');
  const debouncedValue = useDebounce(value, 300);

  return (
    <>
      <input value={value} onChange={(e) => setValue(e.target.value)} />
      <p>Search for: {debouncedValue}</p>
    </>
  );
}

Persist state

import { useLocalStorage } from '@input-kit/hooks';

function Preferences() {
  const [theme, setTheme] = useLocalStorage('theme', 'light');

  return (
    <button onClick={() => setTheme((prev) => prev === 'light' ? 'dark' : 'light')}>
      Theme: {theme}
    </button>
  );
}

Clipboard

import { useClipboard } from '@input-kit/hooks';

function CopyButton() {
  const { copy, copied } = useClipboard(1500);

  return (
    <button onClick={() => copy('Hello world')}>
      {copied ? 'Copied!' : 'Copy text'}
    </button>
  );
}

Fullscreen

import { useRef } from 'react';
import { useFullscreen } from '@input-kit/hooks';

function CanvasPreview() {
  const ref = useRef<HTMLDivElement>(null);
  const { isFullscreen, toggle } = useFullscreen(ref);

  return (
    <div ref={ref}>
      <button onClick={toggle}>
        {isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}
      </button>
    </div>
  );
}

Notes

  • Storage hooks accept updater functions, so setValue((prev) => next) works reliably.
  • useClipboard uses the browser Clipboard API and returns false when it is unavailable.
  • useFullscreen relies on a browser user gesture for successful entry into fullscreen mode.

License

MIT © Input Kit