@honeydeck/honeydeck 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +4 -4
- package/DEVELOPMENT.md +2 -3
- package/Readme.md +15 -15
- package/SPEC.md +2 -1
- package/docs/{components-browser-frame.md → browser-frame.md} +4 -0
- package/docs/components.md +12 -12
- package/docs/configuration.md +2 -0
- package/docs/customization.md +2 -0
- package/docs/deeper-dive.md +2 -0
- package/docs/getting-started.md +2 -0
- package/docs/index.json +258 -0
- package/docs/{components-keyboard.md → keyboard.md} +4 -0
- package/docs/{components-list-style.md → list-style.md} +4 -0
- package/docs/local-development.md +3 -1
- package/docs/mermaid.md +2 -0
- package/docs/mobile.md +3 -1
- package/docs/navigation.md +2 -0
- package/docs/{components-notes.md → notes.md} +4 -0
- package/docs/pdf-export.md +2 -0
- package/docs/presenter-mode.md +14 -6
- package/docs/{components-reveal-group.md → reveal-group.md} +2 -0
- package/docs/{components-reveal-with.md → reveal-with.md} +2 -0
- package/docs/{components-reveal.md → reveal.md} +5 -3
- package/docs/skills.md +3 -1
- package/docs/slides.md +2 -0
- package/docs/slidev-migration.md +2 -0
- package/docs/steps-and-reveals.md +2 -0
- package/docs/{components-timeline-steps.md → timeline-steps.md} +2 -0
- package/package.json +3 -2
- package/skills/SPEC.md +4 -4
- package/skills/honeydeck/SKILL.md +7 -7
- package/skills/slidev-migration/SKILL.md +6 -6
- package/src/runtime/Deck.tsx +18 -1
- package/src/runtime/components/SPEC.md +3 -3
- package/src/runtime/presentationApi.ts +112 -6
- package/src/runtime/sync.ts +130 -12
- package/src/runtime/views/PresenterCastButton.tsx +17 -9
- package/src/runtime/views/PresenterView.tsx +247 -30
- package/src/runtime/views/SPEC.md +28 -5
- package/src/runtime/views/presenterTime.ts +15 -0
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
- Navigation controls button
|
|
11
11
|
- Direct URL: `/#/presenter/1/0`
|
|
12
12
|
|
|
13
|
+
### Deactivation
|
|
14
|
+
|
|
15
|
+
- Keyboard shortcut `p` exits presenter mode back to audience slide view at the same slide/step.
|
|
16
|
+
- Keyboard shortcut `Escape` exits presenter mode back to audience slide view at the same slide/step.
|
|
17
|
+
|
|
13
18
|
### UI Layout
|
|
14
19
|
|
|
15
20
|
```txt
|
|
@@ -25,7 +30,7 @@
|
|
|
25
30
|
│ - Remember to demo the sparkle button │
|
|
26
31
|
│ - Mention PDF export │
|
|
27
32
|
│ │
|
|
28
|
-
│ Slide 3/12 · Step 2/4
|
|
33
|
+
│ Slide 3/12 · Step 2/4 12:34 Timer 1:23 [Open] │
|
|
29
34
|
└──────────────────────────────────────────┘
|
|
30
35
|
```
|
|
31
36
|
|
|
@@ -35,9 +40,12 @@ Includes:
|
|
|
35
40
|
- Speaker notes for current slide, with Markdown formatting from `<Notes>` rendered as compact presenter prose
|
|
36
41
|
- Slide/step counter
|
|
37
42
|
- Clock (wall clock)
|
|
43
|
+
- Elapsed presentation timer sits next to the slide/step counter on the left side of the bottom bar and has idle/running/paused states. Idle shows a start action. Running shows a prominent elapsed display plus pause action. Paused shows elapsed time plus continue, restart-from-zero, and close/reset actions.
|
|
38
44
|
- Button to open audience view in new tab, preserving the current slide/step and deck base path
|
|
39
|
-
-
|
|
40
|
-
-
|
|
45
|
+
- Color mode cycle button (system → light → dark → system). Presenter color mode changes also sync to BroadcastChannel audience views and Presentation API cast receivers.
|
|
46
|
+
- Blank screen toggle button and `b` keyboard shortcut. While blanked, the presenter sees a `Screen blanked (b)` indicator and audience/cast views see a black screen.
|
|
47
|
+
- Button to cast the audience view to a secondary display when the Presentation API is supported. Unsupported browsers keep a visibly disabled-looking control in the action row; it does not render extra inline feedback, and its hover title/accessible label explains that Presentation API casting is unavailable. Active casting can be stopped from the same control.
|
|
48
|
+
- Presenter navigation buttons provide previous/next timeline-step navigation and previous/next slide navigation on mobile presenter layouts. Desktop presenter layouts do not show navigation buttons. On mobile, the timeline-step buttons sit on the outside edges of the button group (previous step, previous slide, next slide, next step), because step navigation is the primary/default action. Timeline keyboard shortcuts (`→`/`←`/`↓`/`↑`, `d`/`a`/`s`/`w`) update the presenter route and keep the window in presenter mode.
|
|
41
49
|
- Presenter navigation uses the shared Honeydeck navigation command abstraction so button, keyboard, and touch inputs share the same semantics as audience view.
|
|
42
50
|
- Presenter notes are scroll-owned regions: wheel, trackpad, touch scroll, and swipe gestures that start in notes scroll notes and never navigate slides, even at scroll boundaries.
|
|
43
51
|
- On mobile presenter layouts, the Current preview may use tap zones and swipe navigation; speaker notes remain scroll-only. Pinch-to-zoom and pinch-to-overview are not required in presenter mode.
|
|
@@ -47,7 +55,22 @@ Includes:
|
|
|
47
55
|
|
|
48
56
|
### Presenter Responsiveness
|
|
49
57
|
|
|
50
|
-
Presenter mode uses a two-column preview area (`Current` larger, `Next` smaller), a notes panel, and a bottom status/action bar on desktop. On narrow/mobile screens it switches to a single-column layout and hides the Next preview.
|
|
58
|
+
Presenter mode uses a two-column preview area (`Current` larger, `Next` smaller), a notes panel, and a bottom status/action bar on desktop. On narrow/mobile screens it switches to a single-column layout and hides the Next preview. The navigation button group is the bottom-most element on mobile and uses larger touch targets than desktop.
|
|
59
|
+
|
|
60
|
+
### Presentation Timer
|
|
61
|
+
|
|
62
|
+
- Idle state shows a `Start timer` button.
|
|
63
|
+
- Starting changes to running state, displaying elapsed time as `MM:SS` or `H:MM:SS`.
|
|
64
|
+
- In running state, clicking the elapsed time or pause action pauses the timer.
|
|
65
|
+
- In paused state, controls let the presenter continue, restart from zero, or close/reset the timer back to idle.
|
|
66
|
+
|
|
67
|
+
### Blank Screen
|
|
68
|
+
|
|
69
|
+
- Pressing `b` toggles the audience screen to black; pressing `b` again restores the normal view.
|
|
70
|
+
- A blank screen button in the bottom action bar provides the same toggle.
|
|
71
|
+
- While blanked, the presenter sees a `Screen blanked (b)` indicator overlay.
|
|
72
|
+
- The blank-screen state is broadcast via both `BroadcastChannel` and the Presentation API cast connection as a `blank-screen` sync message with `mode: "black" | "off"`.
|
|
73
|
+
- When the presenter disconnects, audience windows automatically unblank.
|
|
51
74
|
|
|
52
75
|
### Audience Sync
|
|
53
76
|
|
|
@@ -55,7 +78,7 @@ Presenter mode and audience view synchronize via `BroadcastChannel` and the Pres
|
|
|
55
78
|
|
|
56
79
|
- Same browser/profile BroadcastChannel sync remains available when casting is unsupported or unavailable
|
|
57
80
|
- Presenter mode is the controller
|
|
58
|
-
- Audience view listens for navigation updates
|
|
81
|
+
- Audience view listens for navigation updates, presenter color mode changes, and blank-screen commands
|
|
59
82
|
- Late-opening audience tabs request the current presenter position via a `sync-request` / `sync-response` handshake as soon as a receiver connection is available, so they sync immediately instead of waiting for the next presenter move
|
|
60
83
|
- Presence messages (`presenter-connected` / `presenter-disconnected`) are broadcast
|
|
61
84
|
- When the Presentation API is supported, presenter mode can cast the audience view to a secondary display; the receiver asks for the current route when a connection becomes available and presenter replies with a `sync-response` so the cast audience resyncs even if it missed the first `navigate` message
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function formatPresenterElapsedTime(elapsedMs: number): string {
|
|
2
|
+
const totalSeconds = Math.max(0, Math.floor(elapsedMs / 1000));
|
|
3
|
+
const seconds = totalSeconds % 60;
|
|
4
|
+
const totalMinutes = Math.floor(totalSeconds / 60);
|
|
5
|
+
const minutes = totalMinutes % 60;
|
|
6
|
+
const hours = Math.floor(totalMinutes / 60);
|
|
7
|
+
|
|
8
|
+
if (hours > 0) {
|
|
9
|
+
return `${hours}:${minutes.toString().padStart(2, "0")}:${seconds
|
|
10
|
+
.toString()
|
|
11
|
+
.padStart(2, "0")}`;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return `${minutes}:${seconds.toString().padStart(2, "0")}`;
|
|
15
|
+
}
|