@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.
Files changed (40) hide show
  1. package/AGENTS.md +4 -4
  2. package/DEVELOPMENT.md +2 -3
  3. package/Readme.md +15 -15
  4. package/SPEC.md +2 -1
  5. package/docs/{components-browser-frame.md → browser-frame.md} +4 -0
  6. package/docs/components.md +12 -12
  7. package/docs/configuration.md +2 -0
  8. package/docs/customization.md +2 -0
  9. package/docs/deeper-dive.md +2 -0
  10. package/docs/getting-started.md +2 -0
  11. package/docs/index.json +258 -0
  12. package/docs/{components-keyboard.md → keyboard.md} +4 -0
  13. package/docs/{components-list-style.md → list-style.md} +4 -0
  14. package/docs/local-development.md +3 -1
  15. package/docs/mermaid.md +2 -0
  16. package/docs/mobile.md +3 -1
  17. package/docs/navigation.md +2 -0
  18. package/docs/{components-notes.md → notes.md} +4 -0
  19. package/docs/pdf-export.md +2 -0
  20. package/docs/presenter-mode.md +14 -6
  21. package/docs/{components-reveal-group.md → reveal-group.md} +2 -0
  22. package/docs/{components-reveal-with.md → reveal-with.md} +2 -0
  23. package/docs/{components-reveal.md → reveal.md} +5 -3
  24. package/docs/skills.md +3 -1
  25. package/docs/slides.md +2 -0
  26. package/docs/slidev-migration.md +2 -0
  27. package/docs/steps-and-reveals.md +2 -0
  28. package/docs/{components-timeline-steps.md → timeline-steps.md} +2 -0
  29. package/package.json +3 -2
  30. package/skills/SPEC.md +4 -4
  31. package/skills/honeydeck/SKILL.md +7 -7
  32. package/skills/slidev-migration/SKILL.md +6 -6
  33. package/src/runtime/Deck.tsx +18 -1
  34. package/src/runtime/components/SPEC.md +3 -3
  35. package/src/runtime/presentationApi.ts +112 -6
  36. package/src/runtime/sync.ts +130 -12
  37. package/src/runtime/views/PresenterCastButton.tsx +17 -9
  38. package/src/runtime/views/PresenterView.tsx +247 -30
  39. package/src/runtime/views/SPEC.md +28 -5
  40. 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 12:34 [Open]
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
- - Button to cast the audience view to a secondary display when the Presentation API is supported; unsupported browsers show a disabled hint and active casting can be stopped from the same control
40
- - Presenter navigation buttons provide previous/next timeline-step navigation and previous/next slide navigation. Timeline keyboard shortcuts (`→`/`←`/`↓`/`↑`, `d`/`a`/`s`/`w`) update the presenter route and keep the window in presenter mode.
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
+ }