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

@novahelm/ui

v2026.6.1

Published

NovaHelm UI — React components built on Tailwind CSS and Radix.

Readme

@novahelm/ui

Component library for NovaHelm — built on shadcn/ui, Radix primitives, Tailwind CSS 4, and class-variance-authority. Ships 70+ components covering forms, data display, feedback, navigation, layout, and dashboard patterns.


Quick Start

pnpm add @novahelm/ui
import { Button, Card, CardHeader, CardTitle, CardContent } from "@novahelm/ui";

export function Dashboard() {
  return (
    <Card>
      <CardHeader>
        <CardTitle>Welcome</CardTitle>
      </CardHeader>
      <CardContent>
        <Button variant="default" size="md">
          Get Started
        </Button>
      </CardContent>
    </Card>
  );
}

Subpath Exports

| Import path | Purpose | |-------------|---------| | @novahelm/ui | All components, hooks, and utilities | | @novahelm/ui/theme | Theme system (ThemeProvider, presets, tokens, defineTheme) | | @novahelm/ui/theme/tailwind-preset | Tailwind CSS 4 preset for consumer projects | | @novahelm/ui/registry | Dynamic component registry (registerComponent, getComponent) | | @novahelm/ui/meta | Component metadata system (defineComponentMeta) | | @novahelm/ui/contracts | Component prop contracts / interfaces |


Component Inventory

Form Components

| Component | Description | |-----------|-------------| | Button | Primary action button with variants, sizes, loading state, and icon slots | | Input | Text input field | | Textarea | Multi-line text input | | Label | Form label | | Select | Single-value dropdown select | | Checkbox | Boolean checkbox | | Switch | Toggle switch | | RadioGroup | Radio button group | | Slider | Range slider | | FormField | Labeled field wrapper with description and error display | | Form | TanStack Form integration wrapper | | Combobox | Searchable select with autocomplete | | TagInput | Multi-value tag input | | MultiSelect | Multi-value dropdown select | | FileUpload | Drag-and-drop file upload area | | ColorPicker | Color selection input | | DatePicker | Single date picker | | DateRangePicker | Date range selection | | Calendar | Calendar date picker primitive | | InputOTP | One-time password input | | SearchInput | Search input with icon and clear button |

Data Display

| Component | Description | |-----------|-------------| | Card | Content container with header, content, and footer sections | | Badge | Status or label badge with variant and size props | | Avatar | User avatar with image, initials fallback, and size variants | | AvatarGroup | Stacked avatar group with overflow indicator | | Table | HTML table primitives (Header, Body, Row, Head, Cell, Caption) | | DataTable | Full-featured data table (TanStack Table + Virtual) with sorting, filtering, pagination, row selection, and virtualization | | Tabs | Tabbed content panels | | Accordion | Collapsible content sections | | Separator | Horizontal or vertical divider | | Skeleton | Loading placeholder | | Progress | Progress bar | | Spinner | Loading spinner | | Timeline | Vertical timeline with variant-styled items | | ActivityFeed | Chronological activity list | | CodeBlock | Syntax-highlighted code display | | Kbd | Keyboard shortcut display | | AspectRatio | Constrained aspect ratio container | | Carousel | Image/content carousel | | RatingsIndicator | Star/score rating display |

Feedback & Overlay

| Component | Description | |-----------|-------------| | Dialog | Modal dialog with portal, overlay, header, footer | | AlertDialog | Confirmation dialog with action/cancel buttons | | Sheet | Slide-out side panel | | Drawer | Bottom/side drawer panel | | Alert | Inline alert banner (info, warning, error) | | Popover | Floating content popover | | Tooltip | Hover tooltip | | HoverCard | Rich hover preview card | | toast / Toaster | Toast notification system (Sonner) | | EmptyState | Empty content placeholder with icon, title, action | | ErrorBoundary | React error boundary with fallback UI | | Command | Command menu / palette primitive (cmdk) |

Navigation

| Component | Description | |-----------|-------------| | DropdownMenu | Dropdown menu with items, checkboxes, radios, submenus | | ContextMenu | Right-click context menu | | Menubar | Horizontal menu bar | | NavigationMenu | Site navigation menu with content panels | | Breadcrumb | Breadcrumb navigation trail | | Pagination | Page navigation controls | | Stepper | Multi-step progress indicator | | ScrollArea | Custom scrollbar container | | Collapsible | Expandable/collapsible section | | Toggle / ToggleGroup | Toggle button and grouped toggles | | SegmentedControl | Segmented option switcher | | ResizablePanels | Resizable split panel layout |

