cennge-ui

npm update, fixed everywhere.

Dark-first React components on Radix UI and Tailwind CSS v4, installed from npm instead of copied into each project, so a fix ships once and reaches every app.

Install cennge-ui
  1. Buttonfixed in 0.3.0

    A loading button shows the wait cursor and stays still; a disabled link no longer navigates.

    Release notes
  2. Selectfixed in 0.3.0

    Inside an open Accordion, Dialog or Popover, a closed Select’s chevron points down again.

  3. Kbdfixed in 0.3.0

    Key symbols drawn at the size of the key cap in every font, read out as “Command Shift K”.

    Search the docs
    Command K
    Publish a release
    Command Shift P
    Send the form
    Command Enter
    Delete a word
    Option Backspace
  4. DatePickerfixed in 0.1.1

    minValue takes null, so a limit counted from today can wait until the browser knows the day.

    Today or later

Pick an accent or a theme: this page and every component on it repaint, as your app would.

Accent
Theme

Five here, the rest in the docs

Search, sort, read a chart, pick a date, flip a setting. The docs have 57 component pages, five for the charts and four for the map, each with live examples, its props and its measured size.

Updating is the feature

  1. Install, current stepOnce per app
npm install cennge-ui
@import "tailwindcss";@import "cennge-ui/styles.css";

Install it once.

npm install cennge-ui, then its stylesheet after Tailwind’s. It needs React 17, 18 or 19 and Tailwind CSS v4.

Then a fix ships in a release.

Each change to the package comes with a changeset, which becomes a version and a line in the changelog. Five releases so far, the latest 0.3.1.

npm update, and every app has it.

No component was copied into your code, so there is no copy to patch by hand in each project.

Tested where it breaks

2,090 end-to-end tests: the same 418 in each of five browser projects. Overlays inside overlays, touch, keyboard and focus. A warning in the console fails the test.

Chromium

418 tests at desktop size

Firefox

418 tests, WebGL on for the map

WebKit

418 tests in Safari’s engine

Pixel 7

418 tests in Chromium, with touch

iPhone 17

418 tests in WebKit, with touch

axe

93 runs per browser, dark and light, WCAG 2.2 AA

React 17

Unit tests and the published types, in CI

React 18

Unit tests and the published types, in CI

React 19

355 unit tests and every browser test

Next.js

An App Router app on the packed package: rendered, hydrated, no warning

What will you import?

ButtonInputSelectDialogTableToast

16.1KB gzip

The sum of each import measured on its own with esbuild and gzip, React, Radix and the other dependencies aside. Code that two components share is counted twice here, so the library’s part of your bundle comes in under it.

Four dependencies

Installed with it

  • radix-ui^1.8.1
  • tailwind-variants^3.3.1
  • tailwind-merge^3.7.0
  • clsx^2.1.1

Yours already

  • react17, 18 or 19
  • react-dom17, 18 or 19
  • tailwindcss4
  • maplibre-gl6, for the map only

Not in it

  • framer-motionCSS transitions instead
  • CSS-in-JSTailwind classes instead
  • A chart libraryIts own SVG instead
  • A date libraryIntl instead

Each component is its own chunk, so a page carries only what it imports. Motion is CSS that respects reduced motion; dates are ISO strings, named and ordered by Intl.

Update,
don’t copy.

The installation guide covers the package and its stylesheet. After that, every new version arrives through npm update.

Add cennge-ui to an app

React 17, 18 or 19 with Tailwind CSS v4.

npm install cennge-ui

In app/globals.css:

@import "tailwindcss";@import "cennge-ui/styles.css";