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 {