Repository navigation
Releases: kadalcc/deck
Release list
Kadal Deck 0.4.1
Patch Changes
-
fa42a5d: Three code-toolkit follow-ups.
Magic move highlights. The inner fences of a
md magic-move block take highlight steps, Slidev's way:```ts {*|2|4-5} ```` lights all lines, then line 2, then lines 4–5, a click
each, before the next morph. Lines outside the step dim, on screen, in print (a page per step) and
in PPTX. The morph also animates again: without a{duration}the animation's timing was
"undefinedms" and every transition was switched off; it now uses the block's `{duration}`, else
the deck's `magicMoveDuration` (800 ms). Under `prefers-reduced-motion` the steps change at once.Code follows the theme menu. Picking another theme from the menu (T) now recolours code in
that theme's own Shiki pair (kadal.theme.shiki): plain blocks, notation marks, TwoSlash, magic
move and Monaco editors, in light and dark, on screen and in exports. The build highlights each
token once with every distinct Shiki theme the menu needs, as CSS variables, plus a few rules in
the deck's stylesheet; a deck whose menu shares one pair (the default menu) builds exactly as
before. A slide that forces a colour scheme now also gets that scheme's code colours (a light
slide in a dark deck used to keep the dark ones). The hosted shell's editors wear the deck's
theme too, not always GitHub's.Monaco types for imported packages.
{monaco}and{monaco-run}editors get the
declarations of the npm packages they import, so hovers, completions and errors are the
package's own: bundled from the deck's node_modules bykadal-deck build(offline), else fetched
from jsDelivr (only declaration files, the ones the imports reach, within size limits, cached in
the browser).monacoTypes: auto | local | cdn | none,monacoPackages(names, or versions to
pin),monacoTypesIgnore; Slidev'smonacoTypesSource,monacoTypesAdditionalPackagesand
monacoTypesIgnorePackagesare read too, and the importer carries them over. Offline with
nothing cached, editors behave as before. A{monaco-run}bare import (import { z } from "zod") now loads from esm.sh at the pinned version (monacoRunImports: another CDN or template,
orfalsefor the old error). -
1c4dc5e: Slidev's authoring leftovers, natively:
- Comark (formerly MDC) syntax, opt-in with
comark: true(or Slidev'smdc: true), in both the Vite plugin and the in-browser compiler::badge[New]{tone="good"}inline components,[text]{.class style="…"}spans,{…}after bold, code, links and images, and::name{props}…::blocks with YAML props,#slotsections that arrive as props, and nesting by colons.::right::slot markers,::code-groupand MDX{expressions}keep their meaning;kadal-deck checkchecks Comark components like JSX ones, andkadal-deck import slidevnow carriescomark: trueover instead of reporting it. custom-nav-controlslayer:custom-nav-controls.tsxbeside deck.mdx (or a theme's or addon'slayers) adds buttons beside the controls in play and to the presenter's toolbar. Slidev'scustom-nav-controls.vueimports to it.<ClickCount>anduseClicks(): the slide's click count (Slidev's$clicks), withwhen={(c) => c > 2}for click-dependent content. The importer maps{{ $clicks }},$clicksContext.current/totalandv-if="$clicks > n"chains to it.- Dragged positions sync live: a
<Drag>or<DragArrow>moved underkadal-deck devfollows in every other open window (presenter, second screen, projector) as it moves, with no reload. - Pages of the deck's own:
routes.tsxbeside deck.mdx (orsetup/routes.ts),<Deck routes>, a package'sroutesorapi.addRoute()add pages at<base><path>inside the deck's providers, with:params; the build copies index.html to each plain path for static hosts.
- Comark (formerly MDC) syntax, opt-in with
-
@kadal/prettier-plugin@0.4.1
Packages
@kadal/deck@0.4.1@kadal/create-deck@0.4.1@kadal/deck-angular@0.4.1@kadal/deck-fresh@0.4.1@kadal/deck-preact@0.4.1@kadal/deck-python@0.4.1@kadal/deck-qwik@0.4.1@kadal/deck-solid@0.4.1@kadal/deck-svelte@0.4.1@kadal/deck-vue@0.4.1@kadal/deck-wasm@0.4.1@kadal/prettier-plugin@0.4.1@kadal/theme-brand@0.4.1@kadal/theme-bricks@0.4.1@kadal/theme-classic@0.4.1@kadal/theme-crayon@0.4.1@kadal/theme-crisp@0.4.1@kadal/theme-folio@0.4.1@kadal/theme-lecture@0.4.1@kadal/theme-neon@0.4.1@kadal/theme-ocean@0.4.1@kadal/theme-seriph@0.4.1
Published from release.yml through npm trusted publishing, with provenance.
npm create @kadal/deck@latest my-talk # a new deck
npm install @kadal/deck@0.4.1 # or upgrade oneKadal Deck 0.4.0
Minor Changes
-
e08452a: Build and hosting, on par with Slidev and past it:
- The built page's head comes from the headmatter: title,
infoas the description, author,lang,favicon, andseoMetawith Slidev's names (Open Graph, Twitter cards, canonical, theme-color, any other meta tag). The runtime keeps the document's head in step, so decks the hosted player compiles get them too. seoMeta.ogImage: autophotographs slide 1 intoog-image.png(1200×630) duringkadal-deck build; a committedog-image.pngor a path is used instead, and a build without Playwright skips it with a message.pwa: true(orbuild --pwa) makes the deck an installable app that presents offline: a manifest, icons in the theme's colours (or your favicon), and a small service worker that saves the whole build, says when it is ready, and offers a new version with a Reload button instead of reloading mid-talk. It never answers the live room, the host's/api, the dev endpoints or the phone remote, and never runs in dev;publishleaves it out unless--pwa.bundleRemoteAssets: true(or--bundle-remote-assets; Slidev'sremoteAssetstoo) downloads remote images, video, Google/Bunny Fonts and CSSurl()s into the build, cached between builds, so a deck needs no network at all.kadal-deck build a.mdx b.mdxbuilds several decks into their own folders with a page listing them;--outnames the folder, and--basenow reaches--download's PDF step too.- Every build copies index.html into each route's folder and writes
404.htmland_redirects, so/presenter,/notesand/remotework on GitHub Pages, S3 or nginx without rewrites. - New commands:
kadal-deck serveserves a build as a static host would (its base, routes, Range requests, cache headers), andkadal-deck ci <github-pages|netlify|vercel|cloudflare|docker>(ornew --ci) writes that host's deploy files for the deck. kadal-deck checkwarns about a missingfaviconorogImagefile and anog:imagethat will not be a full URL.
- The built page's head comes from the headmatter: title,
-
f78ff3e: The developer-talk code toolkit:
- Notation marks.
// [!code ++],[!code --],[!code highlight],[!code focus],[!code error]/[!code warning]and[!code word:x]at the end of a line mark it, in light and dark, alongside click-stepped highlights.deck({ shiki: { transformers } })adds your own Shiki transformers, in the Vite plugin and in the browser compiler. - Code groups.
::code-group…::(or<CodeGroup>) turns titled fences into tabs with file-type badges, keyboard and screen-reader friendly;{clicks:true}turns tabs on clicks,{print:'all'}prints every tab. - Snippet imports.
<<< @/snippets/x.ts#region {2|4} [x.ts]puts a file, or one#regionof it, on a slide; the file is watched in dev, and the hosted shell fetches it from beside deck.mdx. - TwoSlash.
```ts twoslashshows type hovers (also by keyboard), compiler errors and// ^?queries, computed at build time (needstypescript); the hosted shell renders such blocks plain. - Monaco.
{monaco}editors,{monaco-diff}diffs,{monaco-run}with a Run button and the output on the slide (JavaScript and TypeScript in a Web Worker with a timeout, Python in Pyodide, any language throughregisterCodeRunnerorsetup/code-runners.ts), and{monaco-write}that saves edits back to the file inkadal-deck dev. Monaco is a lazy chunk, bundled (no CDN), never in the main bundle; print, export and the phone remote show the highlighted code and the run's output. kadal-deck checkknows all of the above: missing snippet files and regions, unknown code options, a diff without its~~~, a run block with no runner.- Fix: the pause curtain and the confetti layer no longer swallow pointer events over the whole slide.
- Notation marks.
-
e42ad6a: Slidev's built-in components, and every icon.
- Any Iconify icon:
<Icon name="mdi:account" />, or Slidev's tag form<mdi-account />,<logos-vue class="text-3xl" />(and UnoCSS's<div class="i-carbon-logo-github" />). Lucide names keep working.kadal-deck devandbuildbundle the drawings from the deck's own@iconify-json/<set>(or@iconify/json) packages, so a built deck needs no network; the hosted player fetches them from the Iconify API once and keeps them, and shows a dashed box offline.kadal-deck checknames a misspelt icon (with the nearest names) and the set to install. - Elements placed by hand:
<Drag pos="x,y,w,h,rotation">or<Drag pos="name">withdragPos:in the slide's frontmatter, and<DragArrow pos="x,y,dx,dy" />; Slidev'sv-drag,<v-drag>and<v-drag-arrow>compile to them. Inkadal-deck dev, double-click one to move, resize, turn and nudge it with the arrow keys; the position is saved into deck.mdx and nothing else in the file changes, without reloading the page. <Mark>draws every rough-notation type — underline, box, circle, highlight, strike-through, crossed-off and bracket — as a hand-drawn stroke on its click, withstrokeWidth,padding,iterations,multiline,brackets,duration,delayandopacity. The wobble is the same on every screen and in the PDF.<Switch>with<Case>s shows one block per click (Slidev's v-switch), in one spot so nothing below jumps.<Video>follows the clicks:at,pauseAt,steps(play, pause, rewind or jump at a click), plus Slidev'sautoplay="once",autoreset,timestamp,printPosterandprintTimestamp; inside a<Click>it starts when revealed.<LightOrDark>,<RenderWhen context>,<SlideCurrentNo>,<SlidesTotal>,<TitleRenderer>and<BlueSky>(a Bluesky post in the deck's colour scheme, with export posters).
- Any Iconify icon:
-
479e4ae: Drawing tools, saved drawings, the camera on the slide, and a better recorder.
- Shapes and an eraser: the pen's toolbar now has line, arrow, rectangle and ellipse (hold Shift to keep a line at 45° steps, a rectangle square, an ellipse round; arrowheads grow with the stroke), an eraser that takes whole strokes or, with the scissors on, cuts only where it passes, redo next to undo, any colour, and more widths. While the pen is on, 1–7 pick the tools, E toggles the eraser, [ and ] change the width, Ctrl Z undoes and Ctrl Shift Z (or Ctrl Y) redoes — strokes, shapes, erases and clears alike. A stylus's eraser end erases. The phone remote's pen has the same shapes, the eraser and redo.
- Drawings shared between windows: what you draw in the presenter view shows on the play view and any shared window in the same browser at once, with or without a live room. Shapes travel through the room like strokes.
- Saved drawings:
drawings: { persist: "files" }writes pinned drawings todrawings/<slide>.svgbeside deck.mdx while you runkadal-deck dev. Files indrawings/are shown under the live strokes, are bundled bykadal-deck build(so hosted and published copies have them), and are printed, so PDF, PNG, PPTX and the/exportpage include them. Ordinary SVGs work too — a Slidev drawing loads.drawings: { perClick: true }ties each stroke to the click step it was drawn on.drawings: { enabled: "dev" }turns the pen on only on the dev server. - Camera on the slide: V (or the presenter's Camera button) shows your camera in a bubble on the slide itself — on the play view, any shared window and the presenter's preview at once — so a recording or a screen share has you in it. Drag it, resize it from its corner, make it a circle, a rounded box or a rectangle, mirror it or not; it is remembered per deck and never printed. The arrow beside Camera picks the camera and microphone.
- Recording: record the screen with your voice, the camera alone, or both as two separate files; pause and resume, a clock, WebM or MP4 where the browser supports it, the shared tab's sound mixed in, and clear file names. WebM recordings now carry their duration, so players show the length and can seek.
-
62d24fc: Export, in depth.
- Editable PowerPoint:
kadal-deck export --format pptx-editablerebuilds every slide as native PowerPoint objects — text boxes with their fonts, sizes, colours, bold/italic/underline/strike and links; lists with real bullets, numbering and levels; rectangles, rounded rectangles and ellipses with fill, border and shadow; pictures as the original files (cropped as the slide crops them); tables as tables; code as coloured monospace text. Whatever PowerPoint cannot draw (SVG, canvas, maths, diagrams, gradients, filters, decorations) is placed as a picture exactly where it stood, so nothing is lost. Speaker notes are attached. - Markdown:
--format mdwrites a.mdfile with a picture of every page and each slide's notes under it. - PDF bookmarks and metadata: the PDF now opens with an outline built from the slide titles (vertical stacks and
levels nested;--no-with-tocturns it off) and carries the deck's title, author and description. - Flags on every format:
--format,--range 1,3-5,--dark/--scheme,--with-clicks/--no-with-clicks,--omit-background(transparent pages),--per-slide,--timeout,--wait,--wait-until,--executable-path,--output,--port. Slidev's spelling (--with-clicks false) works too. - The browser exporter at
/export: every deck, hosted ones included, can be saved as a PDF (the browser's print), a zip of PNGs, an image PowerPoint file or Markdown, with a live preview, a range, click steps, colour scheme, notes, picture size, a transparent background, progress and Cancel — no Playwright needed. - A Download button:
download: truein the headmatter shows one beside the theme menu and makeskadal-deck buildprintdist/deck.pdffor it (kadal-deck build --downloaddoes it without the key); without a built PDF it opens/export.download: "talk.pdf"links a file of your own. Hosts can switch it off or point i...
- Editable PowerPoint:
Kadal Deck 0.3.6
Patch Changes
-
ebebf60: The ad frame. When the host's override says
ads, the play view frames the deck's first and last slides:- On a landscape screen: the slide keeps its shape at 80% of its usual size, flush top-left. A tall ad takes the right-hand column, a wide ad the bottom row, and a QR code the corner, with no letterboxing.
- On a phone or portrait window: the slide spans the top and the ads stack below it.
- Controls: the arrows, slide number and progress bar move inside the slide's area, so none sits over an ad.
The host answers
GET {api}/decks/{room}/adswith what to show. Every link is the host's own tracked redirect, and only https links or paths on the host are followed. The engine reports each showing withPOST {api}/decks/{room}/ads/seen. The frame never appears in the presenter view, the phone remote, the audience page, the overview, or print and its exports. Self-hosted decks have no frame. -
7b95627: Free-plan watermark. When the host marks a deck as free-plan (the existing
badgeoverride), every slide carries a small "Made with Kadal Deck" mark in its top-right corner. It is part of the slide, so it scales with it and appears everywhere the slide is drawn: the live deck, the presenter's previews, the overview, thumbnails, and every export made from the print view (PDF, PNG, PPTX). In a PDF the mark stays a link. It replaces the old corner link, which showed only in the play window and was left out of exports. Self-hosted decks, and decks on paid plans, have no mark. -
19a5946: The presenter's room panel is now a sidebar with tabs, and redesigned:
- Room: the join QR sits on white with the link under it. The link wraps at its slashes instead of running off the edge, and has a Copy button. Below it: a Live / Connecting / Offline pill, tiles for watching, hands up and reactions, a pace gauge that says which way the audience leans, and reaction chips.
- Questions: cards with a vote count and icon buttons to mark answered or delete.
- Polls: cards with Open and Close buttons.
- Empty states: each tab says what will appear there.
- Narrow columns: the tabs not shown fold to icons.
New
deck.panelsregistry: a host can add its own tab to the sidebar (register({ id, title, icon, mount(el) }),open(id)). A panel is mounted the first time its tab is shown and kept through tab switches and folding. deck.kadal.cc uses it for the Copilot, which no longer floats over the presenter view.
Packages
@kadal/deck@0.3.6@kadal/create-deck@0.3.6@kadal/deck-angular@0.3.6@kadal/deck-fresh@0.3.6@kadal/deck-preact@0.3.6@kadal/deck-python@0.3.6@kadal/deck-qwik@0.3.6@kadal/deck-solid@0.3.6@kadal/deck-svelte@0.3.6@kadal/deck-vue@0.3.6@kadal/deck-wasm@0.3.6
Published from release.yml through npm trusted publishing, with provenance.
npm create @kadal/deck@latest my-talk # a new deck
npm install @kadal/deck@0.3.6 # or upgrade oneKadal Deck 0.3.5
Patch Changes
- 8cc9f68: A deck with a presenter view now always serves the phone remote. Decks made before the remote existed passed only the presenter, audience, notes and stats pages to
<Deck pages>. The presenter still showed the remote's QR code, and scanning it opened "This deck was built without the remote page". Whenpages.remoteis missing, the engine now uses its own remote page. It is loaded in a separate chunk, only when a phone opens/remote, so the deck itself doesn't grow. A deck that passes its own remote page is unchanged. - 13647a8:
export.thumbnailno longer hangs when the page is in a background tab or a hidden window. It used to wait for the browser to draw a frame, and a hidden page draws none, so publishing from a tab you had just left saved no picture. Every later picture in that visit also queued behind the stuck one. Now a picture goes ahead without waiting for a frame. If one still takes more than 30 seconds, it fails and the next one runs.
Packages
@kadal/deck@0.3.5@kadal/create-deck@0.3.5@kadal/deck-angular@0.3.5@kadal/deck-fresh@0.3.5@kadal/deck-preact@0.3.5@kadal/deck-python@0.3.5@kadal/deck-qwik@0.3.5@kadal/deck-solid@0.3.5@kadal/deck-svelte@0.3.5@kadal/deck-vue@0.3.5@kadal/deck-wasm@0.3.5
Published from release.yml through npm trusted publishing, with provenance.
npm create @kadal/deck@latest my-talk # a new deck
npm install @kadal/deck@0.3.5 # or upgrade oneKadal Deck 0.3.4
Patch Changes
-
5e52261: The narration timeline only moves forward while it plays, and reaches the end when the talk ends. Before, it jumped back for a moment at every new slide and stopped short of 100%.
Every slide now has a small point on the timeline, and the chapter points stay. Hovering anywhere on the timeline shows a small picture of the slide.
On the phone remote, the slide preview no longer picks up the remote's own dark styles, so code blocks and poll options look as they do on the big screen. In pen mode, Undo and Clear take the place of the "Hold to point" button, so the notes are no longer squeezed.
New
export.thumbnailcommand: it returns a PNG of one slide.kadal-deck publishnow sends the host a picture of slide 1 after it publishes; use--no-thumbnailto skip it. A picture that can't be made never fails the publish.checkand the builder now warn when a slide starts with settings such asbackground: spotlightbut has no closing---. Without it, those lines show on the slide as text.
Packages
@kadal/deck@0.3.4@kadal/create-deck@0.3.4@kadal/deck-angular@0.3.4@kadal/deck-fresh@0.3.4@kadal/deck-preact@0.3.4@kadal/deck-python@0.3.4@kadal/deck-qwik@0.3.4@kadal/deck-solid@0.3.4@kadal/deck-svelte@0.3.4@kadal/deck-vue@0.3.4@kadal/deck-wasm@0.3.4
Published from release.yml through npm trusted publishing, with provenance.
npm create @kadal/deck@latest my-talk # a new deck
npm install @kadal/deck@0.3.4 # or upgrade oneKadal Deck 0.3.3
Patch Changes
-
1cabea4: A clearer autoplay (narration) bar.
- The timeline marks chapters, not every slide: a point at each
layout: sectionslide (or at each column when a deck has no sections). Points fill in as the talk passes them, and the current one stands out. Hovering a point names the chapter, its slides and when it starts. Hovering anywhere else names the slide and its time. A click plays from there. From the keyboard, the arrow keys move a slide, Page Up/Down (or Shift+arrows) a chapter, and Home/End go to the ends. - Speed, voice and engine are the engine's own lists instead of the browser's selects, so they match every theme in light and dark. Voices are grouped (Kokoro, this browser), each option says what it is, and an engine that isn't installed shows as unavailable. They work with the keyboard: arrows, Home/End, typing to find, Enter, Escape.
- A slimmer volume slider and evenly sized controls: playback and position on the left, settings on the right. Labels fold away on narrower screens, and on a phone the bar fits in two rows.
- The phone remote's "Pointer" setting uses the same list, sized for a thumb.
- The timeline marks chapters, not every slide: a point at each
Packages
@kadal/deck@0.3.3@kadal/create-deck@0.3.3@kadal/deck-angular@0.3.3@kadal/deck-fresh@0.3.3@kadal/deck-preact@0.3.3@kadal/deck-python@0.3.3@kadal/deck-qwik@0.3.3@kadal/deck-solid@0.3.3@kadal/deck-svelte@0.3.3@kadal/deck-vue@0.3.3@kadal/deck-wasm@0.3.3
Published from release.yml through npm trusted publishing, with provenance.
npm create @kadal/deck@latest my-talk # a new deck
npm install @kadal/deck@0.3.3 # or upgrade oneKadal Deck 0.3.2
Patch Changes
- 11979f8: Zoom reaches the projector on a hosted deck. The presenter's zoom (Alt+click, or the phone remote's Zoom) now travels through the room like the spotlight. The projector window and every audience screen that follows the presenter zoom with it, and a screen browsing on its own keeps its own view. Before, it only zoomed the presenter view. Needs the matching room (deck.kadal.cc has it).
Packages
@kadal/deck@0.3.2@kadal/create-deck@0.3.2@kadal/deck-angular@0.3.2@kadal/deck-fresh@0.3.2@kadal/deck-preact@0.3.2@kadal/deck-python@0.3.2@kadal/deck-qwik@0.3.2@kadal/deck-solid@0.3.2@kadal/deck-svelte@0.3.2@kadal/deck-vue@0.3.2@kadal/deck-wasm@0.3.2
Published from release.yml through npm trusted publishing, with provenance.
npm create @kadal/deck@latest my-talk # a new deck
npm install @kadal/deck@0.3.2 # or upgrade oneKadal Deck 0.3.1
Patch Changes
-
bc47947: Phone remote: one phone at a time, paired by a code that keeps changing, and the air pointer on iPhone.
- The QR holds a one-time pairing code, not the presenter's ticket. It changes every 30 seconds while the dialog is open (each code works for a minute), so a photo of the screen is soon worthless.
- The newest phone to scan becomes the remote; any other is disconnected and says "Another phone took over as the remote." A paired phone keeps a lease for its tab, so a reload or a dropped connection reconnects without scanning again.
- Disconnect drops the phone even while it is offline, voids its lease and changes the code.
- iPhone: the air pointer asks for motion with a tap ("Tap to allow motion · then hold to point"). iOS only shows its prompt from a tap; asked on the press that starts a hold, it refused without asking ("Motion access was not allowed").
- Rooms need the matching server (deck.kadal.cc has it). Against an older room the QR falls back to the presenter ticket.
Packages
@kadal/deck@0.3.1@kadal/create-deck@0.3.1@kadal/deck-angular@0.3.1@kadal/deck-fresh@0.3.1@kadal/deck-preact@0.3.1@kadal/deck-python@0.3.1@kadal/deck-qwik@0.3.1@kadal/deck-solid@0.3.1@kadal/deck-svelte@0.3.1@kadal/deck-vue@0.3.1@kadal/deck-wasm@0.3.1
Published from release.yml through npm trusted publishing, with provenance.
npm create @kadal/deck@latest my-talk # a new deck
npm install @kadal/deck@0.3.1 # or upgrade oneKadal Deck 0.3.0
Minor Changes
-
1af5183: Commands: everything a person can do to a running deck is now a command in one registry —
deck.commands(andwindow.__deck.commands), with stable ids (nav.next,present.blackout,
draw.shape,deck.slide…), descriptions, and zod parameters exported as JSON Schema. The
keyboard runs through it, so a phone remote or an AI agent can do exactly what the keys and
buttons do. New commands aim the laser (present.laserAt), drive the pen from a touchpad
(draw.pen), mark a region (draw.shape: circle, box, underline, arrow), zoom to a point, and
read the deck (deck.state,deck.outline,deck.slide,deck.search). The manifest now
carries each slide's speaker notes as plain text (notesText).useCommandregisters your own. -
e960d13: Narration: rehearse with the deck reading its own notes. Each
[click]part of a slide's
<Notes>is spoken at its step, then the deck turns the page withnav.next— through the
command registry, so the presenter window, a projector and the room follow. A bar at the bottom
of the presenter view (and on the deck behind?narrate, or the newRkey) has prev / play /
next / stop, speed, mute and volume, voice and engine menus, "follow the narrator", and a
timeline with a mark per slide to seek. Every control is anarrate.*command.Three voices behind one interface, picked per segment: baked clips from the new
kadal-deck narrate(Kokoro-82M on the CPU, MP3/Opus via ffmpeg or WAV, indexed by SHA-256 in
public/narration.json), Kokoro-82M in the browser in a Web Worker (WebGPU fp32 or WebAssembly
q8, downloaded on the first play and cached), and the browser'sspeechSynthesis. Kokoro needs
kokoro-js, a new optional peer dependency (kadal-deck narrate --setupinstalls it); without it
nothing of it is built. Config:narration: { enabled, engine, voice, rate, gap, silent, model, dtype }; slide frontmattersay:andnarration: false. Licences of the pieces it reaches for,
including eSpeak NG (GPL-3.0-or-later) inside the phonemizer, are inTHIRD_PARTY_NOTICES.md. -
2473f77: Phone remote: the presenter view's new Phone remote button shows a QR, and the phone that
scans it becomes a one-handed remote at/<slug>/remote(RemotePagefrom
@kadal/deck/remote; addremote: RemotePageto<Deck pages>). It shows a live copy of the
current slide, rendered by the deck's own components. Touch the slide to aim the laser or the
spotlight, draw on it with the pen, or tap to zoom. Hold the air-pointer button and move the
phone to point (DeviceOrientation with iOS's permission prompt, or a Gyroscope where there is one,
smoothed by a One Euro filter). It also has next and back (or a swipe), blackout, focus labels, a
slide list, the notes for the current click step, the timer with pacing, buzzes at chosen
minutes, haptic ticks and a screen wake lock. Everything it does runs as a command in the
presenting window.With a room, the phone is a presenter socket holding the ticket from the QR's fragment. The
protocol gainscommand,command:result,remote:state,remote:kickandremote:bye, plus
validators. Without a room,kadal-deck devrelays it over the dev server's HMR socket with a
pairing code.kadal-deck dev --httpsserves a self-signed certificate so phones get motion
sensors. In the presenter view without a room, the laser now shows on the current slide, and the
remote's laser, ink and zoom reach the play window. -
71ad8e8: The presenter gate follows the host: when it says the deck has no passcode (
passcode: false) the
gate stops asking for one, and when it gives asignInURL it offers "Sign in as the author" —
on its own, or below the passcode field. Only http(s) links are followed. -
2d862df: Decks without a build.
@kadal/deck/runtimecompiles a deck from its text in the browser —
the same remark/rehype passes, Shiki highlighting, notes, magic move and glossary as the Vite
plugin (both now sharecompiler/pipeline.ts) — and returns diagnostics with lines instead of
throwing. The new@kadal/deck-shellpackage is one prebuilt static page that runs any
deck.mdxserved beside it, under any path; with?previewit is an editor's live iframe,
speaking a smallpostMessageprotocol (source in; diagnostics, outline, position, command
results and picked points out).<Deck base>sets the URL root explicitly. Slides compiled
this way use the engine's components and cannotimport.
Patch Changes
- ac41497: A deck compiled again in the same page (an editor's live preview) now shows the new slides: the
slide-module cache is keyed by each manifest entry's loader instead of the slide's index.
Packages
@kadal/deck@0.3.0@kadal/create-deck@0.3.0@kadal/deck-angular@0.3.0@kadal/deck-fresh@0.3.0@kadal/deck-preact@0.3.0@kadal/deck-python@0.3.0@kadal/deck-qwik@0.3.0@kadal/deck-solid@0.3.0@kadal/deck-svelte@0.3.0@kadal/deck-vue@0.3.0@kadal/deck-wasm@0.3.0
Published from release.yml through npm trusted publishing, with provenance.
npm create @kadal/deck@latest my-talk # a new deck
npm install @kadal/deck@0.3.0 # or upgrade oneKadal Deck 0.2.2
Patch Changes
- 524ff4b:
kadal-deck exportmakes a PDF that looks like the deck in every viewer. The browser's printer turned CSS effects into PDF features that viewers draw differently: Glass cards came out filled with their edge gradient, Preview and Quick Look painted grey slabs wherever a blurred shadow fell, and gradient text picked up hairlines. Now each page is a picture of the slide with its text hidden, with the text printed over it as text, so it stays sharp at any zoom and can still be selected and searched. The PDF is also about a third of the size.--vector-pdfprints with the browser alone, as before. - 2d5f6da: Posters of maps show the map.
kadal-deck exportphotographed embedded pages on software WebGL (SwiftShader), where a map is so slow that in ten seconds it had fetched almost none of its tiles, so the poster was the markers floating over an empty grid. Posters are now taken on the machine's GPU when it has one (SwiftShader remains the fallback, as on CI), only after the page's requests have gone quiet, and at 2× so they stay sharp in the PDF.
Packages
@kadal/deck@0.2.2@kadal/create-deck@0.2.2@kadal/deck-angular@0.2.2@kadal/deck-fresh@0.2.2@kadal/deck-preact@0.2.2@kadal/deck-python@0.2.2@kadal/deck-qwik@0.2.2@kadal/deck-solid@0.2.2@kadal/deck-svelte@0.2.2@kadal/deck-vue@0.2.2@kadal/deck-wasm@0.2.2
Published from release.yml through npm trusted publishing, with provenance.
npm create @kadal/deck@latest my-talk # a new deck
npm install @kadal/deck@0.2.2 # or upgrade one