@anvpx/motion 0.0.0-stage → 0.1.1

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 (249) hide show
  1. package/CATALOG.md +301 -0
  2. package/LICENSE +21 -0
  3. package/README.md +95 -2
  4. package/assets.json +37 -0
  5. package/dist/index.d.ts +1 -0
  6. package/dist/index.js +1 -0
  7. package/dist/main.d.ts +2 -0
  8. package/dist/main.js +46 -0
  9. package/icons/LICENSE-lucide +43 -0
  10. package/icons/icons.json +2711 -0
  11. package/icons/licences.json +1521 -0
  12. package/luts/LICENSE-CC0.txt +20 -0
  13. package/luts/cool.cube +520 -0
  14. package/luts/noir.cube +520 -0
  15. package/luts/warm.cube +520 -0
  16. package/music/LICENSE-CC0.txt +32 -0
  17. package/music/bed-full.wav +0 -0
  18. package/music/bed.wav +0 -0
  19. package/package.json +69 -3
  20. package/packs/INDEX.md +22 -0
  21. package/packs/painted/checklist.md +30 -0
  22. package/packs/painted/examples/dry-ink/storyboard.json +88 -0
  23. package/packs/painted/examples/oil/storyboard.json +89 -0
  24. package/packs/painted/examples/shape-carry/storyboard.json +112 -0
  25. package/packs/painted/examples/stacked-beat/storyboard.json +106 -0
  26. package/packs/painted/examples/staged-read/storyboard.json +105 -0
  27. package/packs/painted/examples/watercolour/storyboard.json +79 -0
  28. package/packs/painted/look.md +71 -0
  29. package/packs/painted/pack.json +46 -0
  30. package/packs/painted/review.md +12 -0
  31. package/packs/painted/voice.md +30 -0
  32. package/plugins/motion-kit/.claude-plugin/plugin.json +5 -0
  33. package/plugins/motion-kit/README.md +39 -0
  34. package/plugins/motion-kit/commands/mk-draft.md +13 -0
  35. package/plugins/motion-kit/commands/mk-new.md +15 -0
  36. package/plugins/motion-kit/commands/mk-render.md +14 -0
  37. package/plugins/motion-kit/skills/motion-kit/SKILL.md +81 -0
  38. package/plugins/motion-kit/skills/motion-kit/references/authoring-scene.md +48 -0
  39. package/plugins/motion-kit/skills/motion-kit/references/authoring-style.md +19 -0
  40. package/plugins/motion-kit/skills/motion-kit/references/common-mistakes.md +73 -0
  41. package/plugins/motion-kit/skills/motion-kit/references/content-pack.md +69 -0
  42. package/plugins/motion-kit/skills/motion-kit/references/craft-color.md +50 -0
  43. package/plugins/motion-kit/skills/motion-kit/references/craft-composition.md +52 -0
  44. package/plugins/motion-kit/skills/motion-kit/references/craft-critique.md +68 -0
  45. package/plugins/motion-kit/skills/motion-kit/references/craft-motion.md +55 -0
  46. package/plugins/motion-kit/skills/motion-kit/references/craft-narrative.md +54 -0
  47. package/plugins/motion-kit/skills/motion-kit/references/craft-sound.md +53 -0
  48. package/plugins/motion-kit/skills/motion-kit/references/craft-type.md +54 -0
  49. package/plugins/motion-kit/skills/motion-kit/references/critique-repair.md +46 -0
  50. package/plugins/motion-kit/skills/motion-kit/references/decision-packet.md +59 -0
  51. package/plugins/motion-kit/skills/motion-kit/references/direction.md +84 -0
  52. package/plugins/motion-kit/skills/motion-kit/references/faux-ui.md +39 -0
  53. package/plugins/motion-kit/skills/motion-kit/references/free-storyboard.md +15 -0
  54. package/plugins/motion-kit/skills/motion-kit/references/intake.md +44 -0
  55. package/plugins/motion-kit/skills/motion-kit/references/knowledge-routing.md +58 -0
  56. package/plugins/motion-kit/skills/motion-kit/references/outline.md +34 -0
  57. package/plugins/motion-kit/skills/motion-kit/references/patching.md +50 -0
  58. package/plugins/motion-kit/skills/motion-kit/references/patterns.md +55 -0
  59. package/plugins/motion-kit/skills/motion-kit/references/quality-bar.md +61 -0
  60. package/plugins/motion-kit/skills/motion-kit/references/review.md +8 -0
  61. package/plugins/motion-kit/skills/motion-kit/references/scene-recipes.md +300 -0
  62. package/plugins/motion-kit/skills/motion-kit/references/setup.md +16 -0
  63. package/plugins/motion-kit/skills/motion-kit/references/slop.md +40 -0
  64. package/plugins/motion-kit/skills/motion-kit/references/storyboard-json.md +121 -0
  65. package/plugins/motion-kit/skills/motion-kit/references/themes.md +15 -0
  66. package/plugins/motion-kit/skills/motion-kit/references/troubleshooting.md +55 -0
  67. package/plugins/motion-kit/skills/motion-kit/references/voice.md +61 -0
  68. package/plugins/motion-kit/skills/motion-kit/references/worked-decisions.md +178 -0
  69. package/plugins/motion-kit/skills/motion-kit/references/worked-example.md +170 -0
  70. package/shared/themes/README.md +5 -0
  71. package/shared/themes/bold-dark.json +362 -0
  72. package/shared/themes/bold-light.json +362 -0
  73. package/shared/themes/calm-dark.json +362 -0
  74. package/shared/themes/calm-light.json +362 -0
  75. package/shared/themes/data-dark.json +360 -0
  76. package/shared/themes/data-light.json +360 -0
  77. package/shared/themes/editorial-dark.json +353 -0
  78. package/shared/themes/editorial-light.json +353 -0
  79. package/shared/themes/fjord-dark.json +124 -0
  80. package/shared/themes/fjord-light.json +124 -0
  81. package/shared/themes/playful-dark.json +362 -0
  82. package/shared/themes/playful-light.json +362 -0
  83. package/shared/themes/pop-dark.json +352 -0
  84. package/shared/themes/pop-light.json +352 -0
  85. package/shared/themes/tech-dark.json +360 -0
  86. package/shared/themes/tech-light.json +360 -0
  87. package/shared/themes/warm-dark.json +368 -0
  88. package/shared/themes/warm-light.json +368 -0
  89. package/skills/motion-kit/SKILL.md +81 -0
  90. package/skills/motion-kit/references/authoring-scene.md +48 -0
  91. package/skills/motion-kit/references/authoring-style.md +19 -0
  92. package/skills/motion-kit/references/common-mistakes.md +73 -0
  93. package/skills/motion-kit/references/content-pack.md +69 -0
  94. package/skills/motion-kit/references/craft-color.md +50 -0
  95. package/skills/motion-kit/references/craft-composition.md +52 -0
  96. package/skills/motion-kit/references/craft-critique.md +68 -0
  97. package/skills/motion-kit/references/craft-motion.md +55 -0
  98. package/skills/motion-kit/references/craft-narrative.md +54 -0
  99. package/skills/motion-kit/references/craft-sound.md +53 -0
  100. package/skills/motion-kit/references/craft-type.md +54 -0
  101. package/skills/motion-kit/references/critique-repair.md +46 -0
  102. package/skills/motion-kit/references/decision-packet.md +59 -0
  103. package/skills/motion-kit/references/direction.md +84 -0
  104. package/skills/motion-kit/references/faux-ui.md +39 -0
  105. package/skills/motion-kit/references/free-storyboard.md +15 -0
  106. package/skills/motion-kit/references/intake.md +44 -0
  107. package/skills/motion-kit/references/knowledge-routing.md +58 -0
  108. package/skills/motion-kit/references/outline.md +34 -0
  109. package/skills/motion-kit/references/patching.md +50 -0
  110. package/skills/motion-kit/references/patterns.md +55 -0
  111. package/skills/motion-kit/references/quality-bar.md +61 -0
  112. package/skills/motion-kit/references/review.md +8 -0
  113. package/skills/motion-kit/references/scene-recipes.md +300 -0
  114. package/skills/motion-kit/references/setup.md +16 -0
  115. package/skills/motion-kit/references/slop.md +40 -0
  116. package/skills/motion-kit/references/storyboard-json.md +121 -0
  117. package/skills/motion-kit/references/themes.md +15 -0
  118. package/skills/motion-kit/references/troubleshooting.md +55 -0
  119. package/skills/motion-kit/references/voice.md +61 -0
  120. package/skills/motion-kit/references/worked-decisions.md +178 -0
  121. package/skills/motion-kit/references/worked-example.md +170 -0
  122. package/stopwords.json +65 -0
  123. package/templates/compare/blueprints/versus.json +79 -0
  124. package/templates/compare/copy.md +18 -0
  125. package/templates/compare/pacing.json +15 -0
  126. package/templates/compare/previews/versus.png +0 -0
  127. package/templates/compare/styles/editorial.json +6 -0
  128. package/templates/compare/styles/punchy.json +6 -0
  129. package/templates/compare/styles/tidy.json +6 -0
  130. package/templates/compare/template.json +52 -0
  131. package/templates/datastory/blueprints/data-story.json +95 -0
  132. package/templates/datastory/blueprints/infographic.json +106 -0
  133. package/templates/datastory/blueprints/trend.json +93 -0
  134. package/templates/datastory/copy.md +16 -0
  135. package/templates/datastory/pacing.json +17 -0
  136. package/templates/datastory/previews/data-story.png +0 -0
  137. package/templates/datastory/previews/infographic.png +0 -0
  138. package/templates/datastory/previews/trend.png +0 -0
  139. package/templates/datastory/styles/clear.json +6 -0
  140. package/templates/datastory/styles/editorial.json +6 -0
  141. package/templates/datastory/styles/pop.json +7 -0
  142. package/templates/datastory/template.json +57 -0
  143. package/templates/event/blueprints/promo.json +71 -0
  144. package/templates/event/blueprints/save-the-date.json +61 -0
  145. package/templates/event/copy.md +16 -0
  146. package/templates/event/pacing.json +15 -0
  147. package/templates/event/previews/promo.png +0 -0
  148. package/templates/event/previews/save-the-date.png +0 -0
  149. package/templates/event/styles/bright.json +6 -0
  150. package/templates/event/styles/pop.json +6 -0
  151. package/templates/event/template.json +37 -0
  152. package/templates/explain/blueprints/architecture.json +76 -0
  153. package/templates/explain/blueprints/concept.json +89 -0
  154. package/templates/explain/blueprints/howto.json +56 -0
  155. package/templates/explain/blueprints/overview.json +126 -0
  156. package/templates/explain/copy.md +19 -0
  157. package/templates/explain/pacing.json +19 -0
  158. package/templates/explain/previews/architecture.png +0 -0
  159. package/templates/explain/previews/concept.png +0 -0
  160. package/templates/explain/previews/howto.png +0 -0
  161. package/templates/explain/previews/overview.png +0 -0
  162. package/templates/explain/styles/calm.json +6 -0
  163. package/templates/explain/styles/crisp.json +6 -0
  164. package/templates/explain/template.json +64 -0
  165. package/templates/guide/blueprints/lesson.json +173 -0
  166. package/templates/guide/blueprints/onboarding.json +80 -0
  167. package/templates/guide/blueprints/tutorial.json +102 -0
  168. package/templates/guide/copy.md +17 -0
  169. package/templates/guide/pacing.json +59 -0
  170. package/templates/guide/previews/lesson.png +0 -0
  171. package/templates/guide/previews/onboarding.png +0 -0
  172. package/templates/guide/previews/tutorial.png +0 -0
  173. package/templates/guide/styles/calm.json +15 -0
  174. package/templates/guide/styles/friendly.json +15 -0
  175. package/templates/guide/styles/techdark.json +15 -0
  176. package/templates/guide/template.json +95 -0
  177. package/templates/pitch/blueprints/feature.json +134 -0
  178. package/templates/pitch/blueprints/launch.json +173 -0
  179. package/templates/pitch/blueprints/pricing.json +141 -0
  180. package/templates/pitch/copy.md +18 -0
  181. package/templates/pitch/pacing.json +59 -0
  182. package/templates/pitch/previews/feature.png +0 -0
  183. package/templates/pitch/previews/launch.png +0 -0
  184. package/templates/pitch/previews/pricing.png +0 -0
  185. package/templates/pitch/styles/polished.json +6 -0
  186. package/templates/pitch/styles/punchy.json +6 -0
  187. package/templates/pitch/styles/teaser.json +12 -0
  188. package/templates/pitch/template.json +45 -0
  189. package/templates/recap/blueprints/news-recap.json +62 -0
  190. package/templates/recap/blueprints/timeline-story.json +94 -0
  191. package/templates/recap/copy.md +16 -0
  192. package/templates/recap/pacing.json +16 -0
  193. package/templates/recap/previews/news-recap.png +0 -0
  194. package/templates/recap/previews/timeline-story.png +0 -0
  195. package/templates/recap/styles/editorial.json +6 -0
  196. package/templates/recap/styles/editorialdark.json +6 -0
  197. package/templates/recap/template.json +50 -0
  198. package/templates/report/blueprints/kpi-review.json +116 -0
  199. package/templates/report/blueprints/status.json +78 -0
  200. package/templates/report/copy.md +17 -0
  201. package/templates/report/pacing.json +16 -0
  202. package/templates/report/previews/kpi-review.png +0 -0
  203. package/templates/report/previews/status.png +0 -0
  204. package/templates/report/styles/exec.json +6 -0
  205. package/templates/report/styles/memo.json +6 -0
  206. package/templates/report/styles/walkthrough.json +6 -0
  207. package/templates/report/template.json +56 -0
  208. package/templates/social/blueprints/announce.json +109 -0
  209. package/templates/social/blueprints/listicle.json +117 -0
  210. package/templates/social/blueprints/tip.json +114 -0
  211. package/templates/social/copy.md +18 -0
  212. package/templates/social/pacing.json +49 -0
  213. package/templates/social/previews/announce.png +0 -0
  214. package/templates/social/previews/listicle.png +0 -0
  215. package/templates/social/previews/tip.png +0 -0
  216. package/templates/social/styles/captioned.json +18 -0
  217. package/templates/social/styles/hook-first.json +15 -0
  218. package/templates/social/styles/techcut.json +15 -0
  219. package/templates/social/template.json +94 -0
  220. package/templates/update/blueprints/announcement.json +57 -0
  221. package/templates/update/blueprints/changelog.json +157 -0
  222. package/templates/update/blueprints/release-notes.json +151 -0
  223. package/templates/update/blueprints/weekly-update.json +88 -0
  224. package/templates/update/copy.md +17 -0
  225. package/templates/update/pacing.json +64 -0
  226. package/templates/update/previews/announcement.png +0 -0
  227. package/templates/update/previews/changelog.png +0 -0
  228. package/templates/update/previews/release-notes.png +0 -0
  229. package/templates/update/previews/weekly-update.png +0 -0
  230. package/templates/update/styles/punchy.json +15 -0
  231. package/templates/update/styles/techdark.json +6 -0
  232. package/templates/update/styles/tidy.json +6 -0
  233. package/templates/update/template.json +67 -0
  234. package/templates/vista/blueprints/spotlight.json +68 -0
  235. package/templates/vista/blueprints/tour.json +84 -0
  236. package/templates/vista/copy.md +18 -0
  237. package/templates/vista/pacing.json +14 -0
  238. package/templates/vista/previews/spotlight.png +0 -0
  239. package/templates/vista/previews/tour.png +0 -0
  240. package/templates/vista/styles/bright.json +6 -0
  241. package/templates/vista/styles/cinematic.json +6 -0
  242. package/templates/vista/template.json +42 -0
  243. package/templates/walkthrough/blueprints/product-tour.json +107 -0
  244. package/templates/walkthrough/copy.md +16 -0
  245. package/templates/walkthrough/pacing.json +16 -0
  246. package/templates/walkthrough/previews/product-tour.png +0 -0
  247. package/templates/walkthrough/styles/calm.json +6 -0
  248. package/templates/walkthrough/styles/deep.json +6 -0
  249. package/templates/walkthrough/template.json +37 -0
