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

@step-wise/browser-utils

v0.1.0

Published

Browser-specific utilities for colors, DOM interactions, environment detection, and local storage.

Readme

@step-wise/browser-utils

@step-wise/browser-utils provides small browser-specific utilities for colors, DOM coordinates and elements, environment detection, and local storage. It does not depend on React. React components and hooks belong in @step-wise/react-utils, which may build on this package.

Installation

npm install @step-wise/browser-utils

Usage

Import public utilities and types from the package root.

import { colorToCss, getEventClientPosition, type RgbaColor } from '@step-wise/browser-utils'

const color: RgbaColor = [0.05, 0.5, 0.26, 1]
colorToCss(color) // 'rgba(13, 128, 66, 1)'

document.addEventListener('pointerdown', event => {
	const position = getEventClientPosition(event)
	if (position) console.log(position.x, position.y)
})

The package requires a browser environment for APIs such as window, HTMLElement, and localStorage. getEventClientPosition returns a Vector from @step-wise/geometry.

Colors

Colors use normalized channel values between 0 and 1. RgbColor contains red, green, and blue channels; RgbaColor additionally contains alpha. Functions accepting ColorInput support either tuple and treat omitted alpha as 1.

| Export | Behavior | | --- | --- | | RgbColor | Type for a normalized [red, green, blue] tuple. | | RgbaColor | Type for a normalized [red, green, blue, alpha] tuple. | | ColorInput | Accepts either RgbColor or RgbaColor. | | colorToCss(color) | Converts a normalized color to an rgba(...) CSS string. | | colorToHex(color) | Converts the RGB channels to six hexadecimal digits without a leading #. | | mixColors(color1, color2, part?) | Linearly interpolates all four channels. part defaults to 0.5. | | shiftColorBrightness(color, part?) | Lightens positive shifts and darkens negative shifts while preserving alpha. The shift must be between -1 and 1. |

DOM utilities

| Function | Behavior | | --- | --- | | ClientPosition | Structural type for a value with numeric clientX and clientY coordinates. | | PartialPositionEvent | Structural type for possibly incomplete direct or touch client coordinates. | | getEventClientPosition(event) | Returns client coordinates as a Vector. Mouse and pointer events always return a position; touch and incomplete structural events may return undefined. | | getClientPosition(input, parent?) | Returns the client position of an element or event-like value. With a parent, the result is relative to the parent's client rectangle. | | getHorizontalClickSide(event, element) | Returns 0 for the left half of the supplied element and 1 for its right half. | | ModifierKeyState | Represents the Shift, Control, and Alt state returned for an event. | | ModifierKeyEvent | Structural event type containing Shift, Control, and Alt properties. | | getModifierKeyState(event) | Returns the event's ModifierKeyState. | | resolveHTMLElement(value) | Resolves an HTMLElement or an object whose current property contains one; otherwise returns null. | | ensureHTMLElement(value) | Resolves an HTMLElement and throws when none is available. |

Environment

isLocalhost() checks whether the current browser hostname is localhost, the IPv6 loopback address, or an IPv4 loopback address in the 127.0.0.0/8 range.

Local storage

| Function | Behavior | | --- | --- | | readLocalStorageValue(key, backup?) | Reads a value and parses JSON when possible. It returns the original string when parsing fails and the backup when the key is absent. | | writeLocalStorageValue(key, value) | Serializes a value as JSON. Passing null or undefined removes the stored entry. |

Local-storage values cross an untyped persistence boundary. Consumers should validate values before relying on their shape.

React applications can use useLocalStorageState from @step-wise/react-utils to subscribe to these values and synchronize updates between components and browser documents.