@honeydeck/honeydeck 0.4.0 → 0.6.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 (71) hide show
  1. package/AGENTS.md +4 -4
  2. package/DEVELOPMENT.md +6 -4
  3. package/Readme.md +15 -15
  4. package/SPEC.md +5 -4
  5. package/docs/browser-frame.md +38 -0
  6. package/docs/components.md +16 -57
  7. package/docs/configuration.md +13 -0
  8. package/docs/customization.md +2 -0
  9. package/docs/deeper-dive.md +32 -7
  10. package/docs/getting-started.md +4 -2
  11. package/docs/index.json +258 -0
  12. package/docs/keyboard.md +35 -0
  13. package/docs/list-style.md +53 -0
  14. package/docs/local-development.md +3 -1
  15. package/docs/mermaid.md +2 -0
  16. package/docs/mobile.md +2 -0
  17. package/docs/navigation.md +3 -1
  18. package/docs/notes.md +40 -0
  19. package/docs/pdf-export.md +6 -2
  20. package/docs/presenter-mode.md +8 -3
  21. package/docs/reveal-group.md +60 -0
  22. package/docs/reveal-with.md +39 -0
  23. package/docs/reveal.md +35 -0
  24. package/docs/skills.md +5 -3
  25. package/docs/slides.md +2 -0
  26. package/docs/slidev-migration.md +5 -0
  27. package/docs/steps-and-reveals.md +145 -8
  28. package/docs/timeline-steps.md +50 -0
  29. package/package.json +6 -2
  30. package/skills/SPEC.md +6 -6
  31. package/skills/honeydeck/SKILL.md +9 -9
  32. package/skills/slidev-migration/SKILL.md +7 -6
  33. package/src/SPEC.md +8 -3
  34. package/src/cli/SPEC.md +3 -2
  35. package/src/cli/pdf.ts +11 -4
  36. package/src/remark/SPEC.md +102 -2
  37. package/src/remark/code-utils.ts +151 -0
  38. package/src/remark/shiki-code-blocks.ts +329 -136
  39. package/src/remark/step-numbering.ts +408 -103
  40. package/src/runtime/Deck.tsx +133 -116
  41. package/src/runtime/EffectiveColorModeContext.tsx +37 -0
  42. package/src/runtime/SPEC.md +21 -8
  43. package/src/runtime/SlideCanvas.tsx +19 -16
  44. package/src/runtime/SlideScaleContext.tsx +23 -0
  45. package/src/runtime/components/CodeBlock.tsx +19 -202
  46. package/src/runtime/components/CodeBlockCopyButton.tsx +64 -0
  47. package/src/runtime/components/CodeBlockShared.ts +17 -0
  48. package/src/runtime/components/Fade.tsx +51 -0
  49. package/src/runtime/components/FadeGroup.tsx +175 -0
  50. package/src/runtime/components/FadeWith.tsx +54 -0
  51. package/src/runtime/components/MagicCodeBlock.tsx +223 -0
  52. package/src/runtime/components/NavBar.tsx +1 -1
  53. package/src/runtime/components/NormalCodeBlock.tsx +128 -0
  54. package/src/runtime/components/Reveal.tsx +27 -27
  55. package/src/runtime/components/RevealGroup.tsx +143 -41
  56. package/src/runtime/components/RevealWith.tsx +63 -0
  57. package/src/runtime/components/SPEC.md +115 -10
  58. package/src/runtime/components/TimelineReveal.tsx +81 -0
  59. package/src/runtime/components/index.ts +13 -5
  60. package/src/runtime/components/timelineVisibility.ts +45 -0
  61. package/src/runtime/index.ts +9 -1
  62. package/src/runtime/navigation.ts +6 -4
  63. package/src/runtime/presentationApi.ts +449 -0
  64. package/src/runtime/views/PresenterCastButton.tsx +39 -0
  65. package/src/runtime/views/PresenterView.tsx +21 -4
  66. package/src/runtime/views/SPEC.md +7 -5
  67. package/src/theme/base.css +67 -2
  68. package/src/vite-plugin/SPEC.md +20 -2
  69. package/src/vite-plugin/index.ts +16 -2
  70. package/src/vite-plugin/splitter.ts +1 -0
  71. package/src/vite-plugin/virtual-modules.ts +16 -6
@@ -1,3 +1,5 @@
1
+ <!-- Generated from packages/docs/content/docs/(advanced)/slidev-migration.mdx. Do not edit by hand. -->
2
+
1
3
  # Slidev migration
2
4
 
