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

@c2n/skeleton

v0.0.14

Published

Skeleton built with Lit: a placeholder block standing in for content that has not arrived, in three shapes and three animations.

Readme

@c2n/skeleton

Skeleton built with Lit: a placeholder block standing in for content that has not arrived, in three shapes and three animations.

npm install @c2n/skeleton
<script type="module">
  import '@c2n/skeleton'
</script>

<c2-skeleton></c2-skeleton>
<c2-skeleton variant="text" lines="3"></c2-skeleton>
<c2-skeleton variant="circle" label="Loading profile"></c2-skeleton>
<c2-skeleton animation="wave" style="--c2-skeleton--height: 120px"></c2-skeleton>
  • Shapes: variant="rect" (default) for images, cards and buttons; text for copy, where lines repeats the block with a shorter last line; circle for avatars.
  • Animations: animation="pulse" (default) fades the block, wave sweeps a highlight across it, none leaves it still. Reduced motion stops all three.
  • Accessibility: the blocks are aria-hidden — a screen reader announcing a row of empty boxes helps nobody. Mark the waiting region aria-busy="true", and give one skeleton in a group a label to turn it into a role="status" that announces the wait once.
  • Layout: the host is a block that fills its container, and works as a flex or grid item without collapsing. A circle is sized by --c2-skeleton__circle--size on both axes, so it stays round in a container that is not square.

Theme it with --c2-skeleton--width, --c2-skeleton--height, --c2-skeleton--border-radius, --c2-skeleton--background-color, --c2-skeleton__sheen--color (the wave highlight), --c2-skeleton__pulse--opacity, --c2-skeleton--animation-duration, --c2-skeleton--gap, --c2-skeleton__last-line--width and --c2-skeleton__circle--size. The full list is in custom-elements.json and on the docs site.

Build a skeleton that traces the layout it replaces, then swap the whole thing for the real content. For a wait with no shape to hold, use @c2n/spinner; for one with a measurable amount of work left, @c2n/progress.