A thin bar across the top that fills as you read: it uses `scaleX` driven by a scroll-linked animation, so it moves on the compositor with no scroll listener at all, and a small percentage pill at its end shows the number. Browsers without scroll timelines fall back to a rAF listener.
`.sc { scroll-timeline: --dm-read y }`, `#scroll { timeline-scope: --dm-read }` (so the bar can live outside the scroller and stay put) and `.bar { transform-origin: left; animation: grow linear both; animation-timeline: --dm-read }` with `@keyframes grow { from { transform: scaleX(0) } to { transform: scaleX(1) } }`; the pill reads `scrollTop / (scrollHeight − clientHeight)` from a passive listener and sits at the bar's end via the same ratio. When named scroll timelines are unsupported the listener also sets the bar's transform.
From prompt to a block in your page.
The preview is the shipped element inside a neutral demo page. Hover, click, focus: the one interaction it is about is live.
Token sets re-tint it live. The prompt carries the one you chose.
A paste-in snippet, or a component for Next.js, React, Vue, Astro, WordPress, Shopify or Webflow.
It quotes the markup, styles and script verbatim with the tokens and the rules that keep it self-contained.
It inherits your page's font and width; the tokens live on :root; several instances share one script.