build(cli): add cross-compile release task and wire the version
Two pieces toward distributing the CLI as downloadable binaries.
Version: main.ts hardcoded .version("0.0.0"). Read it from
packages/cli/deno.json instead (imported as JSON, so it embeds in the
module graph and deno compile carries it into the binary), and bump
the manifest from the 0.0.0 placeholder to 0.1.0. The version now has
one source of truth and the binary reports it via --version.
compile:all: a new scripts/compile-all.ts cross-compiles every target
deno compile supports (x86_64/aarch64 linux, x86_64 windows,
x86_64/aarch64 macos) and writes sha256sum-compatible checksums to
dist/. It's a Deno script, not a shell loop, so it runs identically on
Windows/macOS/Linux CI. Targets can be filtered by arg
(deno task compile:all x86_64-pc-windows-msvc) for a single-platform
build; no args builds all five. Output is version-stamped
(morkdeck-<version>-<target>, .exe on Windows) and lands in the
already-gitignored dist/.
The per-target compile flags mirror the single-target compile task
(same permissions, --unstable-broadcast-channel, and the
--include asset directories) so release binaries behave identically to
a local deno task compile.
Note: this covers producing and checksumming the artifacts. Code
signing/notarization, the headless-Chrome runtime dependency for
mermaid, and hosting/install UX are still open and tracked separately.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
refactor(wc): redesign the presenter chrome end to end
The previous chrome was a single flex strip with `grid-template-columns:
1fr auto 1fr`, which sorted items by horizontal position rather than
by meaning. Four unlabeled time displays (elapsed, countdown, target,
clock) read as an undifferentiated row of MM:SS digits. The slide
counter wrapped to two lines. The exit button clipped at the right
edge. Icons were a mix of Unicode glyphs and Tabler SVGs.
This rebuild lands the chrome in its final shape:
Structure. Three free-floating overlay panels (Time, Navigate,
Status) on the presenter's base canvas, sharing the visual
language of the drawing toolbar (overlay background, hairline
border, radius.md). The Overlay tonal tier reads as "interactive
control surface"; the Surface tier is reserved for informative
content (notes, stage, sidebar). The chrome strip wraps the
panels with horizontal padding to redistribute the inter-panel
space.
Cell grid within each panel. Adjacent children get a
`border-left: 1px solid highlight.med` (the audience toolbar's
`.toolset > * + *` pattern). The slide counter is exempt; its
text-only natural height makes its border shorter than the
bordered buttons around it.
Labeled time cells. ELAPSED in the Time panel and CLOCK in the
Status panel render as two-line dashboard cells (small mono
uppercase label + tabular-numeral value). Cell width is locked to
`calc(5ch + 0.2em)` so the panel never reflows as digits tick.
Square icon buttons. `align-self: stretch` ties button height to
the panel content; `aspect-ratio: 1 / 1` locks width to height.
Icons sit centered at 1.2em.
Tabler icons everywhere. The remaining Unicode glyph buttons
(prev/next arrows, play/pause, refresh) are now proper Tabler
SVGs in the same outline-or-filled language as the existing
overview/exit/draw-tools icons.
Floating jumpback callout. Pulled out of the navigation cluster
entirely and anchored to the bottom-left of the stage when a
return slide is stored. Renders at stage scale in the link tier
for prominence, so the affordance actually captures attention
instead of getting lost as a tiny icon in a row of controls.
Layout in the chrome stays stable regardless of whether a
jumpback is set.
Countdown timer removed. The elapsed timer covers what most
presenters need; the countdown added permanent chrome noise
without enough function to justify it. The actor state machine's
countdown fields stay in place so it can be reintroduced later
without re-plumbing the runtime, but the UI and click-to-edit
target machinery are gone.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>