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

@daopk/tokens

v0.1.0-rc.1

Published

Design tokens for the daopk web OS: the framework-agnostic style contract every micro-frontend consumes.

Readme

@daopk/tokens

The style contract every daopk micro-frontend consumes. CSS custom properties only — no framework, no components — which is what lets an app written in any framework look native to the OS.

Why daopk owns --dk-* instead of using ropav's --rp-*

--rp-* is the public surface of a component library published for other people. Adopting it as the OS style contract would tie every independently-deployed app's appearance to ropav's release cadence: an app shipped six months ago would break when ropav renamed a semantic token, at a moment daopk does not control. That is the same coupling this project exists to remove — just moved from JS down into CSS.

Owning --dk-* gives the style contract its own version and its own ratchet (umberkit check, umberkit diff), which is what makes it a contract rather than a coincidence of variable names.

How the ropav bridge stays cheap

umberkit.config.ts uses ropav's seed palettes verbatim. Identical seeds mean umberkit derives identical token IDs and values on both sides, so scripts/build-ropav-bridge.mjs can generate the entire mapping:

--rp-color-blue-9: var(--dk-color-blue-9);

355 aliases, generated. Only the primitive tier is bridged — ropav's semantic and component tiers are defined in terms of its own primitives, so they re-resolve on top of the aliases with no mapping at all.

Rebranding is therefore a seed change here, and the bridge follows automatically.

Deliberately unbridged

37 ropav primitives have no daopk counterpart; the bridge script names them all on every run, so drift is visible rather than silent. Almost all are naming divergence, not gaps — line-height.md vs line-height.normal, transition.fast vs motion.duration.fast, font.weight.normal vs font.weight.regular, plus ropav's heading.h1…h6 and size.control.* scales.

They stay unbridged on purpose. Renaming the OS's scales to match a component library's vocabulary is exactly the dependency direction this package exists to avoid. ropav keeps its own values for these; nothing breaks.

Layer order is load-bearing

src/layers.css must be the first, blocking stylesheet in the document — a <link> or inline <style>, never JS-injected. A layer's position is fixed by its first mention, so if an app's CSS parses first, the app defines the order.

This one statement is what makes Module Federation's nondeterministic chunk order irrelevant to styling. daopk.tokens sits after ropav.tokens precisely so the bridge wins; swapping them silently disables the whole package.

Scripts

pnpm tokens:generate   # palettes → tokens/generated/{light,dark}.tokens.json
pnpm tokens:emit       # DTCG → src/generated/tokens.{css,ts} + tokens/manifest.json
pnpm tokens:bridge     # ropav/styles-manifest + our manifest → ropav-bridge.css
pnpm tokens:check      # lint + contract ratchet
pnpm build             # all of the above

tokens/ (DTCG sources + manifest.json) is committed — the manifest is what the ratchet diffs against. src/generated/ is not.