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

nirengi-ui-kit

v0.2.1

Published

A modern, themeable component library for **Angular 20, 21 and 22**. Standalone, signal-based, and **zoneless-friendly** — every component is a standalone Angular component with the `nui` selector prefix. It ships its **own precompiled CSS**, so you do

Readme

Nirengi UI Kit

A modern, themeable component library for Angular 20, 21 and 22. Standalone, signal-based, and zoneless-friendly — every component is a standalone Angular component with the nui selector prefix. It ships its own precompiled CSS, so you do not need Tailwind in your app.

  • ✅ Standalone components — no NgModule, import only what you use
  • ✅ Signal-based API (input() / output() / model())
  • ✅ Self-contained styles — no Tailwind required in consumer apps
  • ✅ Tree-shakable: direct import paths, no barrel files
  • ✅ Strictly typed, design-token driven, light/dark themes
  • ✅ Accessibility-minded (WCAG 2.1 AA)

Installation

npm install nirengi-ui-kit

Requirements

| Requirement | Supported versions | | ----------- | ------------------------------------------------------------- | | Angular | 20.3+, 21.x or 22.x | | Node.js | whatever your Angular version requires (Angular 22 needs ^22.22.3 \|\| ^24.15.0 \|\| >=26.0.0) |

Peer dependencies — install the Angular major you are already on:

# Angular 22
npm install @angular/core@^22 @angular/common@^22

# …or Angular 21 / Angular 20
npm install @angular/core@^21 @angular/common@^21
npm install @angular/core@^20 @angular/common@^20

Styling setup (required)

Components depend on one global CSS layer (theme tokens, Tailwind base, the RemixIcon web font, and the portalled nui-select dropdown styles). Import it once — then everything renders correctly with no Tailwind in your project.

/* src/styles.scss */
@import 'nirengi-ui-kit/styles';

or in angular.json:

"styles": [
  "node_modules/nirengi-ui-kit/styles.css",
  "src/styles.scss"
]

Dark mode: theme tokens include light + dark values. Add the .dark class to a parent (typically <html> or <body>) to switch.

Already use Tailwind? Import nirengi-ui-kit/theme (the semantic tokens) and merge the kit's config so its utilities resolve in your build:

// tailwind.config.js
const uiKit = require('nirengi-ui-kit/tailwind-config');
module.exports = { theme: { extend: { ...uiKit.theme.extend } } };

| Import path | Contents | | -------------------------------- | ------------------------------------------------------------------------ | | nirengi-ui-kit/styles | Recommended. Full self-contained CSS (icons included) — import once. | | nirengi-ui-kit/theme | Just the semantic theme tokens (:root + .dark). | | nirengi-ui-kit/icons | Just the RemixIcon web font — needed only alongside theme. | | nirengi-ui-kit/tailwind-config | The kit's tailwind.config.js, to merge into your own Tailwind setup. |


Quick start

Import a component directly from its path, add it to your standalone component's imports, and use its nui-* selector:

import { Component } from '@angular/core';
import { ButtonComponent } from 'nirengi-ui-kit/components/button/button.component';

@Component({
  selector: 'app-root',
  imports: [ButtonComponent],
  template: `<nui-button variant="primary" (clicked)="save()">Save</nui-button>`,
})
export class AppComponent {
  save() {
    /* ... */
  }
}

Import paths: there is no barrel index — import each component from its direct path (e.g. nirengi-ui-kit/components/button/button.component) for optimal tree-shaking. Enums and tokens have direct paths too (nirengi-ui-kit/common/enums/size.enum, nirengi-ui-kit/design-tokens/colors).

Shared values. Most components accept a size and variant:

  • size: '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' (from Size enum)
  • variant: 'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info' | 'neutral' (from ColorVariant enum)
import { Size } from 'nirengi-ui-kit/common/enums/size.enum';
import { ColorVariant } from 'nirengi-ui-kit/common/enums/color-variant.enum';

Components

All selectors use the nui prefix. Each entry shows its import path and a minimal example. String literals ("primary", "md") are accepted in templates in place of the enum members.

Typography & content

Headingnirengi-ui-kit/components/heading/heading.component

<nui-heading [level]="1" text="Page title" variant="neutral" />
<!-- levels: 1–6 · also: align, weight, size, truncate, uppercase -->

Paragraphnirengi-ui-kit/components/paragraph/paragraph.component

<nui-paragraph size="md" align="left">Body copy goes here.</nui-paragraph>

Badgenirengi-ui-kit/components/badge/badge.component

<nui-badge variant="success" type="soft" shape="pill" size="sm">New</nui-badge>
<!-- type: solid | outline | soft · shape: rounded | pill -->

Iconnirengi-ui-kit/components/icon/icon.component (icon names are RemixIcon names in kebab-case without the ri- prefix — see IconName; all 3229 are bundled, no extra install needed)

<nui-icon name="check-line" [size]="20" color="currentColor" />

Icons come from the vendored RemixIcon web font, so they add zero bytes to your JavaScript bundle — an icon is a CSS class, and any name works whether it is a literal or computed at runtime. The font is a cached static asset the browser fetches once. This does mean the stylesheet is required: it is already part of nirengi-ui-kit/styles, but if you compose your own CSS from nirengi-ui-kit/theme, add @import 'nirengi-ui-kit/icons'; too — without it no icon renders, including the ones inside nui-select, nui-datepicker and nui-toast.

