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

@loomidev/icons

v0.3.0

Published

Shared icon registry for loomi components: an inlined Heroicons set plus disk-based Iconsax and Untitled UI icon sets, with a runtime register API.

Readme

@loomidev/icons

The shared icon registry used across loomi components, covering three sources:

  • heroicons (default) — generated from the official Heroicons 24px outline and solid sets, then published as plain Lit SVG templates inlined directly into this package. No React or Heroicons runtime dependency ships to consumers.
  • iconsax and untitledui — disk-based. Unlike Heroicons, these ship as real .svg files under dist/svg/<source>/<type>/<name>.svg, not as JS strings. A consumer using one icon from a 3,800-icon set only ever downloads that one file — fetched once, cached in memory for the rest of the page's lifetime — instead of every component on the page paying for the whole set up front.
npm install @loomidev/icons lit

Heroicons (inlined)

import { getLoomiIcon, registerLoomiIcon, loomiIconNames } from "@loomidev/icons";
import { svg } from "lit";

registerLoomiIcon("rocket", svg`<path d="…" />`);
getLoomiIcon("bell-alert", "solid");
loomiIconNames(); // -> ["arrow-path", "bell-alert", …]

Components that render icons (<loomi-icon>, <loomi-button>, <loomi-input>, <loomi-alert>, <loomi-tabs>) all read from this one registry, so an icon you register is available everywhere.

| Export | Description | | --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | | getLoomiIcon(name, variant) | Returns the icon's inner SVG (a Lit SVGTemplateResult) or undefined. variant is outline or solid; default is outline. | | registerLoomiIcon(name, svg, variant) | Register or override an icon for outline or solid; default is outline. | | loomiIconNames(variant) | List all registered icon names for a variant; default is outline. |

Iconsax and Untitled UI (disk-based)

Most consumers should just use <loomi-icon source="iconsax" name="…"> (see @loomidev/icon) rather than calling these directly — they exist so other components can adopt the same sources later the way they already do for Heroicons.

| Source | Types | | ------------ | ------------------------------------------- | | iconsax | outline (default), solid, twotone | | untitledui | outline (default; the only type it ships) |

| Export | Description | | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | getLoomiDiskIconUrl(source, name, type?) | Resolves to the icon's .svg URL, or undefined if name isn't registered. An unavailable type for that source (e.g. untitledui + "twotone") falls back to outline rather than failing. | | loadLoomiDiskIcon(source, name, type?) | Fetches (and caches) the icon, resolving to a value renderable directly inside a Lit html template: html`<svg>${await loadLoomiDiskIcon(...)}</svg>`. Resolves undefined for an unregistered name or a failed fetch. | | loomiDiskIconNames(source, type?) | List all registered names for a source/type. | | loomiDiskIconTypes(source) | List the types a source actually ships, e.g. ["outline", "solid", "twotone"] for iconsax. | | isLoomiDiskIconSource(source) | Type guard — true for "iconsax" / "untitledui", false for "heroicons". |

All disk-based icons are normalized to fill/stroke="currentColor" at import time (see scripts/import-icon-set.mjs), so they theme exactly like Heroicons do — no per-icon color prop needed.

Adding another disk-based source later

There's no source-specific code to touch. Vendor the new set with the generic import script, pointed at a local export (one subfolder per type, full of flat <name>.svg files):

node scripts/import-icon-set.mjs --source <name> --from /path/to/icons
pnpm build   # regenerates the name manifest and copies the files into dist/svg/

Then widen LoomiDiskIconSource in src/disk-icons.ts to include the new name.

Dependencies

  • No LoomiUI package dependencies.