Layout

| Component | Description | |-----------|-------------| | Sidebar | Full sidebar system (Provider, Header, Footer, Content, Menu, Groups) | | SettingsLayout | Settings page shell with sidebar navigation |

Dashboard & Admin

| Component | Description | |-----------|-------------| | StatCard | Metric card with trend indicator | | StatsGrid | Grid of stat cards | | KPIIndicator | Key performance indicator display | | ChartCard | Chart container card | | StatusBadge | Semantic status badge (success, warning, error, info) | | ActivitySidebar | Activity feed sidebar panel | | QuickActions | Quick action button grid | | NotificationBell | Notification icon with badge and dropdown | | NotificationPreferences | Notification channel settings form | | CommandPalette | Full command palette with groups and keyboard shortcut | | OnboardingWizard | Multi-step onboarding flow | | CopyButton | Copy-to-clipboard button |


Dock Primitives (NovaPulse design language)

The components/dock/ subpath ships 10 primitives for the signature NovaPulse UI — used in mobile and the dev-console shells. Source of truth: the mockup at docs/mockups/novapulse-redesign.html.

import {
  FloatingDock, TabPill, FAB,
  ActionSheet, ActionRow, ActionTile,
  BreadcrumbChip, L3Strip,
  GlassSurface, PulseDot,
} from "@novahelm/ui";

| Primitive | Purpose | | --- | --- | | GlassSurface | Translucent glass-blur surface (pill / chip / glass radii) | | PulseDot | Animated live indicator | | FAB | Circular floating action button with hold-affordance ring + holdHint label | | TabPill | Single tab in a floating dock (active-state indicator) | | FloatingDock | Dock container: tab row + separate FAB | | ActionSheet | Bottom glass sheet (grabber + title + content) | | ActionRow | Sheet row (icon + label + sub + trailing slot) | | ActionTile | Compact grid tile (icon above label) | | BreadcrumbChip | Scope switcher chip (gradient dot + path + chevron) | | L3Strip | Horizontal scroller of sub-tab pills for module sections |

Pair with the novapulse-dark or novapulse-light preset (see Theme System below) for the full visual language. Utility Tailwind classes (bg-brand, bg-destructive, etc.) continue to work through the --nova-* alias layer emitted by every preset.


Theme System

NovaHelm UI generates its themes from @novahelm/design-tokens (one canonical source for both web and native). Six presets ship: default, slate, neon, warm, novapulse-dark, and novapulse-light. Each preset emits both semantic CSS variables (--color-brand-pulse, --color-bg-canvas, ...) and legacy --nova-* aliases so existing Tailwind utility classes (bg-primary, bg-destructive, ...) keep working across theme switches.

Theme Provider

Wrap your app with ThemeProvider to enable dark/light mode and theme presets:

import { ThemeProvider } from "@novahelm/ui";

export function App({ children }) {
  return (
    <ThemeProvider defaultTheme="system" storageKey="nova-theme">
      {children}
    </ThemeProvider>
  );
}

Built-in Presets

| Preset | Description | |--------|-------------| | defaultPreset | Standard NovaHelm theme | | slatePreset | Cool slate tones | | neonPreset | Vibrant neon accents | | warmPreset | Warm earth tones | | cyberPreset | Cyberpunk-inspired | | oceanPreset | Ocean blue palette | | forestPreset | Forest green palette | | midnightPreset | Deep midnight tones | | lavenderPreset | Soft lavender palette | | sunsetPreset | Warm sunset gradient | | sandstonePreset | Neutral sandstone | | arcticPreset | Cool arctic blues | | rosePreset | Rose pink palette | | emeraldPreset | Rich emerald greens |

Custom Themes

Create a custom theme with defineTheme():

import { defineTheme } from "@novahelm/ui";

const myTheme = defineTheme({
  name: "my-brand",
  colors: {
    primary: { light: "#0066ff", dark: "#3388ff" },
    background: { light: "#ffffff", dark: "#0a0a0a" },
  },
});

Tailwind CSS 4 Integration

Use createNovaPreset() in your Tailwind config to get all NovaHelm design tokens:

