Reference

Changelog

Notable changes. Follows Keep a Changelog · the project is on semver.

0.6.0 · 2026-06-19

Added

  • Slide zoom. Ctrl/⌘ + wheel, trackpad pinch and +/-/0 magnify the active slide around the cursor and pan it (drag or wheel), fixed-canvas only, on by default. Scales fonts and layout together (no reflow). Opt out with no-zoom on <deck-root>.
  • Per-slide fluid escape. A single slide can carry its own fluid attribute to escape the fixed canvas and use the real viewport, while the rest of the deck stays on the canvas · for one slide that embeds a live interactive demo. The canvas is restored on navigation away.
  • Plugin hook API. <deck-root> exposes a public use(plugin) method and a DeckPlugin / DeckContext contract so plugins extend the deck through a stable surface instead of patching engine internals. setDeckCodeHighlighter() is the matching hook for <deck-code> syntax highlighting; all three are re-exported from dist/index.js.
  • Presenter multi-screen placement. With the Window Management API the deck goes fullscreen on the external screen (the projector) and the speaker window opens on the speaker's current screen, released when the presenter closes.
  • Preview (inert) mode. preview on <deck-root> renders and letterboxes a deck but wires no input, autoplay or presenter handlers · used so the presenter's Current preview acts as a control surface. A no-counter attribute hides the slide counter outright.

Changed

  • Presenter Current preview is a live control surface. Keyboard, click and wheel events on the Current preview are forwarded to the projected deck, with an opt-in advance-on-click. The preview renders the inert preview deck.
  • Slide counter is hidden on cover, overview and blank screens (in addition to the new no-counter opt-out).
  • Default slide typography scaled up for projection. Body, lead and heading sizes step up the type scale (body ≈32px on the 1080 canvas) in both shipped themes so text reads from the back of a room; the hierarchy stays monotonic.
  • Presenter Current/Next previews are constrained to 16:9, so the laptop thumbnail matches the projected slide's geometry regardless of window shape, and presenter mode auto-hides the projected window's key-hint chips and nav arrows while the speaker window is open.
  • Click-stages and Shiki plugins migrated to the hook API. They no longer monkey-patch prototypes. installClickStages() and installShiki() keep working as back-compat shims; a deck created dynamically after the call must register the plugin itself via deckRoot.use().

Fixed

  • Wheel navigation no longer swallows browser zoom. Ctrl/⌘ + wheel and trackpad pinch are left for the browser instead of being preventDefaulted for slide navigation.
  • Shiki-highlighted code keeps its colors. The vendored Shiki emits token colors as inline styles, so stripping them left every token monochrome · the palette is now preserved while the class="line" wrappers survive for step dimming.
  • Presenter places the speaker window on the right screen on the first press and closes its BroadcastChannel on teardown, so reopening no longer doubles forwarded input.

0.5.0 · 2026-06-12

This release reworks the rendering model. Every deck now renders into a fixed logical canvas scaled uniformly to fit the viewport, with an opt-in fluid mode for decks that should reflow like a web page, and embedded decks no longer disturb the page that hosts them.

Added

  • Opt-in fluid mode. <deck-root fluid> makes a deck fill its box and reflow like a web page · no logical canvas, no zoom-to-fit scale, no letterbox. It can be toggled at runtime; the default stays zoom-to-fit.
  • Playwright render net. A browser-level test suite (smoke, navigation, scaling, embedding) loads every fixture deck and asserts the engine upgrades, slides render, navigation works and the host page is left intact.

Changed

  • Uniform zoom-to-fit is now the default. Every deck renders into a fixed logical canvas (1920×1080 by default, set via width/height) scaled uniformly to fit, so a slide's layout is identical at any window size and letterboxed when the aspect differs. Author fluid layouts now opt in with fluid.
  • Embedded decks leave the host page alone. The global baseline (scroll lock, rem sizing) is scoped to full-page decks, so a <deck-root> inside a larger document no longer hijacks the page's scroll or typography.
  • Zoom-to-fit measures the deck's own box (via a ResizeObserver on the host, not the window), so an embedded deck scales to its container and re-fits on container resize.

Removed

  • The fixed attribute. Zoom-to-fit is now the only canvas mode, so fixed no longer has any effect and has been removed. Decks that still carry it render identically.