3
5
  Coming from [Slidev](https://sli.dev)? Honeydeck ships an optional `slidev-migration` agent skill that can help an AI coding agent initialize a Honeydeck project and migrate a Slidev deck.
@@ -36,7 +38,10 @@ The skill guides an agent through the common Slidev-to-Honeydeck mapping:
36
38
  | `components/*.vue` | React `components/*.tsx` |
37
39
  | `layouts/*.vue` or Slidev themes | Honeydeck layouts, layout maps, React components, and CSS |
38
40
  | `<v-click>` / `<v-clicks>` | `<Reveal>` / `<RevealGroup>` |
41
+ | Slidev Magic Move code blocks (`md magic-move`) | Honeydeck Magic Code blocks (`md magic-code`) |
39
42
  | trailing note comments | `<Notes>` |
40
43
  | `slidev`, `slidev build`, `slidev export` | `honeydeck dev`, `honeydeck build`, `honeydeck pdf` |
41
44
 
45
+ The migration skill rewrites Slidev `md magic-move` code animation blocks to Honeydeck's canonical `md magic-code` syntax. Honeydeck still accepts `md magic-move` as a compatibility alias.
46
+
42
47
  Advanced Slidev features such as Vue directives, `$clicks`, custom theme internals, Monaco/live-code blocks, and complex click positioning may need React-specific follow-up after the first migration pass.
@@ -1,16 +1,19 @@
1
+ <!-- Generated from packages/docs/content/docs/(core)/steps-and-reveals.mdx. Do not edit by hand. -->
2
+
1
3
  # Steps & Reveals
2
4
 
3
- Honeydeck has a first-class step concept. Each slide has a timeline built from `Reveal`/`RevealGroup` components, custom component step blocks, and code highlight ranges, counted in document order.
5
+ Honeydeck has a first-class step concept. Each slide has a timeline built from `Reveal`/`RevealGroup`/`Fade`/`FadeGroup` components, `RevealWith`/`FadeWith` synchronized content, custom component step blocks, code highlight ranges, and Magic Code states, counted in document order.
4
6
 
5
7
  ## Timeline Model
6
8
 
7
9
  - Slides start at **step 0** — no reveals or custom component steps active.
8
10
  - Stepped code blocks show their first highlight group immediately whenever the block is visible.
9
- - Each `Reveal`, `RevealGroup` child, `TimelineSteps` block, or code highlight group after the first adds a step.
11
+ - Magic Code blocks show their first inner code fence and first highlight group immediately whenever the block is visible.
12
+ - Each `Reveal`, `Fade`, `RevealGroup`/`FadeGroup` child, `TimelineSteps` block, code highlight group after the first, or Magic Code state after the first adds a step.
13
+ - `RevealWith` and `FadeWith` add no steps. They watch existing steps by `target` or numeric `at`.
10
14
  - All step-producing elements share one slide-local timeline.
11
- - Nested step-producing elements are flattened into that same timeline. A parent
12
- reveal target appears first; nested reveals, reveal groups, and code highlight
13
- ranges appear after the parent and before the next sibling target.
15
+ - Nested step-producing elements are flattened into that same timeline for reveal targets. A parent reveal target appears first; nested reveal/fade groups and code highlight ranges appear after the parent and before the next sibling target.
16
+ - Fade targets must not contain nested timeline producers because a faded parent would hide later nested steps. Put fades inside reveals instead.
14
17
 
15
18
  ## Reveal
16
19
 
@@ -31,13 +34,74 @@ import { Reveal } from '@honeydeck/honeydeck'
31
34
  ### Behavior
32
35
 
33
36
  - **Cumulative** — once visible, content stays visible for the rest of the slide.
34
- - **Layout-stable** — hidden content reserves space (`opacity: 0` / `visibility: hidden`, not `display: none`).
37
+ - **Layout-stable by default** — hidden content reserves space (`opacity: 0` / `visibility: hidden`, not `display: none`).
38
+ - **Ephemeral when requested** — add `ephemeral` to render hidden content as `null`, so it reserves no layout space. Presenter previews still show a muted ghost.
35
39
  - **Default effect** — fade-in. Customize with `className` and Tailwind/CSS.
40
+ - Optional `name="..."` gives a reveal a slide-local target for `RevealWith`.
41
+
42
+ ## RevealWith
43
+
44
+ Use `RevealWith` when content should appear at the same step as another reveal,
45
+ code highlight, group item, Magic Code state, or custom `TimelineSteps` state.
46
+ It never adds a new step.
47
+
48
+ ````mdx
49
+ import { Reveal, RevealWith } from '@honeydeck/honeydeck'
50
+
51
+ <Reveal name="headline">Headline appears first</Reveal>
52
+ <RevealWith target="headline">Supporting detail appears with it</RevealWith>
53
+
54
+ ```ts {1|2|3}
55
+ const answer = 42
56
+ console.log(answer)
57
+ ```
58
+
59
+ <RevealWith at={2}>This appears with the second slide step</RevealWith>
60
+ ````
61
+
62
+ Rules:
63
+
64
+ - Use exactly one of `target="name"` or `at={n}`.
65
+ - `target` points to a same-slide `<Reveal name="name">`; forward references work.
66
+ - `at` is a 1-based slide-local step and can target any existing timeline step.
67
+ - `name`, `target`, and `at` must be literal values so Honeydeck can validate them at build time.
68
+
69
+ ## Fade
70
+
71
+ `Fade` is the inverse of `Reveal`: content starts visible and fades out at its timeline step.
72
+
73
+ ```mdx
74
+ import { Fade } from '@honeydeck/honeydeck'
75
+
76
+ <Fade>Visible at step 0, gone at step 1</Fade>
77
+ <Fade ephemeral>Gone at step 2 and no longer reserves space</Fade>
78
+ ```
79
+
80
+ Behavior:
81
+
82
+ - Visible while `stepIndex < at`.
83
+ - Hidden while `stepIndex >= at`.
84
+ - Hidden content reserves layout space by default.
85
+ - With `ephemeral`, hidden content renders `null` and reserves no layout space.
86
+ - Fade content must not contain nested timeline producers. Put `Fade` inside `Reveal`, not `Reveal` inside `Fade`.
87
+
88
+ ## FadeWith
89
+
90
+ Use `FadeWith` for a fade-out controlled by an explicit target step or named reveal target without adding its own timeline step:
91
+
92
+ ```mdx
93
+ import { FadeWith } from '@honeydeck/honeydeck'
94
+
95
+ <FadeWith target={3}>Disappears when step 3 is active</FadeWith>
96
+ <FadeWith at={2}>Disappears with slide step 2</FadeWith>
97
+ ```
98
+
99
+ `FadeWith` never increments the slide step count. It uses the same `target`/`at` validation rules as `RevealWith`.
36
100
 
37
101
  ## RevealGroup
38
102
 
39
103
  Reveals each direct child as its own step. If a direct child is a list, each
40
- list item is revealed as its own step:
104
+ top-level list item is revealed as its own step:
41
105
 
42
106
  ```mdx
43
107
  import { RevealGroup } from '@honeydeck/honeydeck'
@@ -49,7 +113,20 @@ import { RevealGroup } from '@honeydeck/honeydeck'
49
113
  </RevealGroup>
50
114
  ```
51
115
 
52
- To reveal multiple elements together, wrap them in a single `Reveal` instead.
116
+ Set `listRevealMode="nested"` to reveal nested list items depth-first:
117
+
118
+ ```mdx
119
+ <RevealGroup listRevealMode="nested">
120
+ - Parent
121
+ - Child A
122
+ - Child B
123
+ - Sibling
124
+ </RevealGroup>
125
+ ```
126
+
127
+ Timeline: parent → child A → child B → sibling. The default `"direct"` mode keeps nested items grouped with their parent.
128
+
129
+ To reveal multiple elements together, wrap them in a single `Reveal` instead. Add `ephemeral` to the group when hidden generated children should not reserve layout space.
53
130
 
54
131
  Nested reveals and code walkthroughs work inside group items:
55
132
 
@@ -76,6 +153,20 @@ Timeline:
76
153
  3. Code item appears with line 1 highlighted
77
154
  4. Code highlights line 2
78
155
 
156
+ ## FadeGroup
157
+
158
+ `FadeGroup` is the inverse of `RevealGroup`: each meaningful direct child starts visible and fades out one by one. Direct lists are preserved, and each list item gets its own fade-out step. Fade group targets must not contain nested timeline producers.
159
+
160
+ ```mdx
161
+ import { FadeGroup } from '@honeydeck/honeydeck'
162
+
163
+ <FadeGroup ephemeral>
164
+ - Remove this at step 1
165
+ - Remove this at step 2
166
+ - Remove this at step 3
167
+ </FadeGroup>
168
+ ```
169
+
79
170
  ## Custom Component Steps
80
171
 
81
172
  Use `TimelineSteps` when an imported React component should control part of
@@ -141,6 +232,52 @@ console.log(c)
141
232
  - **Dim approach:** Non-highlighted lines are dimmed (controlled by `--honeydeck-code-line-dim-opacity: 0.4`).
142
233
  - **Shiki at build time:** No runtime JS cost for syntax highlighting.
143
234
 
235
+ ## Magic Code
236
+
237
+ Magic Code animates between multiple code states while keeping the same Honeydeck timeline model. It builds on Shiki Magic Code / Shiki Magic Move and uses build-time precompiled highlighting data.
238
+
239
+ `````mdx
240
+ ````md magic-code {duration:500}
241
+ ```ts
242
+ const count = 1
243
+ ```
244
+
245
+ ```ts
246
+ const count = 2
247
+ ```
248
+ ````
249
+ `````
250
+
251
+ - The canonical Honeydeck syntax is `md magic-code`.
252
+ - `md magic-move` is accepted as a Slidev compatibility alias.
253
+ - Use `{duration:500}` to override the animation duration for one block.
254
+ - Set a deck-wide default with `magicCodeDuration: 500` in deck-level frontmatter.
255
+ - Content inside a Magic Code block that is not a fenced code block is ignored.
256
+ - Magic Code looks and copies like a normal Honeydeck code block. Copying always copies the currently visible code text.
257
+
258
+ Inner code fences keep normal code step metadata:
259
+
260
+ `````mdx
261
+ ````md magic-code
262
+ ```ts {1|2}
263
+ const a = 1
264
+ const b = 2
265
+ ```
266
+
267
+ ```ts {all}
268
+ const sum = a + b
269
+ ```
270
+ ````
271
+ `````
272
+
273
+ Timeline:
274
+
275
+ 1. First code state, line 1 highlighted
276
+ 2. First code state, line 2 highlighted
277
+ 3. Morph to second code state, all lines highlighted
278
+
279
+ Magic Code states may use different languages, but animations usually look best when all states use the same language.
280
+
144
281
  ## Mixed Timeline Example
145
282
 
146
283
  ````mdx
@@ -0,0 +1,50 @@
1
+ <!-- Generated from packages/docs/content/docs/(components)/timeline-steps.mdx. Do not edit by hand. -->
2
+
3
+ # TimelineSteps
4
+
5
+ Use `<TimelineSteps>` when an imported React component should control part of a slide timeline.
6
+
7
+ ```mdx
8
+ import { Reveal, TimelineSteps } from '@honeydeck/honeydeck'
9
+ import { AccordionDemo } from './AccordionDemo'
10
+
11
+ <Reveal>Before the custom component</Reveal>
12
+
13
+ <TimelineSteps steps={3}>
14
+ <AccordionDemo />
15
+ </TimelineSteps>
16
+
17
+ <Reveal>After the custom component</Reveal>
18
+ ```
19
+
20
+ Inside the custom component, read local step state with `useTimelineSteps()`:
21
+
22
+ ```tsx
23
+ import { useTimelineSteps } from '@honeydeck/honeydeck'
24
+
25
+ export function AccordionDemo() {
26
+ const { phase, stepIndex, stepCount, isPdfFinalRender } = useTimelineSteps()
27
+
28
+ return <div>Step {stepIndex} of {stepCount}</div>
29
+ }
30
+ ```
31
+
32
+ ## Props
33
+
34
+ | Prop | Type | Default | Description |
35
+ | --- | --- | --- | --- |
36
+ | `steps` | `number` | Required | Literal positive integer number of reserved timeline steps. |
37
+ | `children` | `ReactNode` | — | Custom component content. |
38
+
39
+ `useTimelineSteps()` returns `{ phase, stepIndex, stepCount, startAt, endAt, isPdfFinalRender }`.
40
+
41
+ - `phase` is `"before"`, `"active"`, or `"after"`.
42
+ - `stepIndex` is `0` before start, `1..stepCount` while active, and `stepCount` after end.
43
+ - `isPdfFinalRender` is `true` only for one-page final-state PDF export.
44
+
45
+ ## Rules
46
+
47
+ - `steps` must be a literal positive integer in slide MDX, for example `steps={3}`.
48
+ - `<TimelineSteps>` must appear at the usage site in slide MDX. Imported TSX components cannot register steps by rendering `<TimelineSteps>` internally.
49
+ - Nested Honeydeck timeline producers inside `<TimelineSteps>` are not supported.
50
+ - In `isPdfFinalRender`, allows custom components to controll how they appear in PDFs.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@honeydeck/honeydeck",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "MDX and React-based presentation framework for AI-friendly slide decks.",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -35,8 +35,8 @@
35
35
  "!src/**/*.test.tsx",
36
36
  "!src/**/fixtures",
37
37
  "!src/**/fixtures/**",
38
- "docs",
39
38
  "skills",
39
+ "docs",
40
40
  "Readme.md",
41
41
  "SPEC.md",
42
42
  "DEVELOPMENT.md",
@@ -80,6 +80,8 @@
80
80
  "./themes/bee.css": "./src/theme/bee.css",
81
81
  "./components": "./src/runtime/components/index.ts",
82
82
  "./components/code-block": "./src/runtime/components/CodeBlock.tsx",
83
+ "./components/code-block/normal": "./src/runtime/components/NormalCodeBlock.tsx",
84
+ "./components/code-block/magic": "./src/runtime/components/MagicCodeBlock.tsx",
83
85
  "./remark/shiki-code-blocks": "./src/remark/shiki-code-blocks.ts"
84
86
  },
