@honeydeck/honeydeck 0.2.0 → 0.3.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/Readme.md CHANGED
@@ -30,6 +30,7 @@ Decks are plain MDX files separated into slides with `---`; see the first deck e
30
30
  - [Presenter mode](docs/presenter-mode.md) - notes, presenter window, sync, and mobile behavior
31
31
  - [PDF export](docs/pdf-export.md) - options, color modes, and step handling
32
32
  - [Local development](docs/local-development.md) - running Honeydeck from this repository
33
+ - [Skills](docs/skills.md) - optional agent skills for authoring, writing, and migration help
33
34
  - [Slidev migration](docs/slidev-migration.md) - moving from Slidev with the bundled agent skill
34
35
 
35
36
  ## Common commands
@@ -362,18 +362,11 @@ type LayoutProps<F = Record<string, unknown>> = {
362
362
 
363
363
  ## Agent skills
364
364
 
365
- Honeydeck ships optional agent skills:
366
-
367
- - `honeydeck` for Honeydeck-specific MDX and CLI guidance
368
- - `presentation-writing` for help writing strong slide narratives
369
- - `slidev-migration` for moving decks from Slidev to Honeydeck
370
-
371
- `honeydeck init` can open the same interactive skills installer as `honeydeck skill`.
365
+ Honeydeck ships optional agent skills for Honeydeck authoring, presentation writing, and Slidev migration. `honeydeck init` can open the same interactive skills installer as `honeydeck skill`.
372
366
 
373
367
  ```bash
374
368
  honeydeck skill
375
- npx skills add <honeydeck-repo-url> --copy
376
- npx skills add <honeydeck-repo-url> --copy --skill slidev-migration
377
369
  ```
378
370
 
371
+ See [Skills](skills.md) for installation options and bundled skill details.
379
372
  Coming from Slidev? See the [Slidev migration guide](slidev-migration.md).
@@ -109,6 +109,7 @@ honeydeck skill # install optional Honeydeck agent skills
109
109
  - [Presenter mode](presenter-mode.md) - notes, presenter window, sync, and mobile behavior
110
110
  - [PDF export](pdf-export.md) - options, color modes, and step handling
111
111
  - [Local development](local-development.md) - running Honeydeck from this repository
112
+ - [Skills](skills.md) - optional agent skills for authoring, writing, and migration help
112
113
  - [Slidev migration](slidev-migration.md) - moving from Slidev with the bundled agent skill
113
114
 
114
115
  ## Learn inside a running deck
package/docs/skills.md ADDED
@@ -0,0 +1,65 @@
1
+ # Skills
2
+
3
+ Honeydeck ships optional agent skills that help AI coding agents work with presentations more reliably. They are plain skill files bundled with the `@honeydeck/honeydeck` package, so you can install them into a deck project or into your global agent setup.
4
+
5
+ ## Install skills
6
+
7
+ New projects can open the skills installer during init:
8
+
9
+ ```bash
10
+ npx @honeydeck/honeydeck init --name my-talk --install-skill
11
+ ```
12
+
13
+ Existing projects can run:
14
+
15
+ ```bash
16
+ honeydeck skill
17
+ ```
18
+
19
+ Both commands open the same `skills` CLI flow, where you choose which Honeydeck skills to install, whether to install them for the project or globally, and which agents should receive them.
20
+
21
+ You can also install from the Honeydeck repository:
22
+
23
+ ```bash
24
+ npx skills add <honeydeck-repo-url> --copy
25
+ npx skills add <honeydeck-repo-url> --copy --skill honeydeck
26
+ npx skills add <honeydeck-repo-url> --copy --skill presentation-writing
27
+ npx skills add <honeydeck-repo-url> --copy --skill slidev-migration
28
+ ```
29
+
30
+ ## Bundled skills
31
+
32
+ | Skill | Use it for |
33
+ | --- | --- |
34
+ | `honeydeck` | Honeydeck-specific guidance for MDX decks, layouts, CSS imports, presenter notes, reveals, code steps, PDF export, and package docs. |
35
+ | `presentation-writing` | Framework-agnostic help with audience, storyline, slide headlines, speaker notes, timing, and review heuristics. |
36
+ | `slidev-migration` | Migrating Slidev decks to Honeydeck while preserving source files until you approve cleanup. |
37
+
38
+ The `honeydeck` and `presentation-writing` skills work well together: one keeps the agent inside Honeydeck conventions, while the other improves the story and delivery. Add `slidev-migration` when you are converting an existing Slidev project.
39
+
40
+ ## How agents use them
41
+
42
+ Skills do not change Honeydeck runtime behavior. They give your agent a focused local instruction file before it edits your deck.
43
+
44
+ For example, an agent with the `honeydeck` skill should prefer:
45
+
46
+ - `deck.mdx` as the entry file
47
+ - exact `---` slide separators
48
+ - slide frontmatter for layouts
49
+ - explicit imports from `@honeydeck/honeydeck`
50
+ - `<Notes>` for speaker notes
51
+ - `<Reveal>`, `<RevealGroup>`, and code metadata for steps
52
+ - `honeydeck pdf` for PDF export
53
+
54
+ The skills also point agents back to the packaged docs and specs, so generated deck changes can stay aligned with the installed Honeydeck version.
55
+
56
+ ## Updating skills
57
+
58
+ Skills are copied into the target scope when you install them. Re-run the installer after upgrading Honeydeck if you want the latest bundled instructions:
59
+
60
+ ```bash
61
+ npm update @honeydeck/honeydeck
62
+ honeydeck skill
63
+ ```
64
+
65
+ Coming from Slidev? See the [Slidev migration guide](slidev-migration.md) for the migration-specific workflow.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@honeydeck/honeydeck",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "MDX and React-based presentation framework for AI-friendly slide decks.",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
package/skills/SPEC.md CHANGED
@@ -19,3 +19,4 @@ Expected behavior:
19
19
  - The `slidev-migration` skill instructs agents to inspect existing Slidev projects, preserve source files until the user approves cleanup, initialize or merge Honeydeck starter files, migrate common Slidev syntax to Honeydeck MDX/React, and document unsupported or approximated features.
20
20
  - `honeydeck init` should offer to open the interactive skills installer for the generated project and make clear that accepting runs `npx skills add`.
21
21
  - `honeydeck init` and `honeydeck skill` should delegate bundled skill selection, scope selection, and agent selection to the same `npx skills add <honeydeck-package-source> --copy` flow.
22
+ - `docs/skills.md` should document why and how to install the bundled skills, list the `honeydeck`, `presentation-writing`, and `slidev-migration` skills, and link to the Slidev migration guide for migration-specific details.
@@ -121,10 +121,11 @@ Reference page routes intentionally do not encode slide or step. During one brow
121
121
 
122
122
  Shown in normal slide view only (not presenter/reference views).
123
123
 
124
- - Positioned bottom-left
124
+ - Positioned bottom-center on narrow mobile screens and bottom-left from wider breakpoints
125
125
  - **Hidden by default** on desktop — appears on cursor hover near bottom edge
126
126
  - **Always visible** on mobile/tablet portrait
127
127
  - **Hidden by default** on mobile/tablet landscape — appears when the center tap zone is tapped, fades after roughly 3 seconds of idle time, and stays visible while being interacted with
128
+ - On narrow mobile screens, stays within the viewport by wrapping controls into compact groups instead of extending past the screen edge
128
129
  - Contains:
129
130
  - Current slide number
130
131
  - Navigation arrows (step left/right)
@@ -118,105 +118,117 @@ export function NavBar({
118
118
  const canPrev = getPreviousStepRoute(route, navigationOptions) !== null;
119
119
  const canNext = getNextStepRoute(route, navigationOptions) !== null;
120
120
  const FullscreenIcon = isFullscreen ? MinimizeIcon : MaximizeIcon;
121
+ const groupClass =
122
+ "flex items-center gap-0.5 rounded-md bg-white/[0.04] px-0.5 py-0.5 sm:bg-transparent sm:p-0";
121
123
 
122
124
  return (
123
125
  // Hover zone — transparent, occupies the bottom strip
124
126
  <div
125
- className="honeydeck-nav-zone fixed bottom-0 left-0 right-0 h-20 z-50 flex items-end pointer-events-none"
127
+ className="honeydeck-nav-zone fixed bottom-0 left-0 right-0 h-28 z-50 flex items-end justify-center pointer-events-none sm:h-20 sm:justify-start"
126
128
  data-honeydeck-no-swipe="true"
127
129
  >
128
130
  {/* Actual bar */}
129
- <div className="honeydeck-nav-bar pointer-events-auto flex items-center gap-1 px-2 py-1.5 ml-6 mb-6 bg-black/70 backdrop-blur rounded-lg border border-white/10 shadow-[0_4px_24px_rgba(0,0,0,0.4)]">
130
- {/* Prev step */}
131
- <NavBarButton
132
- onClick={goPrev}
133
- label="Previous step (←)"
134
- disabled={!canPrev}
135
- >
136
- <ChevronLeftIcon aria-hidden="true" size={16} />
137
- </NavBarButton>
138
-
139
- {/* Slide number */}
140
- <span className="min-w-6 px-1 text-center font-sans text-sm tabular-nums text-white/60">
141
- {route.slide}
142
- </span>
143
-
144
- {/* Next step */}
145
- <NavBarButton
146
- onClick={goNext}
147
- label="Next step (→)"
148
- disabled={!canNext}
149
- >
150
- <ChevronRightIcon aria-hidden="true" size={16} />
151
- </NavBarButton>
152
-
153
- <NavBarDivider />
154
-
155
- {/* Overview */}
156
- <NavBarButton
157
- onClick={onToggleOverview}
158
- label="Overview (o)"
159
- active={isOverview}
160
- >
161
- <LayoutGridIcon aria-hidden="true" size={14} />
162
- </NavBarButton>
163
-
164
- {/* Layouts reference */}
165
- <NavBarButton
166
- onClick={() => openReference(route)}
167
- label="Layouts reference"
168
- >
169
- <BookOpenTextIcon aria-hidden="true" size={16} />
170
- </NavBarButton>
171
-
172
- {/* Docs website */}
173
- <NavBarButton onClick={openDocsWebsite} label="Docs website">
174
- <ExternalLinkIcon aria-hidden="true" size={15} />
175
- </NavBarButton>
176
-
177
- {/* Presenter mode */}
178
- {route.view !== "presenter" && (
131
+ <div className="honeydeck-nav-bar pointer-events-auto mx-2 mb-2 flex max-w-[calc(100vw-1rem)] flex-wrap items-center justify-center gap-1 rounded-lg border border-white/10 bg-black/70 px-1.5 py-1.5 shadow-[0_4px_24px_rgba(0,0,0,0.4)] backdrop-blur sm:mx-0 sm:ml-6 sm:mb-6 sm:max-w-none sm:flex-nowrap sm:justify-start sm:gap-1 sm:px-2">
132
+ <div className={groupClass}>
133
+ {/* Prev step */}
179
134
  <NavBarButton
180
- onClick={() => openPresenter(route)}
181
- label="Presenter mode (p)"
135
+ onClick={goPrev}
136
+ label="Previous step ()"
137
+ disabled={!canPrev}
182
138
  >
183
- <PresentationIcon aria-hidden="true" size={16} />
139
+ <ChevronLeftIcon aria-hidden="true" size={16} />
184
140
  </NavBarButton>
185
- )}
186
141
 
187
- {/* Fullscreen */}
188
- <NavBarButton onClick={toggleFullscreen} label="Fullscreen (f)">
189
- <FullscreenIcon aria-hidden="true" size={16} />
190
- </NavBarButton>
142
+ {/* Slide number */}
143
+ <span className="min-w-6 px-1 text-center font-sans text-sm tabular-nums text-white/60">
144
+ {route.slide}
145
+ </span>
191
146
 
192
- {showTextSelectionToggle && onToggleTextSelection && (
147
+ {/* Next step */}
193
148
  <NavBarButton
194
- onClick={onToggleTextSelection}
195
- label={
196
- isTextSelectionEnabled
197
- ? "Disable slide text selection"
198
- : "Enable slide text selection"
199
- }
200
- active={isTextSelectionEnabled}
149
+ onClick={goNext}
150
+ label="Next step (→)"
151
+ disabled={!canNext}
201
152
  >
202
- <TextSelectIcon aria-hidden="true" size={16} />
153
+ <ChevronRightIcon aria-hidden="true" size={16} />
203
154
  </NavBarButton>
204
- )}
155
+ </div>
205
156
 
206
- <NavBarDivider />
157
+ <div className="hidden sm:block">
158
+ <NavBarDivider />
159
+ </div>
207
160
 
208
- {isZoomed && onResetZoom && (
209
- <NavBarButton onClick={onResetZoom} label="Reset zoom">
210
- <RotateCcwIcon aria-hidden="true" size={16} />
161
+ <div className={groupClass}>
162
+ {/* Overview */}
163
+ <NavBarButton
164
+ onClick={onToggleOverview}
165
+ label="Overview (o)"
166
+ active={isOverview}
167
+ >
168
+ <LayoutGridIcon aria-hidden="true" size={14} />
169
+ </NavBarButton>
170
+
171
+ {/* Layouts reference */}
172
+ <NavBarButton
173
+ onClick={() => openReference(route)}
174
+ label="Layouts reference"
175
+ >
176
+ <BookOpenTextIcon aria-hidden="true" size={16} />
211
177
  </NavBarButton>
212
- )}
213
-
214
- {/* Color mode */}
215
- <ColorModeCycleButton
216
- colorMode={colorMode}
217
- onSetColorMode={onSetColorMode}
218
- className={navBarButtonClass()}
219
- />
178
+
179
+ {/* Docs website */}
180
+ <NavBarButton onClick={openDocsWebsite} label="Docs website">
181
+ <ExternalLinkIcon aria-hidden="true" size={15} />
182
+ </NavBarButton>
183
+
184
+ {/* Presenter mode */}
185
+ {route.view !== "presenter" && (
186
+ <NavBarButton
187
+ onClick={() => openPresenter(route)}
188
+ label="Presenter mode (p)"
189
+ >
190
+ <PresentationIcon aria-hidden="true" size={16} />
191
+ </NavBarButton>
192
+ )}
193
+ </div>
194
+
195
+ <div className="hidden sm:block">
196
+ <NavBarDivider />
197
+ </div>
198
+
199
+ <div className={groupClass}>
200
+ {/* Fullscreen */}
201
+ <NavBarButton onClick={toggleFullscreen} label="Fullscreen (f)">
202
+ <FullscreenIcon aria-hidden="true" size={16} />
203
+ </NavBarButton>
204
+
205
+ {showTextSelectionToggle && onToggleTextSelection && (
206
+ <NavBarButton
207
+ onClick={onToggleTextSelection}
208
+ label={
209
+ isTextSelectionEnabled
210
+ ? "Disable slide text selection"
211
+ : "Enable slide text selection"
212
+ }
213
+ active={isTextSelectionEnabled}
214
+ >
215
+ <TextSelectIcon aria-hidden="true" size={16} />
216
+ </NavBarButton>
217
+ )}
218
+
219
+ {isZoomed && onResetZoom && (
220
+ <NavBarButton onClick={onResetZoom} label="Reset zoom">
221
+ <RotateCcwIcon aria-hidden="true" size={16} />
222
+ </NavBarButton>
223
+ )}
224
+
225
+ {/* Color mode */}
226
+ <ColorModeCycleButton
227
+ colorMode={colorMode}
228
+ onSetColorMode={onSetColorMode}
229
+ className={navBarButtonClass()}
230
+ />
231
+ </div>
220
232
  </div>
221
233
  </div>
222
234
  );