Skip to content

Your first deck

A deck is an ordered list of slide modules handed to <Present>. Each module’s default export is the slide; an optional notes export shows in the presenter view.

slides/01-intro.tsx
import { Step } from "@liebstoeckel/engine";
export const notes = (
<div>
<p>Open strong. Reveal each point with <kbd></kbd>.</p>
</div>
);
export default function Intro() {
return (
<div className="w-full">
<h1 className="font-heading text-7xl font-semibold text-text">
Decks that <span className="italic text-primary">talk back</span>.
</h1>
<div className="mt-8 space-y-3 font-body text-2xl text-muted">
<Step>Plugins are real Bun packages.</Step>
<Step>State is shared live over a CRDT.</Step>
</div>
</div>
);
}

Register them in order:

main.tsx
import Intro from "./slides/01-intro";
import Agenda from "./slides/02-agenda.mdx";
<Present brands={["liebstoeckel"]} slides={[Intro, Agenda]} />

Wrap anything in <Step> to reveal it on the next press. Steps reveal in document order; once the last step is shown, the next press advances the slide.

<Step>First this…</Step>
<Step>…then this.</Step>

The presenter view shows a prominent step counter so you always know whether a press will reveal or advance.

Export notes (plain JSX) from a slide module. The presenter window renders it in a styled panel alongside the current/next slide previews and a timer.

export const notes = (
<div>
<p>Key point. Then mention the <strong>demo</strong>.</p>
<ul><li>Press <kbd>Q</kbd> to show the QR.</li></ul>
</div>
);

<Magic> morphs one slide’s element into the next slide’s element with the same id. Motion FLIP-animates position and size and crossfades the content. Declare each one inline on its slide; the two can differ (text → text, small → large), so it’s true Keynote-style Magic Move.

import { Magic } from "@liebstoeckel/engine";
// On slide 1:
<Magic id="logo" className="text-4xl"></Magic>
// On slide 2, same id, new place/size (and even new content) → it morphs there:
<Magic id="logo" className="text-8xl absolute top-10 right-10"></Magic>

Comments

liebstoeckel

Code-first presentations your agent can author. One file out, no server.

© 2026 Leon Kaucher