@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.
- package/AGENTS.md +4 -4
- package/DEVELOPMENT.md +6 -4
- package/Readme.md +15 -15
- package/SPEC.md +5 -4
- package/docs/browser-frame.md +38 -0
- package/docs/components.md +16 -57
- package/docs/configuration.md +13 -0
- package/docs/customization.md +2 -0
- package/docs/deeper-dive.md +32 -7
- package/docs/getting-started.md +4 -2
- package/docs/index.json +258 -0
- package/docs/keyboard.md +35 -0
- package/docs/list-style.md +53 -0
- package/docs/local-development.md +3 -1
- package/docs/mermaid.md +2 -0
- package/docs/mobile.md +2 -0
- package/docs/navigation.md +3 -1
- package/docs/notes.md +40 -0
- package/docs/pdf-export.md +6 -2
- package/docs/presenter-mode.md +8 -3
- package/docs/reveal-group.md +60 -0
- package/docs/reveal-with.md +39 -0
- package/docs/reveal.md +35 -0
- package/docs/skills.md +5 -3
- package/docs/slides.md +2 -0
- package/docs/slidev-migration.md +5 -0
- package/docs/steps-and-reveals.md +145 -8
- package/docs/timeline-steps.md +50 -0
- package/package.json +6 -2
- package/skills/SPEC.md +6 -6
- package/skills/honeydeck/SKILL.md +9 -9
- package/skills/slidev-migration/SKILL.md +7 -6
- package/src/SPEC.md +8 -3
- package/src/cli/SPEC.md +3 -2
- package/src/cli/pdf.ts +11 -4
- package/src/remark/SPEC.md +102 -2
- package/src/remark/code-utils.ts +151 -0
- package/src/remark/shiki-code-blocks.ts +329 -136
- package/src/remark/step-numbering.ts +408 -103
- package/src/runtime/Deck.tsx +133 -116
- package/src/runtime/EffectiveColorModeContext.tsx +37 -0
- package/src/runtime/SPEC.md +21 -8
- package/src/runtime/SlideCanvas.tsx +19 -16
- package/src/runtime/SlideScaleContext.tsx +23 -0
- package/src/runtime/components/CodeBlock.tsx +19 -202
- package/src/runtime/components/CodeBlockCopyButton.tsx +64 -0
- package/src/runtime/components/CodeBlockShared.ts +17 -0
- package/src/runtime/components/Fade.tsx +51 -0
- package/src/runtime/components/FadeGroup.tsx +175 -0
- package/src/runtime/components/FadeWith.tsx +54 -0
- package/src/runtime/components/MagicCodeBlock.tsx +223 -0
- package/src/runtime/components/NavBar.tsx +1 -1
- package/src/runtime/components/NormalCodeBlock.tsx +128 -0
- package/src/runtime/components/Reveal.tsx +27 -27
- package/src/runtime/components/RevealGroup.tsx +143 -41
- package/src/runtime/components/RevealWith.tsx +63 -0
- package/src/runtime/components/SPEC.md +115 -10
- package/src/runtime/components/TimelineReveal.tsx +81 -0
- package/src/runtime/components/index.ts +13 -5
- package/src/runtime/components/timelineVisibility.ts +45 -0
- package/src/runtime/index.ts +9 -1
- package/src/runtime/navigation.ts +6 -4
- package/src/runtime/presentationApi.ts +449 -0
- package/src/runtime/views/PresenterCastButton.tsx +39 -0
- package/src/runtime/views/PresenterView.tsx +21 -4
- package/src/runtime/views/SPEC.md +7 -5
- package/src/theme/base.css +67 -2
- package/src/vite-plugin/SPEC.md +20 -2
- package/src/vite-plugin/index.ts +16 -2
- package/src/vite-plugin/splitter.ts +1 -0
- package/src/vite-plugin/virtual-modules.ts +16 -6
package/docs/slidev-migration.md
CHANGED
|
@@ -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,
|
|
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
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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,
|
|
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 (`
|
|
17
|
-
- The `honeydeck` skill documents a local docs discovery order: current project's `node_modules/@honeydeck/honeydeck
|
|
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.
|
|
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
|
|
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/
|
|
17
|
-
2.
|
|
18
|
-
3.
|
|
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
|
-
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
14
|
+
Before changing files, read the available project docs and package specs:
|
|
15
15
|
|
|
16
|
-
- `Readme.md`, `docs/
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
547
|
+
const pdfRenderQuery = buildPdfRenderQuery(isPdfFinalRender);
|
|
541
548
|
|
|
542
549
|
await page.goto(`${serverUrl}/${pdfRenderQuery}#/1/0`, {
|
|
543
550
|
waitUntil: "networkidle",
|
package/src/remark/SPEC.md
CHANGED
|
@@ -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
|
|