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

@sigx/lynx-zero

v0.28.0

Published

Design-system-neutral UI foundation for SignalX Lynx on the zero contract — anatomy-carrying parts, the class grammar, and the theme engine the compiled skins target (signalxjs/lynx#1029)

Readme

@sigx/lynx-zero

Design-system-neutral UI foundation for SignalX Lynx, built on the zero contract — the same anatomies, vocabularies and token names the web foundation ships, delivered the way lynx's style engine can consume them. Part of the design-system stack redesign tracked in signalxjs/lynx#1029; the pre-contract package lives on as @sigx/lynx-zero-legacy until this stack reaches parity.

The model

A design system is data. Its recipes live once, in a zero-repo package (@sigx/zero-daisyui, …), and compile per target with @sigx/zero-kit: attribute-selector CSS for the web, class-grammar CSS for lynx.zx-<scope>__<part> compounds with zx-s-<state> / zx-f-<flag> / zx-a-<axis>-<value> / zx-m-<mod> modifiers, every color a baked literal, themes as full-restatement .zx-root.zx-theme-<name> blocks. This package is the runtime those stylesheets target.

  • partBag(anatomy, part, options) — the render seam. One part descriptor yields both halves of the contract: the class list (composed with @sigx/zero's grammar helpers — the only thing lynx CSS can select on) and the data-scope/data-part/data-state/flag attributes (they render fine and stay the machine-readable anatomy for tests and tooling). Deriving both from one input is what keeps them from ever disagreeing.
  • partA11y(options) — zero's accessibility guarantees projected onto lynx's five-prop native surface (accessibility-element/-label/ -trait/-status), stated on the node that owns the tap handler.
  • The zero contract, re-exported — vocabularies, token categories, variantAttrs, the class grammar. This package defines no parallel vocabulary; @sigx/zero (catalog-pinned beta) is the single source.
  • Axis defaults — the lynx CSS has no :not() default twins, so an axis a recipe wires must always resolve to a concrete zx-a-* class. The design-system shell registers its manifest's declared defaults at load (registerAxisDefaults, right beside registerTheme), and every carrier resolves explicit prop ?? registered default per scope with resolveVariantAxes before stamping. No registration means unset axes stamp nothing — headless usage is unchanged.

Theming

Theme values never travel through JavaScript: the compiled skin declares every theme as static CSS, so selection is one class swap on the provider's host view. Theme metadata (names, scheme, light/dark pairing) comes from @sigx/zero/theme/registry, seeded by the design-system package at module load — the same registry the web runtime uses.

import { ThemeProvider, useTheme, themeController } from '@sigx/lynx-zero';

defineApp(() => () => (
    <ThemeProvider>          {/* renders class="zx-root zx-theme-<active>" */}
        <App />
    </ThemeProvider>
));

// Headless control from anywhere:
themeController.set('daisy-dark');
themeController.toggle();
themeController.followSystem();
  • followSystem (the default) picks the theme per OS scheme via the shared registry; the appearance signal is seeded natively before first paint, so the first render is already scheme-correct.
  • setFontScale(n) re-emits the scalable --text-* ramp as scaled literal px inline on the host (registerTextRamp supplies the unscaled values — the design-system package registers them beside its themes). --text-fixed-* — control chrome — is untouched by construction.
  • useScreenTheme(name) (@sigx/lynx-zero/screen-theme, optional @sigx/lynx-navigation peer) pins the global theme while a route is focused.

Layout

Row / Col / Center / Spacer / ScrollView and the responsive-prop helpers carry over from the legacy package unchanged — lynx-only concerns (long-form flex because the engine mis-expands the shorthand, JS-resolved breakpoints because inline styles beat stylesheet @media) that zero has no counterpart for.

Components (the pilot ten)

Progress, Button, Switch, Tabs, Accordion, Dialog, Popover, Toast, Select, Slider — zero's anatomies rendered in Lynx JSX over the shared behaviors. The platform spellings to know:

  • Closed means unmounted. Lynx has no hidden attribute and no attribute selectors, so inactive panels, closed popups and unchecked indicators leave the tree — absence is the lynx spelling of hiddenIn.
  • Overlays portal to the outlet. Wrap the app once in ZeroRoot (theme host + overlay outlet as the LAST child — stacking is document order). Dialog renders the anatomy's ::backdrop pseudo part as a real view; light dismiss routes through the shared layer stack (dismissTopLayer()), so nested overlays close innermost-first.
  • Select is options-driven (options={[{ value, label?, group?, … }]}, zero's OptionInput shape); Slider is touch-driven tier 1 — the value paints as inline track percentages, the lynx counterpart of the web's runtime --slider-percent.
  • @sigx/lynx-zero/testing holds components to the same contract as the web: expectAnatomy (zero's oracle over the rendered tree; pass { portaled: ['popup'] } for parts the outlet hosts) and expectClassGrammar (the classes recomputed from the data attributes).

What comes next

The compiled design-system shells (@sigx/lynx-daisyui-zero) and the showcase pilot screens land in the remaining PRs of #1029.