package/stopwords.json ADDED
@@ -0,0 +1,65 @@
1
+ [
2
+ "a",
3
+ "an",
4
+ "and",
5
+ "are",
6
+ "as",
7
+ "at",
8
+ "be",
9
+ "but",
10
+ "by",
11
+ "for",
12
+ "from",
13
+ "has",
14
+ "have",
15
+ "how",
16
+ "i",
17
+ "in",
18
+ "into",
19
+ "is",
20
+ "it",
21
+ "its",
22
+ "of",
23
+ "on",
24
+ "or",
25
+ "our",
26
+ "so",
27
+ "that",
28
+ "the",
29
+ "their",
30
+ "them",
31
+ "then",
32
+ "there",
33
+ "these",
34
+ "they",
35
+ "this",
36
+ "to",
37
+ "up",
38
+ "us",
39
+ "use",
40
+ "using",
41
+ "was",
42
+ "we",
43
+ "what",
44
+ "when",
45
+ "where",
46
+ "which",
47
+ "who",
48
+ "why",
49
+ "will",
50
+ "with",
51
+ "you",
52
+ "your",
53
+ "about",
54
+ "can",
55
+ "do",
56
+ "does",
57
+ "make",
58
+ "need",
59
+ "needs",
60
+ "want",
61
+ "video",
62
+ "videos",
63
+ "short",
64
+ "quick"
65
+ ]
@@ -0,0 +1,79 @@
1
+ {
2
+ "id": "versus",
3
+ "purpose": "Compare two options in 20-50s: title, side-by-side points, optional headline numbers, verdict, close.",
4
+ "discover": {
5
+ "useCases": [
6
+ "Put two options side by side and name a winner.",
7
+ "Weigh two alternatives for a decision and state the verdict in one line.",
8
+ "Back a recommendation with two to four headline numbers."
9
+ ],
10
+ "audience": ["buyers", "teams", "readers"],
11
+ "goodFor": "Two options, one to five points each, a verdict and optionally a few key numbers.",
12
+ "notFor": "Persuasion or launches (pitch), three or more options (pitch/pricing).",
13
+ "tags": ["compare", "versus", "review", "kpi", "before-after"],
14
+ "tone": ["calm", "balanced"],
15
+ "aspects": ["16:9", "1:1"],
16
+ "lengths": { "min": 20, "max": 50 }
17
+ },
18
+ "slots": {
19
+ "title": { "type": "text", "max": 60, "required": true },
20
+ "leftLabel": { "type": "text", "max": 24, "required": true },
21
+ "leftPoints": { "type": "text[]", "min": 1, "max": 5, "itemMax": 40, "required": true },
22
+ "rightLabel": { "type": "text", "max": 24, "required": true },
23
+ "rightPoints": { "type": "text[]", "min": 1, "max": 5, "itemMax": 40, "required": true },
24
+ "winner": { "type": "enum", "values": ["left", "right"] },
25
+ "numbers": {
26
+ "type": "object",
27
+ "fields": { "value": "text", "label": "text" },
28
+ "list": true,
29
+ "min": 2,
30
+ "max": 4,
31
+ "optional": true
32
+ },
33
+ "verdict": { "type": "text", "max": 80, "required": true },
34
+ "length": { "type": "enum", "values": ["short", "standard", "long"], "default": "standard" },
35
+ "style": { "type": "enum", "values": ["tidy", "editorial", "punchy"], "default": "tidy" }
36
+ },
37
+ "example": {
38
+ "title": "Option A or Option B",
39
+ "leftLabel": "Option A",
40
+ "leftPoints": ["Lower cost", "Easy start", "Few options"],
41
+ "rightLabel": "Option B",
42
+ "rightPoints": ["Higher cost", "Takes longer", "More flexible"],
43
+ "winner": "left",
44
+ "numbers": [
45
+ { "value": "20%", "label": "Lower cost" },
46
+ { "value": "2 days", "label": "Faster start" }
47
+ ],
48
+ "verdict": "Pick A unless you need the flexibility"
49
+ },
50
+ "meta": { "title": { "$slot": "title" }, "lang": "en" },
51
+ "scenes": [
52
+ {
53
+ "id": "intro",
54
+ "type": "title",
55
+ "props": { "kicker": "Versus", "title": { "$slot": "title" } }
56
+ },
57
+ {
58
+ "id": "sides",
59
+ "type": "compare",
60
+ "props": {
61
+ "left": { "label": { "$slot": "leftLabel" }, "points": { "$slot": "leftPoints" } },
62
+ "right": { "label": { "$slot": "rightLabel" }, "points": { "$slot": "rightPoints" } },
63
+ "winner": { "$slot": "winner" }
64
+ }
65
+ },
66
+ {
67
+ "when": "numbers",
68
+ "id": "numbers",
69
+ "type": "kpi-grid",
70
+ "props": { "title": "By the numbers", "items": { "$slot": "numbers" } }
71
+ },
72
+ {
73
+ "id": "verdict",
74
+ "type": "callout",
75
+ "props": { "kind": "statement", "label": "Verdict", "text": { "$slot": "verdict" } }
76
+ },
77
+ { "id": "end", "type": "outro", "props": { "title": { "$slot": "title" } } }
78
+ ]
79
+ }
@@ -0,0 +1,18 @@
1
+ # Compare copy guide
2
+
3
+ Tone: fair, specific, decisive. Show both sides, then commit to a verdict.
4
+
5
+ Do
6
+ - Title: the choice as a question or "A or B", at most 8 words.
7
+ - Option labels: nouns of 1-3 words.
8
+ - Points: parallel phrases of 2-5 words, same order on both sides.
9
+ - Numbers: 2-4 headline figures with a unit; only what you can source.
10
+ - Verdict: one sentence naming the winner and the reason.
11
+
12
+ Don't
13
+ - No more than 5 points per side, 25 words per scene.
14
+ - No loaded adjectives (terrible, amazing); compare facts.
15
+ - No invented figures; leave the numbers out instead.
16
+ - Skip the winner when the honest answer is "it depends"; say what it depends on.
17
+
18
+ Vocabulary: "option" not "solution", "cost" not "price tag", "pick" not "go with".
@@ -0,0 +1,15 @@
1
+ {
2
+ "wordsPerSecond": 2.5,
3
+ "sceneSeconds": {
4
+ "title": { "short": 3, "standard": 4, "long": 5 },
5
+ "compare": { "short": 7, "standard": 10, "long": 14 },
6
+ "kpi-grid": { "short": 4, "standard": 5, "long": 6 },
7
+ "callout": { "short": 4, "standard": 5, "long": 7 },
8
+ "outro": { "short": 3, "standard": 4, "long": 5 }
9
+ },
10
+ "lengths": {
11
+ "short": { "scenes": [3, 5], "totalSec": [15, 35] },
12
+ "standard": { "scenes": [4, 5], "totalSec": [20, 50] },
13
+ "long": { "scenes": [4, 5], "totalSec": [30, 60] }
14
+ }
15
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "id": "editorial",
3
+ "theme": "editorial-light",
4
+ "frame": { "width": 1920, "height": 1080, "fps": 30 },
5
+ "direction": { "shot": "medium", "move": "static", "ease": "in-out", "transition": "crossfade" }
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "id": "punchy",
3
+ "theme": "tech-dark",
4
+ "frame": { "width": 1080, "height": 1080, "fps": 30 },
5
+ "direction": { "shot": "close", "move": "static", "ease": "spring-snappy", "transition": "cut" }
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "id": "tidy",
3
+ "theme": "calm-light",
4
+ "frame": { "width": 1920, "height": 1080, "fps": 30 },
5
+ "direction": { "shot": "medium", "move": "push-in", "ease": "out", "transition": "crossfade" }
6
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "templateVersion": 1,
3
+ "id": "compare",
4
+ "version": "1.0.0",
5
+ "title": "Compare",
6
+ "summary": "Two options side by side with a clear verdict. Calm, editorial or punchy.",
7
+ "domains": ["decision", "product", "analysis"],
8
+ "discover": {
9
+ "useCases": [
10
+ "Put two options side by side and name a winner.",
11
+ "Weigh alternatives for a buying or planning decision with a clear verdict.",
12
+ "Back a recommendation with two to four headline numbers."
13
+ ],
14
+ "audience": ["buyers", "teams", "readers", "stakeholders"],
15
+ "goodFor": "Two options with one to five points each and a one-line verdict.",
16
+ "notFor": "Persuading an audience (pitch), long data analysis (datastory).",
17
+ "tags": ["compare", "versus", "review", "before-after", "kpi", "sales"],
18
+ "tone": ["calm", "balanced"],
19
+ "aspects": ["16:9", "1:1"]
20
+ },
21
+ "requires": {
22
+ "storyboard": 1,
23
+ "scenes": ["title", "compare", "kpi-grid", "callout", "outro"]
24
+ },
25
+ "themes": [
26
+ { "id": "calm-light", "file": "@shared/calm-light.json", "mode": "light", "pair": "calm-dark" },
27
+ { "id": "calm-dark", "file": "@shared/calm-dark.json", "mode": "dark", "pair": "calm-light" },
28
+ {
29
+ "id": "editorial-light",
30
+ "file": "@shared/editorial-light.json",
31
+ "mode": "light",
32
+ "pair": "editorial-dark"
33
+ },
34
+ {
35
+ "id": "editorial-dark",
36
+ "file": "@shared/editorial-dark.json",
37
+ "mode": "dark",
38
+ "pair": "editorial-light"
39
+ },
40
+ { "id": "tech-light", "file": "@shared/tech-light.json", "mode": "light", "pair": "tech-dark" },
41
+ { "id": "tech-dark", "file": "@shared/tech-dark.json", "mode": "dark", "pair": "tech-light" }
42
+ ],
43
+ "styles": [
44
+ { "id": "tidy", "file": "styles/tidy.json" },
45
+ { "id": "editorial", "file": "styles/editorial.json" },
46
+ { "id": "punchy", "file": "styles/punchy.json" }
47
+ ],
48
+ "blueprints": [{ "id": "versus", "file": "blueprints/versus.json" }],
49
+ "pacing": "pacing.json",
50
+ "copy": "copy.md",
51
+ "license": "Apache-2.0"
52
+ }
@@ -0,0 +1,95 @@
1
+ {
2
+ "id": "data-story",
3
+ "purpose": "Tell one finding: a hook number, a bar or donut chart of 2-6 values, a takeaway sentence and the implication.",
4
+ "discover": {
5
+ "useCases": [
6
+ "Tell one insight with a hook number, a chart and a single takeaway sentence.",
7
+ "Show a share or composition of a whole and say what it implies.",
8
+ "Compare a few items by value and highlight the one that matters."
9
+ ],
10
+ "audience": ["general-public", "readers", "stakeholders"],
11
+ "goodFor": "One finding with a hook number and a chart of 2-6 values.",
12
+ "notFor": "Change over time (trend), several statistics at once (infographic).",
13
+ "tags": ["data", "chart", "ranking", "news", "recap", "social"],
14
+ "tone": ["clear", "confident"],
15
+ "aspects": ["16:9", "9:16"],
16
+ "lengths": { "min": 20, "max": 55 }
17
+ },
18
+ "slots": {
19
+ "headline": { "type": "text", "max": 60, "required": true },
20
+ "hook": {
21
+ "type": "object",
22
+ "fields": { "value": "text", "unit": "text", "label": "text", "context": "text" },
23
+ "required": true
24
+ },
25
+ "kind": { "type": "enum", "values": ["bar", "donut"], "default": "bar" },
26
+ "chartTitle": { "type": "text", "max": 50, "required": true },
27
+ "unit": { "type": "text", "max": 12, "default": "%" },
28
+ "data": {
29
+ "type": "object",
30
+ "fields": { "label": "text", "value": "number" },
31
+ "list": true,
32
+ "min": 2,
33
+ "max": 6,
34
+ "required": true
35
+ },
36
+ "highlight": { "type": "number", "min": 0, "max": 5, "int": true, "default": 0 },
37
+ "takeaway": { "type": "text", "max": 110, "required": true },
38
+ "implication": { "type": "text", "max": 60, "required": true },
39
+ "source": { "type": "text", "max": 70, "required": true },
40
+ "length": { "type": "enum", "values": ["short", "standard", "long"], "default": "standard" },
41
+ "style": { "type": "enum", "values": ["clear", "editorial", "pop"], "default": "clear" }
42
+ },
43
+ "example": {
44
+ "headline": "Where the time goes",
45
+ "hook": {
46
+ "value": "62",
47
+ "unit": "%",
48
+ "label": "of the workday",
49
+ "context": "is spent outside focused work"
50
+ },
51
+ "kind": "donut",
52
+ "chartTitle": "Share of the day by activity",
53
+ "unit": "%",
54
+ "data": [
55
+ { "label": "Meetings", "value": 30 },
56
+ { "label": "Messages", "value": 20 },
57
+ { "label": "Focus work", "value": 38 },
58
+ { "label": "Admin", "value": 12 }
59
+ ],
60
+ "highlight": 2,
61
+ "takeaway": "Only [38%] of the day goes to focused work",
62
+ "implication": "Protect two focus blocks a day",
63
+ "source": "Illustrative sample data"
64
+ },
65
+ "meta": { "title": { "$slot": "headline" }, "lang": "en" },
66
+ "scenes": [
67
+ {
68
+ "id": "intro",
69
+ "type": "title",
70
+ "props": { "kicker": "Data story", "title": { "$slot": "headline" } }
71
+ },
72
+ { "id": "hook", "type": "stat", "props": { "$spread": "hook" } },
73
+ {
74
+ "id": "chart",
75
+ "type": "chart",
76
+ "props": {
77
+ "kind": { "$slot": "kind" },
78
+ "title": { "$slot": "chartTitle" },
79
+ "unit": { "$slot": "unit" },
80
+ "data": { "$slot": "data" },
81
+ "highlight": { "$slot": "highlight" }
82
+ }
83
+ },
84
+ {
85
+ "id": "takeaway",
86
+ "type": "callout",
87
+ "props": { "text": { "$slot": "takeaway" }, "kind": "statement", "label": "Takeaway" }
88
+ },
89
+ {
90
+ "id": "end",
91
+ "type": "outro",
92
+ "props": { "title": { "$slot": "implication" }, "lines": [{ "$slot": "source" }] }
93
+ }
94
+ ]
95
+ }
@@ -0,0 +1,106 @@
1
+ {
2
+ "id": "infographic",
3
+ "purpose": "A shareable infographic: 2-3 big numbers, an optional share-of-whole donut, 2-4 icon facts and a source.",
4
+ "discover": {
5
+ "useCases": [
6
+ "Turn a handful of statistics into a shareable infographic with a share-of-whole chart.",
7
+ "Present two or three big numbers and the facts that explain them.",
8
+ "Summarise a survey or study for readers who skim."
9
+ ],
10
+ "audience": ["general-public", "readers", "customers"],
11
+ "goodFor": "2-3 big numbers, an optional breakdown of 2-6 parts and 2-4 facts.",
12
+ "notFor": "A single finding told with one visual (data-story), periodic results (report).",
13
+ "tags": ["infographic", "data", "chart", "survey", "social", "kpi"],
14
+ "tone": ["clear", "confident"],
15
+ "aspects": ["16:9", "9:16"],
16
+ "lengths": { "min": 25, "max": 70 }
17
+ },
18
+ "slots": {
19
+ "headline": { "type": "text", "max": 60, "required": true },
20
+ "big": {
21
+ "type": "object",
22
+ "fields": { "value": "text", "unit": "text", "label": "text" },
23
+ "list": true,
24
+ "min": 2,
25
+ "max": 3,
26
+ "required": true
27
+ },
28
+ "partsTitle": { "type": "text", "max": 50, "default": "How it breaks down" },
29
+ "parts": {
30
+ "type": "object",
31
+ "fields": { "label": "text", "value": "number" },
32
+ "list": true,
33
+ "min": 2,
34
+ "max": 6,
35
+ "optional": true
36
+ },
37
+ "facts": {
38
+ "type": "object",
39
+ "fields": { "icon": "text", "label": "text", "detail": "text" },
40
+ "list": true,
41
+ "min": 2,
42
+ "max": 4,
43
+ "required": true
44
+ },
45
+ "highlight": { "type": "number", "min": 0, "max": 5, "int": true, "default": 0 },
46
+ "source": { "type": "text", "max": 70, "required": true },
47
+ "length": { "type": "enum", "values": ["short", "standard", "long"], "default": "standard" },
48
+ "style": { "type": "enum", "values": ["clear", "editorial", "pop"], "default": "clear" }
49
+ },
50
+ "example": {
51
+ "headline": "A year of remote work",
52
+ "big": [
53
+ { "value": "72", "unit": "%", "label": "Prefer hybrid" },
54
+ { "value": "5", "unit": "days", "label": "Saved a month" },
55
+ { "value": "3", "unit": "x", "label": "More async chat" }
56
+ ],
57
+ "partsTitle": "Preferred work setup",
58
+ "parts": [
59
+ { "label": "Hybrid", "value": 72 },
60
+ { "label": "Remote", "value": 18 },
61
+ { "label": "Office", "value": 10 }
62
+ ],
63
+ "highlight": 0,
64
+ "facts": [
65
+ { "icon": "clock", "label": "Commute", "detail": "Time saved" },
66
+ { "icon": "users", "label": "Meetings", "detail": "Fewer" },
67
+ { "icon": "house", "label": "Focus", "detail": "Quiet home" }
68
+ ],
69
+ "source": "Illustrative sample data"
70
+ },
71
+ "meta": { "title": { "$slot": "headline" }, "lang": "en" },
72
+ "scenes": [
73
+ {
74
+ "id": "intro",
75
+ "type": "title",
76
+ "props": { "kicker": "In numbers", "title": { "$slot": "headline" } }
77
+ },
78
+ {
79
+ "id": "numbers",
80
+ "type": "kpi-grid",
81
+ "props": { "title": "The big numbers", "items": { "$slot": "big" } }
82
+ },
83
+ {
84
+ "when": "parts",
85
+ "id": "mix",
86
+ "type": "chart",
87
+ "props": {
88
+ "kind": "donut",
89
+ "title": { "$slot": "partsTitle" },
90
+ "unit": "%",
91
+ "data": { "$slot": "parts" },
92
+ "highlight": { "$slot": "highlight" }
93
+ }
94
+ },
95
+ {
96
+ "id": "facts",
97
+ "type": "icon-grid",
98
+ "props": { "title": "Behind the numbers", "items": { "$slot": "facts" } }
99
+ },
100
+ {
101
+ "id": "end",
102
+ "type": "outro",
103
+ "props": { "title": "Source", "lines": [{ "$slot": "source" }] }
104
+ }
105
+ ]
106
+ }
@@ -0,0 +1,93 @@
1
+ {
2
+ "id": "trend",
3
+ "purpose": "Show change over time: a hook number, a column chart of 3-8 periods, a takeaway sentence and the implication.",
4
+ "discover": {
5
+ "useCases": [
6
+ "Show how a measure changed over time and what the change implies.",
7
+ "Explain a rise or fall with one column chart and a single sentence of meaning.",
8
+ "Recap a period's trajectory for readers who only have half a minute."
9
+ ],
10
+ "audience": ["general-public", "readers", "stakeholders"],
11
+ "goodFor": "One measure over 3-8 periods with a clear direction.",
12
+ "notFor": "Share of a whole or a ranking (data-story), many statistics (infographic).",
13
+ "tags": ["data", "chart", "news", "recap", "timeline", "kpi"],
14
+ "tone": ["clear", "confident"],
15
+ "aspects": ["16:9", "9:16"],
16
+ "lengths": { "min": 20, "max": 55 }
17
+ },
18
+ "slots": {
19
+ "headline": { "type": "text", "max": 60, "required": true },
20
+ "hook": {
21
+ "type": "object",
22
+ "fields": { "value": "text", "unit": "text", "label": "text", "context": "text" },
23
+ "required": true
24
+ },
25
+ "chartTitle": { "type": "text", "max": 50, "required": true },
26
+ "unit": { "type": "text", "max": 12, "default": "" },
27
+ "data": {
28
+ "type": "object",
29
+ "fields": { "label": "text", "value": "number" },
30
+ "list": true,
31
+ "min": 3,
32
+ "max": 8,
33
+ "required": true
34
+ },
35
+ "takeaway": { "type": "text", "max": 110, "required": true },
36
+ "implication": { "type": "text", "max": 60, "required": true },
37
+ "source": { "type": "text", "max": 70, "required": true },
38
+ "length": { "type": "enum", "values": ["short", "standard", "long"], "default": "standard" },
39
+ "style": { "type": "enum", "values": ["clear", "editorial", "pop"], "default": "clear" }
40
+ },
41
+ "example": {
42
+ "headline": "Reading time is shrinking",
43
+ "hook": {
44
+ "value": "9",
45
+ "unit": "min",
46
+ "label": "a day",
47
+ "context": "average reading time, down from 15"
48
+ },
49
+ "chartTitle": "Average minutes read per day",
50
+ "unit": "min",
51
+ "data": [
52
+ { "label": "2019", "value": 15 },
53
+ { "label": "2020", "value": 14 },
54
+ { "label": "2021", "value": 12 },
55
+ { "label": "2022", "value": 11 },
56
+ { "label": "2023", "value": 9 }
57
+ ],
58
+ "takeaway": "Daily reading time [fell by 40%] in five years",
59
+ "implication": "Shorter formats now win attention",
60
+ "source": "Illustrative sample data"
61
+ },
62
+ "meta": { "title": { "$slot": "headline" }, "lang": "en" },
63
+ "scenes": [
64
+ {
65
+ "id": "intro",
66
+ "type": "title",
67
+ "props": { "kicker": "Trend", "title": { "$slot": "headline" } }
68
+ },
69
+ { "id": "hook", "type": "stat", "props": { "$spread": "hook" } },
70
+ {
71
+ "id": "chart",
72
+ "type": "chart",
73
+ "props": {
74
+ "kind": "bar",
75
+ "orient": "v",
76
+ "sort": "none",
77
+ "title": { "$slot": "chartTitle" },
78
+ "unit": { "$slot": "unit" },
79
+ "data": { "$slot": "data" }
80
+ }
81
+ },
82
+ {
83
+ "id": "takeaway",
84
+ "type": "callout",
85
+ "props": { "text": { "$slot": "takeaway" }, "kind": "statement", "label": "Takeaway" }
86
+ },
87
+ {
88
+ "id": "end",
89
+ "type": "outro",
90
+ "props": { "title": { "$slot": "implication" }, "lines": [{ "$slot": "source" }] }
91
+ }
92
+ ]
93
+ }
@@ -0,0 +1,16 @@
1
+ # Data story copy guide
2
+
3
+ Tone: clear, confident, plain. One finding per video. The number is the hook; the chart is the proof; the takeaway is the point.
4
+
5
+ Do
6
+ - Hook: one number with its unit and a 2-5 word label ("62%", "of orders arrive late").
7
+ - Takeaway: one sentence, the finding in words, with the key term in [brackets] to be accented.
8
+ - Chart: 2-6 values, labels 1-2 words, unit stated once; highlight the item the story is about.
9
+ - Close with the implication ("what this means"), then the source line exactly as cited.
10
+
11
+ Don't
12
+ - No chart without a takeaway sentence; no takeaway that repeats the chart title.
13
+ - No more than 3 big numbers or 4 facts; split into a second story instead.
14
+ - No invented figures; mark illustrative data as illustrative.
15
+
16
+ Vocabulary: "share" not "proportion", "rose/fell" not "experienced a change".
@@ -0,0 +1,17 @@
1
+ {
2
+ "wordsPerSecond": 2.5,
3
+ "sceneSeconds": {
4
+ "title": { "short": 3, "standard": 4, "long": 5 },
5
+ "stat": { "short": 4, "standard": 5, "long": 6 },
6
+ "chart": { "short": 5, "standard": 6, "long": 8 },
7
+ "callout": { "short": 4, "standard": 6, "long": 8 },
8
+ "kpi-grid": { "short": 5, "standard": 6, "long": 7 },
9
+ "icon-grid": { "short": 6, "standard": 8, "long": 10 },
10
+ "outro": { "short": 3, "standard": 4, "long": 5 }
11
+ },
12
+ "lengths": {
13
+ "short": { "scenes": [4, 5], "totalSec": [12, 35] },
14
+ "standard": { "scenes": [4, 6], "totalSec": [20, 50] },
15
+ "long": { "scenes": [5, 6], "totalSec": [35, 70] }
16
+ }
17
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "id": "clear",
3
+ "theme": "data-light",
4
+ "frame": { "width": 1920, "height": 1080, "fps": 30 },
5
+ "direction": { "shot": "wide", "move": "static", "ease": "in-out", "transition": "crossfade" }
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "id": "editorial",
3
+ "theme": "editorial-light",
4
+ "frame": { "width": 1920, "height": 1080, "fps": 30 },
5
+ "direction": { "shot": "medium", "move": "static", "ease": "in-out", "transition": "crossfade" }
6
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "id": "pop",
3
+ "theme": "pop-dark",
4
+ "frame": { "width": 1080, "height": 1920, "fps": 30 },
5
+ "direction": { "shot": "close", "move": "push-in", "ease": "out", "transition": "cut" },
6
+ "props": { "kpi-grid": { "cols": 2 }, "icon-grid": { "cols": 2 } }
7
+ }