Building an icon picker? loadNuiIconNames() fetches the name list (~60 kB) in its own lazy chunk, so it never lands in your initial bundle:

const names = await loadNuiIconNames();

Listnirengi-ui-kit/components/list/list.component

<nui-list [items]="users" [itemTemplate]="row" />
<ng-template #row let-user>{{ user.name }}</ng-template>

Breadcrumbnirengi-ui-kit/components/breadcrumb/breadcrumb.component

<nui-breadcrumb [items]="[{ label: 'Home', url: '/' }, { label: 'Settings' }]" separator="/" />

Accordionnirengi-ui-kit/components/accordion/accordion.component

<nui-accordion title="Section" content="Panel body" [(expanded)]="isOpen" />

Tablenirengi-ui-kit/components/table/table.component

<nui-table
  [data]="users"
  [columns]="[{ field: 'name', header: 'Name' }, { field: 'email', header: 'Email' }]"
  [pagination]="true"
  (rowClick)="onRow($event)" />
<!-- also: virtualScroll, lazy, sortChange, globalFilter, pageSize -->

Form controls

Buttonnirengi-ui-kit/components/button/button.component

<nui-button kind="solid" variant="primary" size="md" (clicked)="submit()">Save</nui-button>
<!-- kind: solid | outline | ghost | soft · also: disabled, loading, fullWidth, type -->

Textboxnirengi-ui-kit/components/textbox/textbox.component (works with ngModel / reactive forms)

<nui-textbox label="Email" type="email" placeholder="[email protected]" [(ngModel)]="email" />
<!-- also: icon, hint, clearable, readonly, variant, size -->

Textareanirengi-ui-kit/components/textarea/textarea.component

<nui-textarea label="Notes" [rows]="4" [autoResize]="true" [(ngModel)]="notes" />

Checkboxnirengi-ui-kit/components/checkbox/checkbox.component

<nui-checkbox label="Accept terms" [(ngModel)]="accepted" />
<!-- also: indeterminate, tristate, description, variant, size -->

Radionirengi-ui-kit/components/radio/radio.component

<nui-radio name="plan" [value]="'pro'" label="Pro" [(ngModel)]="plan" />
<nui-radio name="plan" [value]="'free'" label="Free" [(ngModel)]="plan" />

Switchnirengi-ui-kit/components/switch/switch.component

<nui-switch label="Enable notifications" [(ngModel)]="enabled" />

Selectnirengi-ui-kit/components/select/select.component

<nui-select
  label="Country"
  [options]="countries"
  bindLabel="name"
  bindValue="code"
  [searchable]="true"
  [(ngModel)]="country" />
<!-- also: multiple, clearable, itemTemplate -->

Datepickernirengi-ui-kit/components/datepicker/datepicker.component

<nui-datepicker label="Date" selectionMode="single" [(ngModel)]="date" (dateChange)="onDate($event)" />
<!-- selectionMode: single | range · also: minDate, maxDate, withTime, clearable -->

File uploadnirengi-ui-kit/components/file-upload/file-upload.component

<nui-file-upload [multiple]="true" accept="image/*" (upload)="onUpload($event)" (fileSelected)="onPick($event)" />

Overlays & feedback

Tabsnirengi-ui-kit/components/tabs (TabsComponent + TabComponent)

<nui-tabs variant="primary" size="md">
  <nui-tab label="Profile">Profile content</nui-tab>
  <nui-tab label="Security">Security content</nui-tab>
</nui-tabs>

Tooltipnirengi-ui-kit/components/tooltip (directive)

<button nuiTooltip="Helpful hint" nuiTooltipPosition="top">Hover me</button>

Popovernirengi-ui-kit/components/popover (directive; renders a component)

<button [nuiPopover]="MenuComponent" nuiPopoverPosition="bottom" [nuiPopoverInputs]="{ userId: 1 }"
        (popoverOpened)="onOpen()">
  Open menu
</button>

Toastnirengi-ui-kit/components/toast (service)

Add the container once near your app root, then inject ToastService:

<nui-toast-container />
import { ToastService } from 'nirengi-ui-kit/components/toast/toast.service';

private readonly toast = inject(ToastService);
this.toast.success({ title: 'Saved', description: 'Your changes were saved.' });
// also: error(), warning(), info()

Modalnirengi-ui-kit/components/modal (service)

Add the container once near your app root, then inject ModalService:

<nui-modal-container />
import { ModalService } from 'nirengi-ui-kit/components/modal/modal.service';

private readonly modal = inject(ModalService);
const ref = this.modal.open(MyDialogComponent, { size: 'md' });
const result = await ref.afterClosedPromise; // resolves with the close() value

Design system

Components are signal-based and OnPush. Sizing and colors come from the central Size and ColorVariant enums (source-of-truth values live in the library's tailwind.config.js), so spacing, heights, and palette stay consistent across the kit. Design tokens are also exported directly:

import { designTokenColors } from 'nirengi-ui-kit/design-tokens/colors';
import { designTokenSpacing } from 'nirengi-ui-kit/design-tokens/spacing';

For the full size/color reference, theming details, and the contribution guide, see the project repository.

License

MIT