import { createNovaPreset } from "@novahelm/ui/theme/tailwind-preset";

export default {
  presets: [createNovaPreset()],
  content: ["./src/**/*.{ts,tsx}", "./node_modules/@novahelm/ui/dist/**/*.mjs"],
};

Usage Examples

Button

import { Button } from "@novahelm/ui";
import { Plus, ArrowRight } from "lucide-react";

// Variants: default, destructive, outline, ghost, link
// Sizes: sm, md, lg, icon
<Button variant="default" size="md" loading={isSubmitting}>
  Save Changes
</Button>

<Button variant="outline" leftIcon={<Plus className="h-4 w-4" />}>
  Add Item
</Button>

<Button variant="ghost" rightIcon={<ArrowRight className="h-4 w-4" />}>
  Continue
</Button>

DataTable

import { DataTable, type DataTableColumn } from "@novahelm/ui";

interface User {
  id: string;
  name: string;
  email: string;
  role: string;
}

const columns: DataTableColumn<User>[] = [
  { accessorKey: "name", header: "Name", enableSorting: true },
  { accessorKey: "email", header: "Email" },
  {
    accessorKey: "role",
    header: "Role",
    cell: (value) => <Badge variant={value === "admin" ? "default" : "outline"}>{value}</Badge>,
  },
];

<DataTable
  columns={columns}
  data={users}
  sorting
  pagination
  pageSize={25}
  selectable
  onRowClick={(user) => router.push(`/users/${user.id}`)}
  virtualizeRows
  emptyMessage="No users found"
/>

Dialog

import {
  Dialog, DialogTrigger, DialogContent,
  DialogHeader, DialogTitle, DialogDescription, DialogFooter,
  Button,
} from "@novahelm/ui";

<Dialog>
  <DialogTrigger asChild>
    <Button variant="outline">Edit Profile</Button>
  </DialogTrigger>
  <DialogContent>
    <DialogHeader>
      <DialogTitle>Edit Profile</DialogTitle>
      <DialogDescription>Update your account details.</DialogDescription>
    </DialogHeader>
    {/* form fields */}
    <DialogFooter>
      <Button type="submit">Save</Button>
    </DialogFooter>
  </DialogContent>
</Dialog>

Toast Notifications

import { toast, Toaster } from "@novahelm/ui";

// Add <Toaster /> once at your app root
<Toaster />

// Trigger toasts anywhere
toast("Item saved successfully");
toast.error("Something went wrong");
toast.promise(saveData(), {
  loading: "Saving...",
  success: "Saved!",
  error: "Failed to save",
});

Hooks

| Hook | Description | |------|-------------| | useTheme() | Access current theme and toggle dark/light mode | | useSidebar() | Control sidebar open/collapsed state | | useControllableState() | Controlled/uncontrolled state helper | | useMediaQuery() | Responsive breakpoint detection | | useMounted() | SSR-safe mounted check | | useCallbackRef() | Stable callback reference | | useToasts() | Programmatic toast access |


Component Registry

Register and resolve components dynamically at runtime:

import { registerComponent, getComponent, hasComponent } from "@novahelm/ui";

// Register a custom component
registerComponent("my-widget", MyWidgetComponent);

// Resolve at runtime
const Widget = getComponent("my-widget");
if (Widget) {
  return <Widget {...props} />;
}

Utilities

import { cn } from "@novahelm/ui";

// Merge Tailwind classes with conflict resolution (clsx + tailwind-merge)
const className = cn("px-4 py-2 bg-primary", isActive && "bg-primary/90", className);

API Reference

| Export | Description | |--------|-------------| | cn(...inputs) | Tailwind class merge utility | | ThemeProvider | Theme context provider | | useTheme() | Theme hook (theme, setTheme, resolvedTheme) | | defineTheme(config) | Create a custom theme | | createNovaPreset() | Tailwind CSS 4 preset | | presets | All built-in theme presets | | defineComponentMeta(meta) | Register component metadata | | componentRegistry | Component metadata registry | | registerComponent(name, component) | Register a runtime component | | getComponent(name) | Resolve a registered component | | buttonVariants(props) | Button CVA variant helper | | alertVariants(props) | Alert CVA variant helper | | toggleVariants(props) | Toggle CVA variant helper | | segmentedControlVariants(props) | SegmentedControl CVA variant helper |