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

@taylordb/deck

v0.1.0

Published

React presentation runtime for TaylorDB apps: a fixed 1920x1080 canvas scaled to fit, click-steps derived from what is on screen, a themed primitive set, an overflow probe that reports broken slides as text, and a PDF exporter.

Readme

@taylordb/deck

A React presentation runtime on a fixed 1920×1080 canvas, scaled to fit whatever screen it plays on.

It is the runtime, the theme and the tooling — not your slides. Layouts are the part of a deck that changes per deck, so they stay in your app and reach the runtime through one renderSlide prop.

pnpm add @taylordb/deck
import '@taylordb/deck/styles.css'
import { Deck } from '@taylordb/deck'

;<Deck
  deck={deck}
  renderSlide={(slide) => <SlideRenderer data={slide} />}
  warnOnOverflow={import.meta.env.DEV}
/>

What it gives you

A canvas that cannot reflow. Author in absolute pixels; the stage is scaled and centred. There are no breakpoints, so a slide cannot look different on someone else's screen — it can only be too small to read, which is a decision, not a surprise.

Click-steps that count themselves. A step exists because a <Reveal at={n}> is mounted. Nothing declares a count and nothing can fall out of sync with one, so a CMS editor adding a bullet adds a click.

An overflow probe. A fixed canvas has no give: a headline three words too long is a broken slide, and it still renders. The probe measures every element against the slide's safe area and names the offenders — as text for taylor-deck check in CI, and as a red border live while somebody types.

A theme, not a straitjacket. Warm paper, ink text, one accent, a serif for display type. Every value is a CSS custom property in styles.css; redefine what you like after importing it. The primitives are conveniences — a slide is just a component, and raw JSX is always allowed.

API

| Export | | | ---------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | | Deck | The runtime. deck, renderSlide, and optionally tinaField, insetRight, warnOnOverflow, emptyLabel. | | Reveal / Stagger | Click-driven reveals. <Reveal at={2}>; delay staggers siblings within one step. | | useDeck / useStep / useTinaField | Runtime state inside a slide. | | SlideFrame / SlideHeader / Title / Kicker / Subtitle / Body / Bullets / TwoCol / Grid / Card / Stat / Quote / Spacer | Themed primitives. | | Rich | Renders *emphasis* as accented italic. Already applied inside the type primitives. | | Rings / Ruled / Photo | Full-bleed slide backgrounds. | | normalizeDeck / useEditorInset | In-page CMS glue. Neither imports a CMS. | | measureOverflow / useOverflowProbe | The probe, if you want to drive it yourself. | | present | Drops nulls from a CMS list. |

Two things to get right

warnOnOverflow must not reach a presented deck. Pass your bundler's dev flag. The runtime deliberately does not sniff one: import.meta.env.DEV is undefined outside Vite, which reads as not production and would paint a red border across a slide in front of an audience.

Mark full-bleed decoration data-bleed. It tells the probe that leaving the safe area is the point, and — just as important — excludes the subtree from the probe's mutation watch. Anything animating every frame inside the measured tree writes style continuously and postpones the measurement indefinitely.

taylor-deck

taylor-deck check     render every slide headless and fail on overflow
taylor-deck export    write export/slides.pdf plus per-slide PNGs at 2x

Both boot your deck through your own Vite config, so what they measure is what vite build would ship — and both render ?export=1, which is your app's signal to show the deck as committed, never whatever a CMS editor has open. A check that measured unsaved content would pass or fail for reasons that are not in the repository.

vite and playwright-chromium are optional peers, resolved from your project rather than from beside the CLI. Install the browser once:

pnpm add -D playwright-chromium && pnpm exec playwright install chromium

Developing against a local checkout

If you link: this package, add its peers to your app's Vite resolve.dedupe (react, react-dom, motion). A linked package resolves import 'react' against its node_modules, your app ends up with two Reacts, and every hook in the runtime throws.