@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 +1 -0
- package/docs/deeper-dive.md +2 -9
- package/docs/getting-started.md +1 -0
- package/docs/skills.md +65 -0
- package/package.json +1 -1
- package/skills/SPEC.md +1 -0
- package/src/runtime/SPEC.md +2 -1
- package/src/runtime/components/NavBar.tsx +93 -81
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
|
package/docs/deeper-dive.md
CHANGED
|
@@ -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).
|
package/docs/getting-started.md
CHANGED
|
@@ -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
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.
|
package/src/runtime/SPEC.md
CHANGED
|
@@ -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-
|
|
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
|
|
130
|
-
{
|
|
131
|
-
|
|
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={
|
|
181
|
-
label="
|
|
135
|
+
onClick={goPrev}
|
|
136
|
+
label="Previous step (←)"
|
|
137
|
+
disabled={!canPrev}
|
|
182
138
|
>
|
|
183
|
-
<
|
|
139
|
+
<ChevronLeftIcon aria-hidden="true" size={16} />
|
|
184
140
|
</NavBarButton>
|
|
185
|
-
)}
|
|
186
141
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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
|
-
|
|
147
|
+
{/* Next step */}
|
|
193
148
|
<NavBarButton
|
|
194
|
-
onClick={
|
|
195
|
-
label=
|
|
196
|
-
|
|
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
|
-
<
|
|
153
|
+
<ChevronRightIcon aria-hidden="true" size={16} />
|
|
203
154
|
</NavBarButton>
|
|
204
|
-
|
|
155
|
+
</div>
|
|
205
156
|
|
|
206
|
-
<
|
|
157
|
+
<div className="hidden sm:block">
|
|
158
|
+
<NavBarDivider />
|
|
159
|
+
</div>
|
|
207
160
|
|
|
208
|
-
{
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
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
|
);
|