Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions bolt-slides/.bolt/skills/slides/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ This repo is a complete slide **studio**. Author content into it.

- `/` — in the Bolt preview iframe (and local Vite): studio. Side panel
(S) and grid (G) reorder / duplicate / delete; the dock holds notes,
Download (PDF or JSON), Present, and Presenter. Present opens a new
Download (PDF or JSON), Speaker view, and Present. Present opens a new
tab (`/?present=1`); the studio stays put. Grid selection is the
start slide. The published site at `/` is the audience deck (notes
stripped). **P** opens the presenter console in a new tab.
- `/?presenter=1` — presenter console (on-screen now, up next, notes
stripped). **P** opens speaker view in a new tab.
- `/?presenter=1` — speaker view (current slide, up next, notes
read-only, timer, note text size). `/present` is the same route.

**Your job is CONTENT.** A deck is `deck.json`. Write that file (and
Expand Down
6 changes: 3 additions & 3 deletions bolt-slides/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,11 @@ or Download as PDF / JSON.
## What's inside

- `/` — In Bolt this is the studio: canvas, side panel (S), grid (G),
and a floating dock (pager, notes, Download, Present, Presenter).
and a floating dock (pager, notes, Download, Speaker view, Present).
Present opens `/?present=1` in a new tab; the studio stays put.
Fullscreen is F in that tab. The published origin is the audience
deck. **P** opens the presenter console in a second tab.
- `/?presenter=1` — Presenter console: on-screen now, up next, notes
deck. **P** opens speaker view in a second tab.
- `/?presenter=1` — Speaker view: current slide, up next, notes
(read-only), timer, note text size. `/present` is the same route.

Collaborate by sharing the Bolt project.
Expand Down
4 changes: 2 additions & 2 deletions bolt-slides/src/deck/Dock.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -402,8 +402,8 @@ const Dock = forwardRef<HTMLDivElement, DockProps>(function Dock(
<button
type="button"
className="noir-icon-btn noir-optional"
title="Presenter — new tab (P)"
aria-label="Presenter — new tab (P)"
title="Speaker view — new tab (P)"
aria-label="Speaker view — new tab (P)"
onClick={onPresenter}
>
<IconPresent />
Expand Down
14 changes: 11 additions & 3 deletions bolt-slides/src/deck/Presenter.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
IconPlay,
IconPause,
IconStop,
IconStopwatch,
IconType,
} from './icons';

Expand Down Expand Up @@ -118,6 +119,7 @@ export default function Presenter({

const currentSlide = slides[slideIndex];
const nextSlide = slides[slideIndex + 1];
const timerIdle = !running && elapsed === 0;
const progress = slideCount > 1 ? (slideIndex / (slideCount - 1)) * 100 : 100;
const builds =
buildMax > 0
Expand All @@ -133,12 +135,18 @@ export default function Presenter({
</span>
<button
type="button"
className={'pres-icon' + (running ? '' : ' is-play')}
className={'pres-icon' + (!timerIdle && !running ? ' is-play' : '')}
onClick={() => setRunning((runningNow) => !runningNow)}
title={running ? 'Pause (T)' : 'Start (T)'}
aria-label={running ? 'Pause timer' : 'Start timer'}
>
{running ? <IconPause /> : <IconPlay />}
{timerIdle ? (
<IconStopwatch />
) : running ? (
<IconPause />
) : (
<IconPlay />
)}
</button>
<button
type="button"
Expand Down Expand Up @@ -213,7 +221,7 @@ export default function Presenter({

<div className="pres-body">
<section className="pres-stage">
<div className="pres-label">On screen now</div>
<div className="pres-label">Current slide</div>
<div className="pres-now">
{currentSlide ? (
<Thumb ctx={liveCtx}>{renderSlide(currentSlide)}</Thumb>
Expand Down
10 changes: 10 additions & 0 deletions bolt-slides/src/deck/icons.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,16 @@ export const IconPlay = () => (
</svg>
);

export const IconStopwatch = () => (
<svg {...base}>
<path d="M10 3h4" />
<path d="M12 3v3" />
<circle cx="12" cy="14" r="7" />
<path d="M12 14V11" />
<path d="M12 14l3.2 2" />
</svg>
);

export const IconPause = () => (
<svg {...base} fill="currentColor" stroke="none">
<rect x="7" y="5" width="3.6" height="14" rx="0.8" />
Expand Down
2 changes: 1 addition & 1 deletion bolt-slides/src/styles/base.css
Original file line number Diff line number Diff line change
Expand Up @@ -2403,7 +2403,7 @@ strong {
background: var(--ed-bg-secondary);
}

/* label above the box, exactly like "On screen now" — so both columns start
/* label above the box, exactly like "Current slide" — so both columns start
on the same line and their boxes align */
.pres-notes-col {
display: flex;
Expand Down