85
87
  "imports": {
@@ -93,6 +95,7 @@
93
95
  "dev:init": "node --import tsx ./src/cli/index.ts dev --deck src/cli/templates/starter/deck.mdx",
94
96
  "format": "biome check --write",
95
97
  "lint": "biome check",
98
+ "prepack": "npm -w @honeydeck/docs run export:package-docs",
96
99
  "pack:dry-run": "npm pack --dry-run",
97
100
  "pack:smoke": "node ./scripts/packed-smoke.mjs",
98
101
  "release:plan": "node ./scripts/release-plan.mjs",
@@ -103,6 +106,7 @@
103
106
  "@clack/prompts": "^1.3.0",
104
107
  "@mdx-js/mdx": "^3.1.1",
105
108
  "@mdx-js/rollup": "^3.1.1",
109
+ "@shikijs/magic-move": "^4.2.0",
106
110
  "@tailwindcss/vite": "^4.3.0",
107
111
  "lucide-react": "^1.16.0",
108
112
  "pdf-lib": "^1.17.1",
package/skills/SPEC.md CHANGED
@@ -6,17 +6,17 @@
6
6
 
7
7
  Honeydeck ships installable agent skills:
8
8
 
9
- - `skills/honeydeck/SKILL.md` (`honeydeck`) helps AI agents use Honeydeck correctly: MDX entrypoint, deck frontmatter, exact `---` slide separators, slide frontmatter, built-in layouts, explicit theme/CSS imports, presenter notes, steps/reveals, code blocks, PDF export, custom React components, customization, canonical package docs, and runtime reference pages.
9
+ - `skills/honeydeck/SKILL.md` (`honeydeck`) helps AI agents use Honeydeck correctly: MDX entrypoint, deck frontmatter, exact `---` slide separators, slide frontmatter, built-in layouts, explicit theme/CSS imports, presenter notes, steps/reveals, code blocks, PDF export, custom React components, customization, public docs, specs, and runtime reference pages.
10
10
  - `skills/presentation-writing/SKILL.md` (`presentation-writing`) gives opinionated guidance for writing great slides and delivering good presentations: audience/goal/duration discovery, storyline, one idea per slide, strong headlines, sparse visuals, speaker notes, timing, narrative flow, progressive disclosure, and review heuristics.
11
- - `skills/slidev-migration/SKILL.md` (`slidev-migration`) helps AI agents migrate presentations from Slidev/sli.dev to Honeydeck: initialize a Honeydeck project when needed, convert `slides.md` to `deck.mdx`, map Slidev frontmatter/layouts/assets/notes/reveals/scripts to Honeydeck equivalents, and flag Vue/theme features that need manual React follow-up.
11
+ - `skills/slidev-migration/SKILL.md` (`slidev-migration`) helps AI agents migrate presentations from Slidev/sli.dev to Honeydeck: initialize a Honeydeck project when needed, convert `slides.md` to `deck.mdx`, map Slidev frontmatter/layouts/assets/notes/reveals/scripts/Magic Move code blocks to Honeydeck equivalents, and flag Vue/theme features that need manual React follow-up.
12
12
 
13
13
  Expected behavior:
14
14
 
15
15
  - All skills are discoverable by the `skills` CLI when users run `npx skills add <honeydeck-repo-url> --copy` or explicit `npx skills add <honeydeck-repo-url> --copy --skill honeydeck` / `--skill presentation-writing` / `--skill slidev-migration`.
16
- - The `honeydeck` skill instructs agents to use Honeydeck documentation (`Readme.md` for package overview, `docs/getting-started.md` for first-run guidance, package/root `SPEC.md`, linked colocated `SPEC.md` files, `docs/deeper-dive.md`, `docs/slides.md`, `docs/steps-and-reveals.md`, `docs/customization.md`, `docs/configuration.md`, and related docs) as the source of truth when available.
17
- - The `honeydeck` skill documents a local docs discovery order: current project's `node_modules/@honeydeck/honeydeck`, monorepo checkout `packages/honeydeck`, package-root checkout docs, then the public docs URL.
16
+ - The `honeydeck` skill instructs agents to use installed Honeydeck package documentation (`node_modules/@honeydeck/honeydeck/docs/*.md`, `node_modules/@honeydeck/honeydeck/docs/index.json`, `Readme.md`, package `SPEC.md`, linked colocated `SPEC.md` files, and the public docs site) as the source of truth when available.
17
+ - The `honeydeck` skill documents a consumer-focused local docs discovery order: current project's `node_modules/@honeydeck/honeydeck/docs` package docs first, then installed package specs, then package-root checkout docs/specs, then the public docs URL. It must not require monorepo-only `packages/docs` paths for normal installed-package use.
18
18
  - The `presentation-writing` skill is framework-agnostic enough to help with presentation quality, while still working well alongside the Honeydeck skill.
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.
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, rewrite `md magic-move` blocks to Honeydeck's canonical `md magic-code` syntax, 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.
22
+ - `packages/docs/content/docs/(advanced)/skills.mdx` 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.
@@ -9,28 +9,28 @@ You help the user work with Honeydeck presentations. Honeydeck decks are MDX fil
9
9
 
10
10
  ## Source of truth
11
11
 
12
- Before giving Honeydeck-specific syntax or changing a deck, prefer repository/package docs when available.
12
+ Before giving Honeydeck-specific syntax or changing a deck, prefer the installed package docs and package specs when available. This skill is for consumers of the `@honeydeck/honeydeck` package, so do not depend on monorepo-only paths.
13
13
 
14
14
  Docs discovery order:
15
15
 
16
- 1. Current project dependency docs: `node_modules/@honeydeck/honeydeck/Readme.md`, `node_modules/@honeydeck/honeydeck/SPEC.md`, and `node_modules/@honeydeck/honeydeck/docs/*.md`.
17
- 2. Monorepo checkout docs: `packages/honeydeck/Readme.md`, `packages/honeydeck/SPEC.md`, and `packages/honeydeck/docs/*.md`.
18
- 3. Fresh app or package-root docs: `Readme.md`, `SPEC.md`, and `docs/*.md`.
19
- 4. Public docs URL when local docs are unavailable: `/docs` on the Honeydeck marketing site.
16
+ 1. Current project dependency docs: `node_modules/@honeydeck/honeydeck/docs/index.json`, `node_modules/@honeydeck/honeydeck/docs/*.md`, `node_modules/@honeydeck/honeydeck/Readme.md`, `node_modules/@honeydeck/honeydeck/SPEC.md`, and linked colocated `SPEC.md` files.
17
+ 2. Package-root checkout docs: `docs/index.json`, `docs/*.md`, `Readme.md`, `SPEC.md`, and linked colocated `SPEC.md` files.
18
+ 3. Public docs URL when local docs are unavailable: `https://honeydeck.dev/docs`.
20
19
 
21
20
  Important docs:
22
21
 
23
22
  - `Readme.md` for the compact package overview and documentation index
23
+ - `docs/index.json` for the installed docs page list and order
24
24
  - `docs/getting-started.md` for quick start and first-run orientation
25
25
  - `docs/deeper-dive.md` for CLI details, feature overview, architecture, exports, and agent skills
26
- - root/package `SPEC.md` and linked colocated `SPEC.md` files for expected behavior
26
+ - package `SPEC.md` and linked colocated `SPEC.md` files for expected behavior
27
27
  - `docs/slides.md` for deck structure, slide separators, and multi-file decks
28
- - `docs/steps-and-reveals.md` for step-by-step reveals and code steps
28
+ - `docs/steps-and-reveals.md` for step-by-step reveals, code steps, and Magic Code
29
29
  - `docs/customization.md` for themes, layouts, custom React components, layout maps, demos, and design tokens
30
30
  - `docs/configuration.md` for frontmatter options
31
31
  - `docs/navigation.md`, `docs/mobile.md`, `docs/presenter-mode.md`, and `docs/pdf-export.md` for presenting/exporting
32
32
 
33
- If the user is inside a generated Honeydeck project and package docs are not nearby, tell them they can use the public docs site for prose docs and run `npx honeydeck dev` to open runtime reference pages for active theme tokens, layouts, and built-in components.
33
+ If local package docs are unavailable, tell the user they can use the public docs site for prose docs and run `npx honeydeck dev` to open runtime reference pages for active theme tokens, layouts, and built-in components.
34
34
 
35
35
  ## Honeydeck basics to remember
36
36
 
@@ -42,7 +42,7 @@ If the user is inside a generated Honeydeck project and package docs are not nea
42
42
  - Frontmatter may provide additional properties for the selected layout. Check layout source or docs for available properties.
43
43
  - Built-in layouts include `Blank`, `Cover`, `Default`, `Section`, `TwoCol`, `Image`, `ImageLeft`, and `ImageRight`.
44
44
  - Built-in styling is explicit: generated decks import `./styles.css`, and that file imports Honeydeck/Tailwind theme CSS.
45
- - MDX can mix Markdown, JSX, imported React components, Honeydeck components, and code blocks.
45
+ - MDX can mix Markdown, JSX, imported React components, Honeydeck components, code blocks, and Magic Code blocks.
46
46
  - Presenter notes belong in slide frontmatter when useful for narrative, timing, and delivery cues.
47
47
  - Use reveals/steps for progressive disclosure, not for every bullet by default.
48
48
  - PDF export is available with `npx honeydeck pdf`; use `--steps all` when revealed states matter.
@@ -11,15 +11,15 @@ Start by reading all Honeydeck related skills available. Alternatively you can c
11
11
 
12
12
  ## Source of truth
13
13
 
14
- Before changing files, read the available project/package docs:
14
+ Before changing files, read the available project docs and package specs:
15
15
 
16
- - `Readme.md`, `docs/getting-started.md`, root `SPEC.md`, linked colocated `SPEC.md` files, and `docs/slides.md` for Honeydeck deck structure
17
- - `docs/configuration.md` for Honeydeck frontmatter
18
- - `docs/steps-and-reveals.md` for Reveal/RevealGroup/code steps
19
- - `docs/customization.md` for layouts, themes, components, layout maps, and design tokens
16
+ - `Readme.md`, public docs content under `packages/docs/content/docs` when in the monorepo, root `SPEC.md`, linked colocated `SPEC.md` files, and the Slides guide for Honeydeck deck structure
17
+ - The Configuration guide for Honeydeck frontmatter
18
+ - The Steps and reveals guide for Reveal/RevealGroup/code steps
19
+ - The Customization guide for layouts, themes, components, layout maps, and design tokens
20
20
  - Existing Slidev files: `slides.md`, `pages/**/*.md`, `components/**/*.vue`, `layouts/**/*.vue`, `styles/**`, `public/**`, `package.json`, `vite.config.*`, and local theme/addon packages
21
21
 
22
- If Honeydeck docs are not nearby, package docs may be in `node_modules/@honeydeck/honeydeck`, or the user can use the public docs site. A migrated deck's runtime reference pages cover active theme tokens, layouts, and built-in components.
22
+ If Honeydeck docs are not nearby, package specs may be in `node_modules/@honeydeck/honeydeck`, or the user can use the public docs site. A migrated deck's runtime reference pages cover active theme tokens, layouts, and built-in components.
23
23
 
24
24
  ## Migration goal
25
25
 
@@ -99,6 +99,7 @@ import { Reveal, RevealGroup, TimelineSteps, Notes, BrowserFrame } from '@honeyd
99
99
 
100
100
  - Keep normal fenced code blocks.
101
101
  - Convert common Slidev stepped highlights like `{1|2|3}` to Honeydeck-supported code step metadata when possible. If unsure, preserve the fence and leave a TODO comment near the block.
102
+ - Convert Slidev Magic Move code blocks (`md magic-move`) to Honeydeck's canonical Magic Code syntax (`md magic-code`). Preserve inner fenced code blocks and their line-highlight metadata. Honeydeck accepts `md magic-move` as a compatibility alias, but migrated decks should use `md magic-code`.
102
103
  - Slidev Monaco/live-code features need manual React components or simplified static code.
103
104
 
104
105
  ### Vue to React conversion
package/src/SPEC.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  ```ts
10
10
  // Core components
11
- import { Reveal, RevealGroup, TimelineSteps, ListStyle, Keyboard, BrowserFrame, Notes, ColorModeImage } from '@honeydeck/honeydeck'
11
+ import { Reveal, RevealWith, RevealGroup, Fade, FadeWith, FadeGroup, TimelineSteps, ListStyle, Keyboard, BrowserFrame, Notes, ColorModeImage } from '@honeydeck/honeydeck'
12
12
 
13
13
  // Types for kit authors
14
14
  import type { LayoutProps, LayoutMap, LayoutDemo } from '@honeydeck/honeydeck/types'
@@ -45,7 +45,11 @@ import {
45
45
  // Public component barrel
46
46
  import {
47
47
  Reveal as BarrelReveal,
48
+ RevealWith as BarrelRevealWith,
48
49
  RevealGroup as BarrelRevealGroup,
50
+ Fade as BarrelFade,
51
+ FadeWith as BarrelFadeWith,
52
+ FadeGroup as BarrelFadeGroup,
49
53
  TimelineSteps as BarrelTimelineSteps,
50
54
  ListStyle as BarrelListStyle,
51
55
  Keyboard as BarrelKeyboard,
@@ -55,8 +59,9 @@ import {
55
59
  } from '@honeydeck/honeydeck/components'
56
60
  import type { ColorMode } from '@honeydeck/honeydeck/components'
57
61
 
58
- // Reserved injected component (generated by Honeydeck remark plugins; not intended for manual slide author use)
59
- import { HoneydeckCodeBlock } from '@honeydeck/honeydeck/components/code-block'
62
+ // Reserved injected components (generated by Honeydeck remark plugins; not intended for manual slide author use)
63
+ import { HoneydeckCodeBlock } from '@honeydeck/honeydeck/components/code-block/normal'
64
+ import { HoneydeckMagicCodeBlock } from '@honeydeck/honeydeck/components/code-block/magic'
60
65
  ```
61
66
 
62
67
  ### Type Definitions
package/src/cli/SPEC.md CHANGED
@@ -214,8 +214,9 @@ PDF color mode resolves in this order:
214
214
 
215
215
  ### Step Handling
216
216
 
217
- - `pdfSteps: final` — each slide appears once, all reveals visible, code at final highlight
218
- - `pdfSteps: all` — step `0` through final step state are separate PDF pages
217
+ - `pdfSteps: final` — each slide appears once, all reveals visible, code at final highlight, and Magic Code at final code state/final highlight
218
+ - `pdfSteps: all` — step `0` through final step state are separate PDF pages, including Magic Code line-highlight states and morph states
219
+ - Magic Code is captured at the requested state, not mid-transition; PDF export disables Magic Move animation while preserving the selected timeline state
219
220
  - Capture order is slide order first; in `pdfSteps: all`, step states ascend within each slide. Parallel capture must not change this final PDF page order.
220
221
  - During `pdfSteps: final`, `useTimeline()` and `useTimelineSteps()` expose
221
222
  `isPdfFinalRender: true` so custom step-driven components can render an
package/src/cli/pdf.ts CHANGED
@@ -86,6 +86,10 @@ const __dirname = dirname(__filename);
86
86
  const FINAL_STEP_INDEX = 999;
87
87
  const MAX_PDF_CAPTURE_CONCURRENCY = 16;
88
88
 
89
+ function buildPdfRenderQuery(isPdfFinalRender: boolean): string {
90
+ return `?honeydeckPdfRender=${isPdfFinalRender ? "final" : "step"}`;
91
+ }
92
+
89
93
  // ---------------------------------------------------------------------------
90
94
  // Arg parsing
91
95
  // ---------------------------------------------------------------------------
@@ -342,7 +346,7 @@ function startStaticServer(dir: string): Promise<StaticServer> {
342
346
  * counts are identical to what the runtime reports.
343
347
  */
344
348
  async function getStepCounts(entryPath: string): Promise<number[]> {
345
- const { slides } = loadDeck(entryPath);
349
+ const { deckFrontmatter, slides } = loadDeck(entryPath);
346
350
 
347
351
  const counts: number[] = [];
348
352
 
@@ -353,7 +357,10 @@ async function getStepCounts(entryPath: string): Promise<number[]> {
353
357
  remarkFrontmatter,
354
358
  remarkH1Extract,
355
359
  remarkStepNumbering,
356
- remarkShikiCodeBlocks,
360
+ [
361
+ remarkShikiCodeBlocks,
362
+ { magicCodeDuration: deckFrontmatter.magicCodeDuration },
363
+ ],
357
364
  ],
358
365
  jsxImportSource: "react",
359
366
  outputFormat: "program",
@@ -498,7 +505,7 @@ async function captureSlide(
498
505
  getPageError: () => Error | null,
499
506
  ): Promise<Buffer> {
500
507
  if (firstLoad) {
501
- const pdfRenderQuery = isPdfFinalRender ? "?honeydeckPdfRender=final" : "";
508
+ const pdfRenderQuery = buildPdfRenderQuery(isPdfFinalRender);
502
509
 
503
510
  // Full navigation: boots the SPA and waits for network to settle.
504
511
  await page.goto(`${serverUrl}/${pdfRenderQuery}#/${slide}/${step}`, {
@@ -537,7 +544,7 @@ async function prepareCapturePage(
537
544
  isPdfFinalRender: boolean,
538
545
  getPageError: () => Error | null,
539
546
  ): Promise<void> {
540
- const pdfRenderQuery = isPdfFinalRender ? "?honeydeckPdfRender=final" : "";
547
+ const pdfRenderQuery = buildPdfRenderQuery(isPdfFinalRender);
541
548
 
542
549
  await page.goto(`${serverUrl}/${pdfRenderQuery}#/1/0`, {
543
550
  waitUntil: "networkidle",
@@ -1,6 +1,22 @@
1
1
  # Honeydeck Remark Transform Specification
2
2
 
3
- > Observable behavior for code highlighting transforms.
3
+ > Observable behavior for timeline annotation and code highlighting transforms.
4
+
5
+ ## Timeline Step Annotation
6
+
7
+ Honeydeck's remark pipeline assigns slide-local timeline metadata to built-in components before MDX is compiled.
8
+
9
+ Behavior:
10
+
11
+ - `<Reveal>` consumes one timeline step in document order and receives an internal `at` prop for runtime visibility. Author-authored `at` on `<Reveal>` is a compile error; use `<RevealWith at={n}>` for same-step synchronization.
12
+ - `<RevealGroup>` consumes one step per meaningful direct child/list item, including nested timeline gaps, and receives internal `at`/target metadata for runtime visibility. Author-authored `at` on `<RevealGroup>` is a compile error; use `<RevealWith at={n}>` for same-step synchronization.
13
+ - `<RevealWith>` consumes no timeline steps. It receives an internal resolved `at` prop based on either a same-slide `<Reveal name="...">` target or a literal numeric `at={n}` target.
14
+ - Named reveal targets are slide-local. Duplicate `<Reveal name="...">` values on the same slide are compile errors; reuse across slides is allowed.
15
+ - `<RevealWith target="...">` supports forward references to named reveals anywhere on the same slide.
16
+ - `<RevealWith>` requires exactly one of `target` or `at`; both and neither are compile errors.
17
+ - `Reveal` `name`, `RevealWith` `target`, and `RevealWith` `at` must be literal values. Empty names/targets, non-positive numeric `at`, and numeric `at` values greater than the slide's final step count are compile errors.
18
+ - `RevealWith at={n}` can target any existing slide timeline step, including code, Magic Code, `RevealGroup`, and `TimelineSteps` steps.
19
+ - Flow/block usages of `<Reveal>` and `<RevealWith>` receive an internal block wrapper marker; text/inline usages receive an internal inline wrapper marker so compiled HTML remains valid.
4
20
 
5
21
  ## Code Highlighting
6
22
 
@@ -34,15 +50,99 @@ Syntax:
34
50
  - Each active code group highlights only the specified lines (non-cumulative)
35
51
  - Non-highlighted lines are dimmed (`--honeydeck-code-line-dim-opacity`)
36
52
  - Dimming is applied by Honeydeck runtime markup/styles independently of Tailwind utility generation
37
- - Code steps participate in the same slide timeline as `Reveal` components
53
+ - Code steps participate in the same slide timeline as `Reveal`, `Fade`, `RevealGroup`, and `FadeGroup` components
54
+ - `RevealWith` and `FadeWith` never add timeline steps; they only watch existing steps through `target`
55
+ - `RevealWith`, `FadeWith`, `Fade`, and `FadeGroup` targets reject nested timeline producers
38
56
  - Unsupported/failed languages render as plain code using Honeydeck CSS tokens
39
57
  - Code blocks expose a hover/focus copy control that copies the original fenced code text, not the highlighted HTML
40
58
 
59
+ ## Magic Code
60
+
61
+ Honeydeck supports **Magic Code** as built-in Markdown syntax for animated transitions between code states. Magic Code builds on Shiki Magic Code / Shiki Magic Move, but Honeydeck precompiles the highlighted token data at build time.
62
+
63
+ Canonical syntax:
64
+
65
+ `````mdx
66
+ ````md magic-code {duration:500}
67
+ ```ts
68
+ const count = 1
69
+ ```
70
+
71
+ ```ts
72
+ const count = 2
73
+ ```
74
+ ````
75
+ `````
76
+
77
+ Compatibility alias:
78
+
79
+ `````mdx
80
+ ````md magic-move
81
+ ```ts
82
+ const count = 1
83
+ ```
84
+
85
+ ```ts
86
+ const count = 2
87
+ ```
88
+ ````
89
+ `````
90
+
91
+ Rules:
92
+
93
+ - Magic Code is triggered only by an outer `md` fence whose first metadata token is `magic-code` or `magic-move`.
94
+ - `magic-code` is Honeydeck's canonical syntax. `magic-move` is a silent compatibility alias for Slidev migration.
95
+ - Documentation and generated examples use `magic-code`.
96
+ - The only supported block option is `{duration:<number>}` in milliseconds.
97
+ - Duration resolution is block option, then deck-level `magicCodeDuration`, then Honeydeck default `800`.
98
+ - Slide-level frontmatter does not configure Magic Code.
99
+ - Unknown outer extras/options are ignored. An explicit invalid `duration` is a compile error.
100
+ - Only inner fenced code blocks produce output. Other Markdown inside the Magic Code block is ignored.
101
+ - Zero inner code fences render nothing and add no timeline steps.
102
+ - One inner code fence renders one code state with normal Honeydeck code highlighting/step behavior.
103
+ - Two or more inner code fences render one animated code block backed by build-time precompiled Shiki Magic Move token data for Honeydeck's built-in light and dark syntax themes.
104
+ - Inner code fences keep normal Honeydeck code fence behavior, including language selection and line-highlight metadata.
105
+ - Inner code fences may use different languages, though animations are expected to look best when states use the same language.
106
+ - Magic Code uses the same visual treatment and copy affordance as normal Honeydeck code blocks.
107
+ - Copying copies the currently visible code text. Highlight-only steps copy the same code text; morph steps copy the active state's code text.
108
+
109
+ Timeline behavior:
110
+
111
+ - Each inner code fence contributes its normal line-highlight states.
112
+ - Magic Code advances through the current code state's line-highlight groups before morphing to the next code state.
113
+ - The target state's baseline line highlight is active immediately when the morph state becomes current.
114
+ - `total timeline states = sum(inner fence highlight groups)`.
115
+ - `timeline steps added = total timeline states - 1`.
116
+
117
+ Example:
118
+
119
+ `````mdx
120
+ ````md magic-code
121
+ ```ts {1|2}
122
+ const a = 1
123
+ const b = 2
124
+ ```
125
+
126
+ ```ts {all}
127
+ const sum = a + b
128
+ ```
129
+ ````
130
+ `````
131
+
132
+ Timeline:
133
+
134
+ 1. First code state, line 1 highlighted
135
+ 2. First code state, line 2 highlighted
136
+ 3. Morph to second code state, all lines highlighted
137
+
41
138
  ### Visual Style
42
139
 
43
140
  - Highlighted lines: normal brightness
44
141
  - Non-highlighted lines: dimmed (reduced opacity)
45
142
  - No background stripe
143
+ - Magic Code uses the same code block surface, syntax colors, typography, light/dark behavior, and copy button as normal code blocks
144
+ - Honeydeck ships the Shiki Magic Move transition CSS through its base theme CSS; deck authors do not import Magic Move CSS manually
145
+ - Magic Code does not render filename/title chrome in v1
46
146
 
47
147
  ### Theme
48
148