Some checks failed
Deploy analytics worker / Deploy analytics worker to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
i18n upload strings / Upload latest strings (push) Failing after 1s
Deploy bemo / Deploy bemo to ${{ (github.ref == 'refs/heads/bemo-production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
Deploy grafana resources / ${{ github.event_name == 'push' && 'Deploy grafana resources' || 'Validate grafana resources (dry run)' }} (push) Failing after 0s
End to end tests (dotcom) / Check for relevant changes (push) Failing after 0s
End to end tests (examples) / Check for relevant changes (push) Failing after 0s
End to end tests (mermaid readability) / Check for relevant changes (push) Failing after 1s
End to end tests (perf) / Check for relevant changes (push) Failing after 0s
Publish editor extensions / Publish editor extensions (push) Failing after 1s
Publish SDK packages / Remove the publish-packages label (push) Has been skipped
Checks / Tests & checks (push) Has been cancelled
Checks / Build all projects (push) Has been cancelled
Deploy templates / Deploy templates (push) Has been cancelled
End to end tests (dotcom) / End to end tests (dotcom) (push) Has been cancelled
End to end tests (mermaid readability) / End to end tests (mermaid readability) (push) Has been cancelled
End to end tests (perf) / End to end tests (perf) (push) Has been cancelled
Deploy .com / Deploy dotcom to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Has been cancelled
End to end tests (examples) / End to end tests (examples) (push) Has been cancelled
Publish SDK packages / Publish SDK packages (push) Has been cancelled
Publish SDK packages / Tell user released version (push) Has been cancelled
Publish SDK packages / Publishes code templates to separate repositories (push) Has been cancelled
Publish SDK packages / Deploys the template demos with the new SDK version (push) Has been cancelled
139 lines
5.4 KiB
Markdown
139 lines
5.4 KiB
Markdown
# Manifest format
|
|
|
|
The manifest is a JSON file describing every slide in the video. It bridges the narration/audio step and the hyperframes renderer. Referenced from step 4 of `../SKILL.md`.
|
|
|
|
|
|
Read the `durations.json` from step 3 to get the duration (in seconds) for each audio clip. Then write a `manifest.json` alongside the audio files:
|
|
|
|
```json
|
|
{
|
|
"pr": 7865,
|
|
"slides": [
|
|
{
|
|
"type": "intro",
|
|
"title": "Fix canvas-in-front z-index layering #7865",
|
|
"date": "February 14, 2026",
|
|
"audio": "audio-00.wav",
|
|
"durationInSeconds": 3.2
|
|
},
|
|
{
|
|
"type": "diff",
|
|
"filename": "packages/editor/editor.css",
|
|
"language": "css",
|
|
"diff": "@@ -12,7 +12,7 @@\n --tl-z-canvas: 100;\n- --tl-z-canvas-in-front: 600;\n+ --tl-z-canvas-in-front: 250;\n --tl-z-shapes: 300;",
|
|
"audio": "audio-01.wav",
|
|
"durationInSeconds": 25.8
|
|
},
|
|
{
|
|
"type": "code",
|
|
"filename": "packages/editor/src/lib/Editor.ts",
|
|
"language": "typescript",
|
|
"code": "function getZIndex() {\n return 250\n}",
|
|
"audio": "audio-02.wav",
|
|
"durationInSeconds": 13.5
|
|
},
|
|
{
|
|
"type": "text",
|
|
"title": "Summary",
|
|
"subtitle": "Moved canvas-in-front from z-index 600 to 250.",
|
|
"audio": "audio-07.wav",
|
|
"durationInSeconds": 7.4
|
|
},
|
|
{
|
|
"type": "list",
|
|
"title": "Key changes",
|
|
"items": ["Lowered z-index", "Updated tests", "Added migration"],
|
|
"audio": "audio-06.wav",
|
|
"durationInSeconds": 10.2
|
|
},
|
|
{
|
|
"type": "outro",
|
|
"durationInSeconds": 3
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
#### Slide types
|
|
|
|
| Type | Required fields | Description |
|
|
| --------- | ------------------------------------------------------------ | ---------------------------------- |
|
|
| `intro` | `title`, `date`, `audio`, `durationInSeconds` | Logo + title + date |
|
|
| `diff` | `filename`, `language`, `diff`, `audio`, `durationInSeconds` | Syntax-highlighted unified diff |
|
|
| `code` | `filename`, `language`, `code`, `audio`, `durationInSeconds` | Syntax-highlighted source code |
|
|
| `text` | `title`, `audio`, `durationInSeconds` | Title + optional `subtitle` |
|
|
| `list` | `title`, `items`, `audio`, `durationInSeconds` | Title + numbered items |
|
|
| `image` | `src`, `audio`, `durationInSeconds` | Pre-rendered image (fallback) |
|
|
| `segment` | `title`, `durationInSeconds` | Silent title card between segments |
|
|
| `outro` | `durationInSeconds` | Logo only, no audio |
|
|
|
|
#### Animated scroll with `focus`
|
|
|
|
For longer diffs or code (more than ~30 lines), the renderer keeps the font at a readable 16px and uses an animated viewport that scrolls between focus points. Add a `focus` array to `diff` or `code` slides:
|
|
|
|
```json
|
|
{
|
|
"type": "diff",
|
|
"filename": "packages/editor/src/lib/Editor.ts",
|
|
"language": "typescript",
|
|
"diff": "... 60-line diff ...",
|
|
"focus": [
|
|
{ "line": 3, "at": 0 },
|
|
{ "line": 25, "at": 0.4 },
|
|
{ "line": 50, "at": 0.8 }
|
|
],
|
|
"audio": "audio-03.wav",
|
|
"durationInSeconds": 30
|
|
}
|
|
```
|
|
|
|
- **`line`** — The line number (0-indexed into the parsed diff/code lines) to center on screen.
|
|
- **`at`** — When to arrive at this position, as a fraction of the slide's duration (0 = start, 1 = end).
|
|
|
|
The viewport smoothly eases between focus points. Before the first point, it holds at the first position; after the last, it holds there.
|
|
|
|
**When to use focus:** Any diff or code slide with more than ~30 lines. Without focus, long content starts at the top and stays static — the viewer can't see the bottom. With focus, you guide the viewer's eye to the code being discussed at each moment.
|
|
|
|
**When to omit focus:** Short diffs (≤30 lines) fit on screen at 16px and don't need scrolling.
|
|
|
|
#### Writing diff fields
|
|
|
|
For `diff` slides, paste the **unified diff** for the relevant hunk(s). This is the output of `git diff` for that section of the file — including the `@@` hunk header and `+`/`-`/` ` line prefixes. The renderer parses these prefixes to apply green/red backgrounds and syntax highlighting.
|
|
|
|
To get a diff for a specific file:
|
|
|
|
```bash
|
|
git diff main..HEAD -- path/to/file.ts
|
|
```
|
|
|
|
Include only the relevant hunks, not the entire file diff. Strip the `diff --git` and `---`/`+++` header lines — start from the `@@` hunk header.
|
|
|
|
For `code` slides, paste the relevant source code (a function, a class, a section). No diff prefixes needed.
|
|
|
|
#### Segment title slides
|
|
|
|
Insert a **`segment` slide** before each content segment to introduce it — except before the intro and context/overview segments. This includes code walkthrough segments and the summary/conclusion. Each segment slide is **3 seconds of silence** with the segment title centered on screen.
|
|
|
|
```json
|
|
{
|
|
"type": "segment",
|
|
"title": "Zoom state machine",
|
|
"durationInSeconds": 3
|
|
}
|
|
```
|
|
|
|
These provide clear visual breaks between sections and give the viewer a moment to orient before each new topic.
|
|
|
|
#### Segment title labels on code/diff slides
|
|
|
|
Add a `title` field to `code` and `diff` slides to show a small label in the top-left corner identifying which segment the viewer is in. Use the same title as the preceding `segment` slide. This helps orient viewers, especially when a segment spans multiple slides.
|
|
|
|
```json
|
|
{
|
|
"type": "diff",
|
|
"title": "Zoom state machine",
|
|
"filename": "packages/editor/src/lib/ZoomTool.ts",
|
|
...
|
|
}
|
|
```
|