Typographically accurate text-skeletons
for loaders and UI libraries.

Reads the font actually in effect — ascent, x-height, descenders, line-height — and lays out gray blobs the way that font would really wrap. Not a gray box sized to 1em.

Real text, same width, same font

real

Good documentation explains the why behind a decision, not just what the code does — the what is already visible in well-named identifiers and the diff itself.

<text-skeleton lines="3" connect="word" animated="sweep">

Quick start

<!-- pin to a tag, not @main, once you've published one -->
<script src="https://cdn.jsdelivr.net/gh/Syneris/text-skeleton@main/text-skeleton.js"></script>

<text-skeleton lines="3" connect="word" animated="sweep"></text-skeleton>
<text-skeleton inline chars="12" connect="word" animated="sweep"></text-skeleton>
<text-skeleton text="Same word count, same wrap as this exact string." connect="word" animated="sweep"></text-skeleton>

What it does

Same markup, real content vs. placeholder

real

Senior Frontend Engineer

Zurich, Switzerland · Full-time

We're looking for an experienced engineer to help us build the next generation of our platform.

<text-skeleton connect="word" animated="sweep">

Install

No build step, no dependencies, ~12 KB gzipped (text-skeleton.js) / ~4 KB (text-censor.js). Either copy the files into your project, or load them straight from GitHub via jsDelivr's GitHub-source CDN — no npm publish required:

https://cdn.jsdelivr.net/gh/Syneris/text-skeleton@TAG/text-skeleton.js
https://cdn.jsdelivr.net/gh/Syneris/text-skeleton@TAG/text-censor.js

Replace @TAG with a release tag (e.g. @v0.1.0) once one exists — pinning to a tag means the file never changes under you; @main floats with the branch.