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

@relax.js/components

v2.0.5

Published

Native Web Components for business apps: tables, tree views, menus, tabs, dialogs, forms, banners, and dashboard figures, meters and charts.

Readme

@relax.js/components

The UI pieces a business web app needs, built as native Web Components: tables and trees for records, menus and tabs for navigation, loading feedback, and figures, meters and charts for dashboards.

They are made for Relax.js apps, but every one is a plain custom element. Put a tag in any page, with any framework or none, and it works.

The demos show three complete apps built with these components: a live ops dashboard, an order desk and a household budget in English and Swedish.

Why Use It

  • No framework to buy into. Components build on what the browser already has: a table is a native <table>, menus use the Popover API, modals use <dialog>, inputs take part in native forms. There is nothing to learn beyond HTML, and nothing to migrate away from later.
  • One look, yours to change. Every component follows one design language and one theme stylesheet, so a page built from them looks like one product. Change a colour once and every component follows; light and dark mode come with it.
  • Speaks your users' language. Numbers, amounts and dates follow one locale and currency setting, and the words components show are translatable. English and Swedish ship with the package.
  • Server data without glue code. Give a table an async function, and it asks for each page and sort order as the user needs them, cancelling loads it no longer wants. An existing Relax.js DataLoader plugs straight in.
  • Accessible by default. What the user can see (selected, expanded, loading) is reflected as ARIA state, focus is always visible, and charts carry a table for screen readers.
  • Nothing hidden to reason about. Each component is a plain custom element with the lifecycle documented on MDN: no base class, no reactivity, no store. It redraws when you change its attributes, properties or content, or switch language, and at no other time.
  • Every connection is one search away. Tags, r- event names and their event classes are literal names, registered in TypeScript's element and event maps and listed in the shipped custom-elements.json. The compiler checks what a listener reads, and a search finds every use.
  • Failures you can see and test. A wrong attribute value is never thrown or guessed around: the component renders empty and reports <tag>: <what is wrong> through the same Relax.js error channel as the rest of your app, so it reaches onError() and window.relaxErrors, and a test asserts on it with captureRelaxErrors().

Install

npm install @relax.js/components @relax.js/core
import '@relax.js/components';
@import "@relax.js/components/theme.css";

Importing the package registers every tag. To pay only for the elements you use, import them one by one instead, such as import '@relax.js/components/card'; the manual names each import. ES modules only.

An app with its own palette loads @relax.js/components/theme-sizes.css alone and sets the colour variables itself; see Customizing.

<r-tabs>
    <r-tab label="Overview">...</r-tab>
    <r-tab label="Details">...</r-tab>
</r-tabs>

Working with a Coding Agent

Every component has one doc in the same shape, written so an agent can use it from the doc and the typings alone. The package also ships a skill covering the mistakes an agent makes from habit, such as passing a list as an attribute or reading event.detail. Copy node_modules/@relax.js/components/skills/relaxjs-components/ into your agent's skills folder (.claude/skills/ for Claude Code), or point its instruction file at the SKILL.md in it. Install the Relax.js core skills alongside it with npx @relax.js/core init-agents.

Learn More

  • Manual: every component, with usage, attributes, events and styling hooks.
  • Formatting: locale, currency and translations.
  • Customizing: colours, dark mode and restyling one component.
  • Authoring: writing or changing a component in this library.
  • CHANGELOG: what changed between versions.

License

MIT