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

@dualkit/starter

v0.1.0-beta.1

Published

A bilingual design system you can fork. One DTCG token file feeds Figma and code.

Readme

@dualkit/starter

A bilingual design system you can fork. One DTCG token file in git feeds Figma and code, so neither drifts.

v0.1 is the token pipeline and eight bilingual React components, drawn and approved in Figma first (file "Dualkit Starter").

Use

@import '@dualkit/starter/tokens.css';
@import 'tailwindcss';
@import '@dualkit/starter/theme.css';

Then <html lang="ar" dir="rtl"> gives you Arabic type, and data-theme="dark" gives you dark mode. Without data-theme, the system setting decides.

Change a token

Edit a file under tokens/, run npm run build -w @dualkit/starter, and commit the source and generated/ together. CI fails if they disagree.

To update Figma, run figma-render tokens tokens/dualkit.resolver.json. generated/figma-variables.json holds the same variables for any other importer.

Layout

  • tokens/dualkit.resolver.json: the resolver. Sets are primitives, semantic and script; modifiers are theme (light, dark) and script (en, ar).
  • scripts/tokens.mjs: reads the resolver and writes CSS, the Tailwind theme and the Figma variables.
  • generated/: the output. Never edit by hand.

Components

Eight React 19 components in components/, each with a real right-to-left problem solved:

| Component | What it gets right | | --- | --- | | Button | icon="forward" and "back" flip with the reading direction; close and check never do. | | Field | The value takes dir="auto", so an email or IBAN stays left to right in an Arabic form. | | DigitInput | Reads Western, Arabic-Indic and Persian digits, typed or pasted. Boxes stay left to right. Reports Western digits. | | Amount | All six Gulf currencies through @dualkit/format, isolated in a bdi, Arabic-Indic digits in Arabic. | | DateDisplay | Gregorian with Umm al-Qura Hijri, pinned to Gulf time, never shifted by the visitor's clock. | | Tabs | WAI-ARIA tabs. ArrowLeft moves forward in Arabic. | | Sheet | Modal side sheet from the inline end. Traps focus, closes on Escape, the scrim or a swipe back to its edge, returns focus. | | Toast | role="status", swipes away towards the inline end, Escape dismisses, the timer pauses on hover and focus. |

They are source you copy in, not a compiled package, so you own them and change them like your own code.

Copy them in

With the shadcn CLI, one at a time:

npx shadcn@latest add https://dualkit.dev/r/amount.json

That brings in the shared base and @dualkit/format too. Or take all of them at once:

npx degit dualkit/dualkit/packages/starter/components src/components/dualkit
npm i @dualkit/format

(Or copy node_modules/@dualkit/starter/components after npm i @dualkit/starter.)

Then load the tokens and the component styles once, and set lang and dir together:

import '@dualkit/starter/tokens.css'
import './components/dualkit/styles.css'
import { Amount, Button } from './components/dualkit'

<html lang="ar" dir="rtl">
  <Amount amount={1250} currency="AED" locale="ar" label="المبلغ المستحق" />
  <Button icon="forward">متابعة</Button>
</html>

styles.css is plain CSS on the --dk- tokens, so it works with or without Tailwind. Mirroring comes from dir through logical properties and :dir(); no component has an RTL branch except where the behaviour itself differs (arrow keys in Tabs, the swipe direction). Amount, DateDisplay and DigitInput take a locale prop rather than reading the page, so server and client render the same thing.

Tests: npm test -w @dualkit/starter runs the token tests and the component tests in jsdom, each behaviour in English and Arabic.