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

@owodesign/owoui

v0.1.12

Published

Reusable React UI foundation components and theme presets.

Readme

owoui

Reusable UI foundation components and default style preset.

Usage

import '@owodesign/owoui/style.css';
import { Button, Dialog, Select } from '@owodesign/owoui';

Example advanced primitives:

import {
  NavRail,
  Popover,
  RadioGroup,
  Table,
  Tree,
} from '@owodesign/owoui';

style.css is a compiled, publish-ready CSS asset. Consumers do not need Tailwind or a Tailwind PostCSS plugin to resolve it. It ships the component bundle together with theme-light + preset-default, so the full ref -> sys -> cmp token chain is present even when consumers only import one file.

To opt into another combination:

import '@owodesign/owoui/style.css';
import '@owodesign/owoui/theme-dark.css';
import '@owodesign/owoui/preset-glass.css';

Override order is intentional:

  • style.css establishes the default baseline (theme-light + preset-default)
  • later theme imports replace the theme layer
  • later preset imports replace the preset layer

This package ships:

  • reusable React UI primitives
  • form primitives including Checkbox, Radio / RadioGroup, Select, SegmentedControl, Switch, Input, and Textarea
  • structural primitives including Tree, NavRail, Table, Panel, Drawer, and SidePanel
  • floating / feedback primitives including Popover, Tooltip, Dialog, and Toast
  • a default style preset
  • a standalone token stylesheet via @owodesign/owoui/tokens.css
  • token metadata via @owodesign/owoui/tokens
  • data-state hooks on complex components
  • component-level customization surfaces for complex widgets
  • a packaged storybook registry consumable via @owodesign/owoui/storybook
  • a static storybook catalog consumable via @owodesign/owoui/storybook/catalog

Component Notes

  • Checkbox exposes a stable three-state visual contract via data-state="unchecked" | "checked" | "indeterminate" on the root and control nodes.
  • RadioGroup shares the ChoiceOption<T> model used by Select and SegmentedControl, supports orientation="vertical" | "horizontal" plus textValue for non-string labels, and exposes stable radio / radio-group part selectors.
  • Popover uses a compound API: Popover.Root, Popover.Trigger, and Popover.Content. Popover.Content supports side, align, alignOffset, matchTriggerWidth, closeOnInteractOutside, closeOnEscape, closeOnPointerDownOutside, restoreFocus, initialFocusRef, onInteractOutside, onPointerDownOutside, and onEscapeKeyDown.
  • Collapsible is the neutral disclosure primitive. Collapsible.Content defaults to unmountOnExit={true}, removes closed content from the tab order during collapse, and restores focus to the trigger if closing happens while a descendant is focused. CollapsiblePanel is the public styled layer and uses a compound Header / Title / Actions / Chevron / Content API. Settings / FAQ variants remain package-owned recipe patterns in Storybook rather than stable public exports.
  • SidePanel is a layout component for left/right docked workbench panels rather than an overlay drawer. It supports controlled or uncontrolled collapse via collapsed, defaultCollapsed, and onCollapsedChange, built-in handle variants via handleVariant="tab" | "rail" with tab as the default, optional width resizing via resizable, width, defaultWidth, minWidth, maxWidth, and onWidthChange, opt-in width persistence via persistenceKey + persistenceMode="opt-in", viewport responsive behavior via responsiveMode + collapseBreakpoint, resize accessibility text via getResizeValueText, and workbench coordination hooks via layoutId, panelId, onResizeStart, onResizeEnd, onCollapseStart, and onCollapseEnd. It keeps a built-in collapse handle plus an optional dedicated resize handle, and exposes stable handle | resize-handle | panel | header | content part selectors.
  • Tree now renders semantic nested treeitem -> group structure, uses dedicated expand controls instead of coupling row click with expansion, supports selectionMode="single" | "multiple" | "none", controlled selectedKeys, controlled expandedKeys, searchQuery filtering, and textValue for search on non-string labels.
  • Tree exposes stable item | row | expander | expanderPlaceholder | content | label | description | meta | actions | group part selectors instead of the previous button-centric contract.
  • NavRail provides NavRail.Item, NavRail.Section, and NavRail.Spacer for grouped icon-only navigation, plus orientation="vertical" | "horizontal" and arrow-key roving focus.
  • Table supports selectionMode, controlled or uncontrolled sorting, sticky headers, fixed-row-height virtualization via virtualized, renderHeader, renderCell, compare, isRowSelectable, loading, loadingState, skeletonRows, classNames.row | rowSelected | headerCell | headerSortButton | headerLabel | cell | selectionCell | selectionControl | loadingState | skeletonCell, sortCycle, getSortButtonAriaLabel, getRowProps for safe row-level attribute/style/event injection with defensive merging, and rowComponent for constrained shell replacement (animation, drag-and-drop) with mandatory domProps/innerRef transparency.
  • Select supports controlled value plus controlled popup state via open, defaultOpen, and onOpenChange.
  • Table defaults to a documented binary sorting cycle on sortable columns: none -> asc -> desc -> asc. Set sortCycle="ternary" to enable none -> asc -> desc -> none.
  • Table exposes onSortChange(sort) for explicit sort-state synchronization, including ternary clear-to-none transitions. Only sortable headers render an interactive button; static headers stay non-focusable.
  • Table selection can be labeled explicitly through selectionColumnAriaLabel, getSelectAllAriaLabel, and getRowSelectionAriaLabel so standalone selection columns do not rely on implicit fallback copy.

Token Exports

For CSS-only token consumption:

import '@owodesign/owoui/tokens.css';

For programmatic token metadata:

import { tokenGroups, semanticTokenKeys, themeNames, presetNames } from '@owodesign/owoui/tokens';

Themes

  • @owodesign/owoui/theme-light.css
  • @owodesign/owoui/theme-dark.css

If you import theme-light.css after style.css, it is effectively a no-op because style.css already includes the same theme baseline.

Presets

  • @owodesign/owoui/preset-default.css: Signature Look based on qblog's current default preset qualities
  • @owodesign/owoui/preset-flat.css: low-depth preset with minimal shadows
  • @owodesign/owoui/preset-elevated.css: stronger depth and larger radii
  • @owodesign/owoui/preset-glass.css: translucent surfaces with blur

If you import preset-default.css after style.css, it is effectively a no-op because style.css already includes the default preset baseline.

There is no backward-compat alias layer for the previous dark.css / flat.css / elevated.css / glass.css entrypoints.

Storybook Artifact

owoui also ships a packaged storybook registry entry:

import { storybookStoryPaths, getStoriesByGroupAndComponent } from '@owodesign/owoui/storybook';

This is intended for host apps that want to mount the package stories under their own route shell.

For host apps that prefer a static navigation/catalog artifact, owoui also ships:

import storybookCatalog from '@owodesign/owoui/storybook/catalog';

It also builds a standalone static storybook site into dist/storybook-static/, which can be deployed directly or mounted by a host app as static files.

For package-local development with HMR, run:

npm run dev:storybook

The dev host lives inside this package itself (vite.config.ts, postcss.config.mjs, index.html) and does not depend on qblog's app shell.

Specs

Pitches

Release Checks

From the package root:

npm run release:check

After npm install, this repo also installs a local pre-push hook that runs the same verification chain before git push. If you need to bypass it for a one-off emergency push, use OWOUI_SKIP_PREPUSH=1 git push.

Publishing notes live in: