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

@intentee/glazur

v0.1.0

Published

Layouting and tiling engine

Readme

Glazur 🧱

Layouting and tiling engine.

Installation

npm install @intentee/glazur

Radial layout

RadialLayout grows a rooted tree outward from its root as an evenly spaced radial burst: each depth becomes a ring, and every subtree occupies an angular wedge sized by how many leaves it contains. All rings share a single spacing step, so parent→child edges all have roughly the same length, node spacing is even in every direction, and — because that step is sized so every ring clears both radially and angularly (using each node's bounding disk) — no two node boxes ever overlap.

The layout is fully deterministic (identical input always yields identical output) and depends only on plain data, so it runs unchanged inside a Web Worker.

import { RadialLayout, RadialLayoutOptions } from "@intentee/glazur";

const { nodes, edges } = new RadialLayout(
    {
        nodes: [
            { id: "home", width: 80, height: 40 },
            { id: "shop", width: 80, height: 40 },
            { id: "checkout", width: 80, height: 40 },
        ],
        edges: [
            { sources: ["home"], targets: ["shop"] },
            { sources: ["home"], targets: ["checkout"] },
        ],
    },
    new RadialLayoutOptions({ spacing: 24 }),
).compute();

// nodes: [{ id, width, height, x, y }, ...] with x, y at each node's center
// edges: [{ source, target, from: { x, y }, to: { x, y } }, ...]

Options

| Option | Default | Effect | | --------- | ------- | -------------------------------------------- | | spacing | 20 | Minimum gap between neighbouring node boxes. |

The input must describe a single rooted tree: exactly one root, every other node reached by exactly one edge, and no cycles. Malformed input fails fast with a specific typed error.

Visualization

In a clone of this repository, make visualize starts a small static server and prints a URL. Opening it runs the layout inside a Web Worker, validates the worker's output with parseLayout, and renders it with LayoutScene — nodes as boxes and edges clipped to the node borders.

import { LayoutScene, parseLayout } from "@intentee/glazur";

const document = parseLayout(layoutJson); // validate untrusted layout JSON, or a compute() result
const scene = new LayoutScene(document);
scene.viewBox(); // { minX, minY, width, height }
scene.edgeSegments(); // [{ source, target, start, end }] clipped to node borders