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

vizij

v0.1.0

Published

Higher-level visualization and interaction components for robot and ai faces.

Readme

vizij

Higher-level visualization and interaction primitives for face/screen/group renderables. Sibling of @semio/scene; shares the same value-flow model.

Stores and contexts

vizij separates two concerns:

  • Vizij structure — what exists in the world: animatable definitions, world tree, materials, slot config. Lives in a Zustand store, accessed via VizijContext + useVizijStore.
  • Runtime values — the current value of every animatable. Lives in useValuesStore (re-exported from @semio/utils). Read with useValuesStore; write with useValuesStore.getState().updateValues(...).

Render hooks (useFeatures) subscribe to useValuesStore directly. The vizij store does not own runtime values.

VizijValueWriterContext

vizij has no built-in gizmos that drive animatable values today, but the override seam is wired up so that adding one is a one-step change. The pattern mirrors @semio/scene's SceneValueWriterContext:

  • The default writer hits useValuesStore.updateValues(...) directly — correct for standalone consumers.
  • Host apps can override via <VizijValueWriterContext.Provider> to add semantics. Studio does this in apps/studio/src/providers/studio.tsx to route writes through its animation-aware setValueAction, producing keypoint updates in animation mode with a matching track and direct writes otherwise. The same writer instance is supplied to both SceneValueWriterContext and VizijValueWriterContext.

Adding a gizmo that writes values

Use the hook; do not import useValuesStore directly from the gizmo:

import { useVizijValueWriter } from "vizij";

function MyVizijGizmo({ animatableId, namespace }) {
  const { setValue } = useVizijValueWriter();
  return (
    <SomeDraggableThing
      onChange={(next) => setValue(animatableId, namespace, next)}
    />
  );
}

This keeps the gizmo agnostic to whether it's running standalone or under a host that wants to intercept writes. The default writer is provided automatically — no Provider is required for the hook to return a usable value.

Override (host app)

import { useMemo } from "react";
import {
  VizijContext,
  VizijValueWriterContext,
  type VizijValueWriter,
} from "vizij";

function HostProvider({ store, children }) {
  const valueWriter = useMemo<VizijValueWriter>(
    () => ({
      setValue: (animatableId, namespace, value) =>
        store.getState().setValue(animatableId, namespace, value),
    }),
    [store],
  );

  return (
    <VizijContext.Provider value={store}>
      <VizijValueWriterContext.Provider value={valueWriter}>
        {children}
      </VizijValueWriterContext.Provider>
    </VizijContext.Provider>
  );
}

The writer is responsible for ensuring the value reaches useValuesStore — direct, batched, transformed, or routed through any other system the host needs.

Key APIs

| Export | Purpose | |---|---| | VizijContext | React context holding the vizij Zustand store. | | useVizijStore(selector) | Subscribe to the vizij store. | | createVizijStore(initial?) | Create an isolated vizij store. | | useFeatures | Subscribe to runtime values for a feature. | | VizijValueWriterContext | Override the gizmo value-write behavior. | | useVizijValueWriter() | Read the current writer (returns the default if no Provider). | | VizijValueWriter (type) | The writer interface: { setValue(id, namespace, value) }. |

Runtime values themselves (useValuesStore, mergeValueMaps) live in @semio/utils and are re-exported through @semio/animation.