From a7c3cc7d689b13c5bb96559f9bad713205edb194 Mon Sep 17 00:00:00 2001 From: Vance Ingalls Date: Thu, 2 Jul 2026 10:07:35 -0700 Subject: [PATCH] fix(slideshow): make presenter mode work over Google Meet/Zoom screen share Fix slideshow presenter mode for screen-share workflows by opening the audience view as a regular noopener tab, preserving audience query construction across fragments, and keeping iframe keyboard forwarding diagnosable. --- packages/cli/src/commands/present.ts | 59 ++++--- .../slideshow/hyperframes-slideshow.test.ts | 162 +++++++++++++++--- .../src/slideshow/hyperframes-slideshow.ts | 136 ++++++++++++--- skills-manifest.json | 2 +- skills/slideshow/SKILL.md | 11 +- 5 files changed, 288 insertions(+), 82 deletions(-) diff --git a/packages/cli/src/commands/present.ts b/packages/cli/src/commands/present.ts index c96675adc..edd974aff 100644 --- a/packages/cli/src/commands/present.ts +++ b/packages/cli/src/commands/present.ts @@ -98,6 +98,17 @@ export default defineCommand({ return; } const islandJson = islandMatch[1].trim(); + // Malformed island JSON makes the slideshow component render no chrome at + // all (no Present control, P key dead) — fail loudly here instead. + try { + JSON.parse(islandJson); + } catch (err) { + clack.log.error( + `Slideshow island in ${project.indexPath} is not valid JSON: ${(err as Error).message}`, + ); + process.exitCode = 1; + return; + } const { Hono } = await import("hono"); const { createAdaptorServer } = await import("@hono/node-server"); @@ -152,7 +163,15 @@ export default defineCommand({ console.log(` ${c.dim("Deck")} ${c.accent(project.name)}`); console.log(` ${c.dim("Present")} ${c.accent(url)}`); console.log(); - console.log(` ${c.dim("Click ▶ Present (or press P) to open the audience display.")}`); + console.log( + ` ${c.dim("Click the Present control (or press P) to open the audience display.")}`, + ); + console.log( + ` ${c.dim('Google Meet: share the AUDIENCE tab ("Share screen → A tab"), not a window or your whole screen.')}`, + ); + console.log( + ` ${c.dim("Zoom desktop: drag the audience tab into its own window and share that window (keep it at least partly visible).")}`, + ); console.log(` ${c.dim("Press Ctrl+C to stop")}`); console.log(); @@ -175,18 +194,18 @@ function buildPresentPage(projectName: string, islandJson: string): string { ${escHtml(projectName)} — Presenter + @@ -198,28 +217,8 @@ function buildPresentPage(projectName: string, islandJson: string): string { ${islandJson} - - +