Fixed

  • Letterbox bands now match slides whose background has a zero blue channel (black, red, yellow). The opacity check parsed the blue channel as the alpha, so those slides wrongly fell back to the page surface for their bands.
  • The deck no longer leaves marks on the host page. Removing the last deck restores the page's scroll and rem baseline; changing width/height after first render re-fits the canvas; a deck moved or re-attached in the DOM keeps rescaling on resize.

0.4.0 · 2026-06-12

Added

  • Release tooling: npm run bump rewrites every version surface at once, backed by a Vitest suite (npm test) that fails when any surface drifts.
  • The docs now declare which release they document via a rikiki v<version> stamp.

Changed

  • The npm package now ships the LLM docs (llms.txt + docs/llms), so the reference is available after npm install rikiki-deck.

0.3.1 · 2026-06-09

Fixed

  • Presenter mode showed un-styled slides in single-file bundled decks (the mirror iframe failed to re-load the bundle from a data: URI). The presenter now inlines the bundle when served from a data URL.

0.3.0 · 2026-06-08

Added

  • Mouse navigation · click / Shift-click, scroll wheel (yields to scrollable content, advances at the edge), bottom-right chevrons, and mouse back/forward buttons. Tune with the mouse-nav attribute.
  • Click-stages plugin reveals (installClickStages()) · data-click, data-click-hide, data-click-auto, data-click-stagger, data-click-children, per-element data-anim*, and data-morph Magic Move (View Transitions, FLIP fallback on Firefox).
  • Overview grid (O) · viewport-faithful thumbnails (Mermaid diagrams included), type-to-filter search, click-to-jump.
  • Clickable hint chips · the bottom-left O P ? now run their action.

Fixed

  • Overview SVG styling · Mermaid thumbnails rendered black because cloned-SVG ids were namespaced but their <style> selectors were not. Diagrams now keep their styling.
  • Deep links clamp to the nearest valid slide/step instead of snapping to slide 1 (survives iterating with hot reload).
  • Wheel yields to scrollable descendants (including inline <svg>) and navigates at the scroll edge instead of trapping the wheel.
  • Click-stages edge cases · data-click-stagger="0" flips together, stagger children honor data-click-hide/data-anim-delay, no double delay, no flicker during a morph transition, unified step counting.

Changed

  • 2D navigation is opt-in via nav="2d" (was auto-enabled on any sectioned deck). Arrows stay linear by default.

0.2.0 · 2026-06-02

Added

  • Click-stages plugin · the first cut of per-element v-click-style reveals, opt-in via installClickStages().
  • Multi-file deck assembly · build/vite-deck.mjs stitches ordered .html/.md partials from a deck.config; a single .md splits on ---.
  • ?live opt-in · the core lazy-imports the livereload poller, watching the document's own stylesheets.
  • LLM-facing reference (docs/llms/rikiki-reference.md) and a rikiki-deck authoring skill.

Fixed

  • Presenter window showed slides unstyled; the bundle URL is now derived from import.meta.url.
  • deck-root no longer throws in a sandboxed / srcdoc iframe (guarded history.replaceState).

0.1.0 · 2026-05-21

Added

  • Initial public release.
  • 23 <deck-*> Web Components · 6 layouts (cover, section, hero, hero-detail, split, hook) and 17 atoms (md, code, callout, card, mermaid, stat, badge, metric, tier-list, step-list, kicker, stack, grid, punch, shortcut, kbd, plus root).
  • Two ship-ready themes · rikiki (tropical palette on dark) and siliceum (warm paper with a yellow accent). Each is fully token-driven · ~100 CSS custom properties.
  • 2D keyboard navigation · ←/→ between sections, ↑/↓ within a section, Space for linear, with linear fallback at boundaries so no arrow ever feels dead.
  • Path-style overview mode (O) à la reveal.js, one row per chapter, sub-slides flowing right.
  • Lazy-loaded modules · deck-overview.js and deck-help.js fetch on demand · -12 % on the initial bundle.
  • Live-reload helper (?live) · ~70 lines, no WebSocket, polls Last-Modified.
  • TypeScript-first sources · the framework is built from .ts with @customElement/@property decorators · consumer-side stays zero-build.

Performance budget

  • 11.3 KB gzip · dist/index.js (everything in one import)
  • 1.6 KB gzip · lazy overview module
  • 1.4 KB gzip · lazy help module
  • Lit + decorators externalized to jsdelivr (~21 KB gzip, cached across decks).