@anvpx/motion 0.0.0-stage → 0.1.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/CATALOG.md +301 -0
- package/LICENSE +21 -0
- package/README.md +93 -2
- package/assets.json +37 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +46 -0
- package/icons/LICENSE-lucide +43 -0
- package/icons/icons.json +2711 -0
- package/icons/licences.json +1521 -0
- package/luts/LICENSE-CC0.txt +20 -0
- package/luts/cool.cube +520 -0
- package/luts/noir.cube +520 -0
- package/luts/warm.cube +520 -0
- package/music/LICENSE-CC0.txt +32 -0
- package/music/bed-full.wav +0 -0
- package/music/bed.wav +0 -0
- package/package.json +69 -3
- package/packs/INDEX.md +22 -0
- package/packs/painted/checklist.md +30 -0
- package/packs/painted/examples/dry-ink/storyboard.json +88 -0
- package/packs/painted/examples/oil/storyboard.json +89 -0
- package/packs/painted/examples/shape-carry/storyboard.json +112 -0
- package/packs/painted/examples/stacked-beat/storyboard.json +106 -0
- package/packs/painted/examples/staged-read/storyboard.json +105 -0
- package/packs/painted/examples/watercolour/storyboard.json +79 -0
- package/packs/painted/look.md +71 -0
- package/packs/painted/pack.json +46 -0
- package/packs/painted/review.md +12 -0
- package/packs/painted/voice.md +30 -0
- package/plugins/motion-kit/.claude-plugin/plugin.json +5 -0
- package/plugins/motion-kit/README.md +31 -0
- package/plugins/motion-kit/commands/mk-draft.md +13 -0
- package/plugins/motion-kit/commands/mk-new.md +15 -0
- package/plugins/motion-kit/commands/mk-render.md +14 -0
- package/plugins/motion-kit/skills/motion-kit/SKILL.md +77 -0
- package/plugins/motion-kit/skills/motion-kit/references/authoring-scene.md +37 -0
- package/plugins/motion-kit/skills/motion-kit/references/authoring-style.md +17 -0
- package/plugins/motion-kit/skills/motion-kit/references/common-mistakes.md +73 -0
- package/plugins/motion-kit/skills/motion-kit/references/content-pack.md +81 -0
- package/plugins/motion-kit/skills/motion-kit/references/faux-ui.md +39 -0
- package/plugins/motion-kit/skills/motion-kit/references/free-storyboard.md +15 -0
- package/plugins/motion-kit/skills/motion-kit/references/intake.md +18 -0
- package/plugins/motion-kit/skills/motion-kit/references/knowledge-routing.md +32 -0
- package/plugins/motion-kit/skills/motion-kit/references/outline.md +24 -0
- package/plugins/motion-kit/skills/motion-kit/references/patching.md +50 -0
- package/plugins/motion-kit/skills/motion-kit/references/patterns.md +55 -0
- package/plugins/motion-kit/skills/motion-kit/references/quality-bar.md +61 -0
- package/plugins/motion-kit/skills/motion-kit/references/review.md +8 -0
- package/plugins/motion-kit/skills/motion-kit/references/scene-recipes.md +300 -0
- package/plugins/motion-kit/skills/motion-kit/references/setup.md +16 -0
- package/plugins/motion-kit/skills/motion-kit/references/slop.md +38 -0
- package/plugins/motion-kit/skills/motion-kit/references/storyboard-json.md +121 -0
- package/plugins/motion-kit/skills/motion-kit/references/troubleshooting.md +55 -0
- package/plugins/motion-kit/skills/motion-kit/references/voice.md +40 -0
- package/plugins/motion-kit/skills/motion-kit/references/worked-example.md +170 -0
- package/shared/themes/README.md +5 -0
- package/shared/themes/bold-dark.json +362 -0
- package/shared/themes/bold-light.json +362 -0
- package/shared/themes/calm-dark.json +362 -0
- package/shared/themes/calm-light.json +362 -0
- package/shared/themes/data-dark.json +360 -0
- package/shared/themes/data-light.json +360 -0
- package/shared/themes/editorial-dark.json +353 -0
- package/shared/themes/editorial-light.json +353 -0
- package/shared/themes/fjord-dark.json +124 -0
- package/shared/themes/fjord-light.json +124 -0
- package/shared/themes/playful-dark.json +362 -0
- package/shared/themes/playful-light.json +362 -0
- package/shared/themes/pop-dark.json +352 -0
- package/shared/themes/pop-light.json +352 -0
- package/shared/themes/tech-dark.json +360 -0
- package/shared/themes/tech-light.json +360 -0
- package/shared/themes/warm-dark.json +368 -0
- package/shared/themes/warm-light.json +368 -0
- package/skills/motion-kit/SKILL.md +77 -0
- package/skills/motion-kit/references/authoring-scene.md +37 -0
- package/skills/motion-kit/references/authoring-style.md +17 -0
- package/skills/motion-kit/references/common-mistakes.md +73 -0
- package/skills/motion-kit/references/content-pack.md +81 -0
- package/skills/motion-kit/references/faux-ui.md +39 -0
- package/skills/motion-kit/references/free-storyboard.md +15 -0
- package/skills/motion-kit/references/intake.md +18 -0
- package/skills/motion-kit/references/knowledge-routing.md +32 -0
- package/skills/motion-kit/references/outline.md +24 -0
- package/skills/motion-kit/references/patching.md +50 -0
- package/skills/motion-kit/references/patterns.md +55 -0
- package/skills/motion-kit/references/quality-bar.md +61 -0
- package/skills/motion-kit/references/review.md +8 -0
- package/skills/motion-kit/references/scene-recipes.md +300 -0
- package/skills/motion-kit/references/setup.md +16 -0
- package/skills/motion-kit/references/slop.md +38 -0
- package/skills/motion-kit/references/storyboard-json.md +121 -0
- package/skills/motion-kit/references/troubleshooting.md +55 -0
- package/skills/motion-kit/references/voice.md +40 -0
- package/skills/motion-kit/references/worked-example.md +170 -0
- package/stopwords.json +65 -0
- package/templates/compare/blueprints/versus.json +79 -0
- package/templates/compare/copy.md +18 -0
- package/templates/compare/pacing.json +15 -0
- package/templates/compare/previews/versus.png +0 -0
- package/templates/compare/styles/editorial.json +6 -0
- package/templates/compare/styles/punchy.json +6 -0
- package/templates/compare/styles/tidy.json +6 -0
- package/templates/compare/template.json +52 -0
- package/templates/datastory/blueprints/data-story.json +95 -0
- package/templates/datastory/blueprints/infographic.json +106 -0
- package/templates/datastory/blueprints/trend.json +93 -0
- package/templates/datastory/copy.md +16 -0
- package/templates/datastory/pacing.json +17 -0
- package/templates/datastory/previews/data-story.png +0 -0
- package/templates/datastory/previews/infographic.png +0 -0
- package/templates/datastory/previews/trend.png +0 -0
- package/templates/datastory/styles/clear.json +6 -0
- package/templates/datastory/styles/editorial.json +6 -0
- package/templates/datastory/styles/pop.json +7 -0
- package/templates/datastory/template.json +57 -0
- package/templates/event/blueprints/promo.json +71 -0
- package/templates/event/blueprints/save-the-date.json +61 -0
- package/templates/event/copy.md +16 -0
- package/templates/event/pacing.json +15 -0
- package/templates/event/previews/promo.png +0 -0
- package/templates/event/previews/save-the-date.png +0 -0
- package/templates/event/styles/bright.json +6 -0
- package/templates/event/styles/pop.json +6 -0
- package/templates/event/template.json +37 -0
- package/templates/explain/blueprints/architecture.json +76 -0
- package/templates/explain/blueprints/concept.json +89 -0
- package/templates/explain/blueprints/howto.json +56 -0
- package/templates/explain/blueprints/overview.json +126 -0
- package/templates/explain/copy.md +19 -0
- package/templates/explain/pacing.json +19 -0
- package/templates/explain/previews/architecture.png +0 -0
- package/templates/explain/previews/concept.png +0 -0
- package/templates/explain/previews/howto.png +0 -0
- package/templates/explain/previews/overview.png +0 -0
- package/templates/explain/styles/calm.json +6 -0
- package/templates/explain/styles/crisp.json +6 -0
- package/templates/explain/template.json +64 -0
- package/templates/guide/blueprints/lesson.json +173 -0
- package/templates/guide/blueprints/onboarding.json +80 -0
- package/templates/guide/blueprints/tutorial.json +102 -0
- package/templates/guide/copy.md +17 -0
- package/templates/guide/pacing.json +59 -0
- package/templates/guide/previews/lesson.png +0 -0
- package/templates/guide/previews/onboarding.png +0 -0
- package/templates/guide/previews/tutorial.png +0 -0
- package/templates/guide/styles/calm.json +15 -0
- package/templates/guide/styles/friendly.json +15 -0
- package/templates/guide/styles/techdark.json +15 -0
- package/templates/guide/template.json +95 -0
- package/templates/pitch/blueprints/feature.json +134 -0
- package/templates/pitch/blueprints/launch.json +173 -0
- package/templates/pitch/blueprints/pricing.json +141 -0
- package/templates/pitch/copy.md +18 -0
- package/templates/pitch/pacing.json +59 -0
- package/templates/pitch/previews/feature.png +0 -0
- package/templates/pitch/previews/launch.png +0 -0
- package/templates/pitch/previews/pricing.png +0 -0
- package/templates/pitch/styles/polished.json +6 -0
- package/templates/pitch/styles/punchy.json +6 -0
- package/templates/pitch/styles/teaser.json +12 -0
- package/templates/pitch/template.json +45 -0
- package/templates/recap/blueprints/news-recap.json +62 -0
- package/templates/recap/blueprints/timeline-story.json +94 -0
- package/templates/recap/copy.md +16 -0
- package/templates/recap/pacing.json +16 -0
- package/templates/recap/previews/news-recap.png +0 -0
- package/templates/recap/previews/timeline-story.png +0 -0
- package/templates/recap/styles/editorial.json +6 -0
- package/templates/recap/styles/editorialdark.json +6 -0
- package/templates/recap/template.json +50 -0
- package/templates/report/blueprints/kpi-review.json +116 -0
- package/templates/report/blueprints/status.json +78 -0
- package/templates/report/copy.md +17 -0
- package/templates/report/pacing.json +16 -0
- package/templates/report/previews/kpi-review.png +0 -0
- package/templates/report/previews/status.png +0 -0
- package/templates/report/styles/exec.json +6 -0
- package/templates/report/styles/memo.json +6 -0
- package/templates/report/styles/walkthrough.json +6 -0
- package/templates/report/template.json +56 -0
- package/templates/social/blueprints/announce.json +109 -0
- package/templates/social/blueprints/listicle.json +117 -0
- package/templates/social/blueprints/tip.json +114 -0
- package/templates/social/copy.md +18 -0
- package/templates/social/pacing.json +49 -0
- package/templates/social/previews/announce.png +0 -0
- package/templates/social/previews/listicle.png +0 -0
- package/templates/social/previews/tip.png +0 -0
- package/templates/social/styles/captioned.json +18 -0
- package/templates/social/styles/hook-first.json +15 -0
- package/templates/social/styles/techcut.json +15 -0
- package/templates/social/template.json +94 -0
- package/templates/update/blueprints/announcement.json +57 -0
- package/templates/update/blueprints/changelog.json +157 -0
- package/templates/update/blueprints/release-notes.json +151 -0
- package/templates/update/blueprints/weekly-update.json +88 -0
- package/templates/update/copy.md +17 -0
- package/templates/update/pacing.json +64 -0
- package/templates/update/previews/announcement.png +0 -0
- package/templates/update/previews/changelog.png +0 -0
- package/templates/update/previews/release-notes.png +0 -0
- package/templates/update/previews/weekly-update.png +0 -0
- package/templates/update/styles/punchy.json +15 -0
- package/templates/update/styles/techdark.json +6 -0
- package/templates/update/styles/tidy.json +6 -0
- package/templates/update/template.json +67 -0
- package/templates/vista/blueprints/spotlight.json +68 -0
- package/templates/vista/blueprints/tour.json +84 -0
- package/templates/vista/copy.md +18 -0
- package/templates/vista/pacing.json +14 -0
- package/templates/vista/previews/spotlight.png +0 -0
- package/templates/vista/previews/tour.png +0 -0
- package/templates/vista/styles/bright.json +6 -0
- package/templates/vista/styles/cinematic.json +6 -0
- package/templates/vista/template.json +42 -0
- package/templates/walkthrough/blueprints/product-tour.json +107 -0
- package/templates/walkthrough/copy.md +16 -0
- package/templates/walkthrough/pacing.json +16 -0
- package/templates/walkthrough/previews/product-tour.png +0 -0
- package/templates/walkthrough/styles/calm.json +6 -0
- package/templates/walkthrough/styles/deep.json +6 -0
- package/templates/walkthrough/template.json +37 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"discover": {
|
|
3
|
+
"aspects": ["16:9", "1:1"],
|
|
4
|
+
"audience": ["readers", "community", "stakeholders"],
|
|
5
|
+
"goodFor": "One story in 3-7 eras with a takeaway.",
|
|
6
|
+
"lengths": { "max": 90, "min": 40 },
|
|
7
|
+
"notFor": "Period news roundups, metric charts (datastory/trend), live occasions.",
|
|
8
|
+
"tags": ["recap", "history", "timeline", "chart"],
|
|
9
|
+
"tone": ["calm", "friendly"],
|
|
10
|
+
"useCases": [
|
|
11
|
+
"Tell how a project or place changed across three to seven eras.",
|
|
12
|
+
"Pair a timeline with one chart that shows the direction.",
|
|
13
|
+
"Close a history with one takeaway line."
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
"example": {
|
|
17
|
+
"chartTitle": "Loaves baked each morning",
|
|
18
|
+
"closing": "Still the same corner shop",
|
|
19
|
+
"data": [
|
|
20
|
+
{ "label": "2019", "value": 60 },
|
|
21
|
+
{ "label": "2020", "value": 90 },
|
|
22
|
+
{ "label": "2021", "value": 140 },
|
|
23
|
+
{ "label": "2022", "value": 200 }
|
|
24
|
+
],
|
|
25
|
+
"eras": [
|
|
26
|
+
{ "detail": "One oven", "label": "Doors open", "when": "2019" },
|
|
27
|
+
{ "detail": "Bread to go", "label": "Second oven", "when": "2020" },
|
|
28
|
+
{ "detail": "Tables outside", "label": "Cafe corner", "when": "2021" },
|
|
29
|
+
{ "detail": "Bakes for neighbors", "label": "Street staple", "when": "2022" }
|
|
30
|
+
],
|
|
31
|
+
"takeaway": "Slow growth [kept] the bakery on its corner",
|
|
32
|
+
"topic": "The corner bakery",
|
|
33
|
+
"unit": "loaves"
|
|
34
|
+
},
|
|
35
|
+
"id": "timeline-story",
|
|
36
|
+
"meta": { "lang": "en", "title": { "$slot": "topic" } },
|
|
37
|
+
"purpose": "Tell one story in 40-90s: eras on a timeline, an optional chart, a takeaway.",
|
|
38
|
+
"scenes": [
|
|
39
|
+
{
|
|
40
|
+
"id": "intro",
|
|
41
|
+
"props": { "kicker": "Story", "title": { "$slot": "topic" } },
|
|
42
|
+
"type": "title"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "eras",
|
|
46
|
+
"props": { "items": { "$slot": "eras" }, "title": "How it unfolded" },
|
|
47
|
+
"type": "timeline"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"id": "trend",
|
|
51
|
+
"props": {
|
|
52
|
+
"data": { "$slot": "data" },
|
|
53
|
+
"kind": "bar",
|
|
54
|
+
"orient": "v",
|
|
55
|
+
"sort": "none",
|
|
56
|
+
"title": { "$slot": "chartTitle" },
|
|
57
|
+
"unit": { "$slot": "unit" }
|
|
58
|
+
},
|
|
59
|
+
"type": "chart",
|
|
60
|
+
"when": "data"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"id": "point",
|
|
64
|
+
"props": { "kind": "statement", "label": "Takeaway", "text": { "$slot": "takeaway" } },
|
|
65
|
+
"type": "callout"
|
|
66
|
+
},
|
|
67
|
+
{ "id": "end", "props": { "title": { "$slot": "closing" } }, "type": "outro" }
|
|
68
|
+
],
|
|
69
|
+
"slots": {
|
|
70
|
+
"chartTitle": { "default": "By the numbers", "max": 50, "type": "text" },
|
|
71
|
+
"closing": { "max": 60, "required": true, "type": "text" },
|
|
72
|
+
"data": {
|
|
73
|
+
"fields": { "label": "text", "value": "number" },
|
|
74
|
+
"list": true,
|
|
75
|
+
"max": 8,
|
|
76
|
+
"min": 3,
|
|
77
|
+
"optional": true,
|
|
78
|
+
"type": "object"
|
|
79
|
+
},
|
|
80
|
+
"eras": {
|
|
81
|
+
"fields": { "detail": "text", "label": "text", "when": "text" },
|
|
82
|
+
"list": true,
|
|
83
|
+
"max": 7,
|
|
84
|
+
"min": 3,
|
|
85
|
+
"required": true,
|
|
86
|
+
"type": "object"
|
|
87
|
+
},
|
|
88
|
+
"length": { "default": "standard", "type": "enum", "values": ["short", "standard", "long"] },
|
|
89
|
+
"style": { "default": "editorial", "type": "enum", "values": ["editorial", "editorialdark"] },
|
|
90
|
+
"takeaway": { "max": 110, "required": true, "type": "text" },
|
|
91
|
+
"topic": { "max": 40, "required": true, "type": "text" },
|
|
92
|
+
"unit": { "default": "", "max": 12, "type": "text" }
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Recap copy guide
|
|
2
|
+
|
|
3
|
+
Tone: calm, direct, factual. Say what happened, in order, then what it means.
|
|
4
|
+
|
|
5
|
+
Do
|
|
6
|
+
- Title: the period or story in at most 8 words.
|
|
7
|
+
- Timeline: each entry names one event; detail adds one fact, at most 10 words.
|
|
8
|
+
- Numbers: at most one or two figures; label says what was counted.
|
|
9
|
+
- Close with one takeaway of at most 15 words, no new facts.
|
|
10
|
+
|
|
11
|
+
Don't
|
|
12
|
+
- No more than 7 entries, one idea per entry, no new facts at the close.
|
|
13
|
+
- No superlatives you cannot prove; no invented figures, quotes or dates.
|
|
14
|
+
- No exclamation marks, emoji, or "simply", "just", "easy".
|
|
15
|
+
|
|
16
|
+
Vocabulary: "look back" not "deep dive", "period" not "leverage", "takeaway" not "learnings".
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"lengths": {
|
|
3
|
+
"long": { "scenes": [5, 7], "totalSec": [35, 100] },
|
|
4
|
+
"short": { "scenes": [3, 5], "totalSec": [12, 40] },
|
|
5
|
+
"standard": { "scenes": [4, 6], "totalSec": [20, 70] }
|
|
6
|
+
},
|
|
7
|
+
"sceneSeconds": {
|
|
8
|
+
"callout": { "long": 8, "short": 4, "standard": 6 },
|
|
9
|
+
"chart": { "long": 8, "short": 5, "standard": 6 },
|
|
10
|
+
"outro": { "long": 5, "short": 3, "standard": 4 },
|
|
11
|
+
"stat": { "long": 6, "short": 4, "standard": 5 },
|
|
12
|
+
"timeline": { "long": 14, "short": 7, "standard": 10 },
|
|
13
|
+
"title": { "long": 5, "short": 3, "standard": 4 }
|
|
14
|
+
},
|
|
15
|
+
"wordsPerSecond": 2.5
|
|
16
|
+
}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"blueprints": [
|
|
3
|
+
{ "file": "blueprints/news-recap.json", "id": "news-recap" },
|
|
4
|
+
{ "file": "blueprints/timeline-story.json", "id": "timeline-story" }
|
|
5
|
+
],
|
|
6
|
+
"copy": "copy.md",
|
|
7
|
+
"discover": {
|
|
8
|
+
"aspects": ["16:9", "1:1"],
|
|
9
|
+
"audience": ["readers", "team", "stakeholders"],
|
|
10
|
+
"goodFor": "A look back: events in order, at most a few numbers, one takeaway.",
|
|
11
|
+
"notFor": "Live announcements (event), metric deep dives (datastory).",
|
|
12
|
+
"tags": ["recap", "news", "timeline", "history", "data"],
|
|
13
|
+
"tone": ["calm", "direct"],
|
|
14
|
+
"useCases": [
|
|
15
|
+
"Recap a period's events in order with one number to remember.",
|
|
16
|
+
"Tell the story of a project as a timeline with a takeaway.",
|
|
17
|
+
"Summarise what happened for readers who missed it."
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
"domains": ["report", "news", "history"],
|
|
21
|
+
"id": "recap",
|
|
22
|
+
"license": "Apache-2.0",
|
|
23
|
+
"pacing": "pacing.json",
|
|
24
|
+
"requires": {
|
|
25
|
+
"scenes": ["title", "timeline", "stat", "chart", "callout", "outro"],
|
|
26
|
+
"storyboard": 1
|
|
27
|
+
},
|
|
28
|
+
"styles": [
|
|
29
|
+
{ "file": "styles/editorial.json", "id": "editorial" },
|
|
30
|
+
{ "file": "styles/editorialdark.json", "id": "editorialdark" }
|
|
31
|
+
],
|
|
32
|
+
"summary": "Look back at a period or a story: timelines, numbers and one takeaway.",
|
|
33
|
+
"templateVersion": 1,
|
|
34
|
+
"themes": [
|
|
35
|
+
{
|
|
36
|
+
"file": "@shared/editorial-light.json",
|
|
37
|
+
"id": "editorial-light",
|
|
38
|
+
"mode": "light",
|
|
39
|
+
"pair": "editorial-dark"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"file": "@shared/editorial-dark.json",
|
|
43
|
+
"id": "editorial-dark",
|
|
44
|
+
"mode": "dark",
|
|
45
|
+
"pair": "editorial-light"
|
|
46
|
+
}
|
|
47
|
+
],
|
|
48
|
+
"title": "Recap",
|
|
49
|
+
"version": "1.0.0"
|
|
50
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "kpi-review",
|
|
3
|
+
"purpose": "Review a period: 2-4 headline numbers with change and direction, 2-4 insights, optional next steps.",
|
|
4
|
+
"discover": {
|
|
5
|
+
"useCases": [
|
|
6
|
+
"Summarise a period's results for leadership with three or four headline numbers.",
|
|
7
|
+
"Review key metrics against the previous period and name what drove each change.",
|
|
8
|
+
"Close a review meeting with the evidence, the reasons and the next steps."
|
|
9
|
+
],
|
|
10
|
+
"audience": ["executives", "managers", "finance"],
|
|
11
|
+
"goodFor": "Periodic results with 2-4 measured numbers, their change and a few reasons.",
|
|
12
|
+
"notFor": "One finding told as a story (datastory), project health by workstream (status).",
|
|
13
|
+
"tags": ["report", "kpi", "finance", "review", "data", "qbr", "update"],
|
|
14
|
+
"tone": ["formal", "direct"],
|
|
15
|
+
"aspects": ["16:9"],
|
|
16
|
+
"lengths": { "min": 25, "max": 70 }
|
|
17
|
+
},
|
|
18
|
+
"slots": {
|
|
19
|
+
"subject": { "type": "text", "max": 40, "default": "Performance review" },
|
|
20
|
+
"period": { "type": "text", "max": 30, "required": true },
|
|
21
|
+
"kpis": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"fields": {
|
|
24
|
+
"value": "text",
|
|
25
|
+
"unit": "text",
|
|
26
|
+
"label": "text",
|
|
27
|
+
"delta": "text",
|
|
28
|
+
"trend": "text",
|
|
29
|
+
"good": "text"
|
|
30
|
+
},
|
|
31
|
+
"list": true,
|
|
32
|
+
"min": 2,
|
|
33
|
+
"max": 4,
|
|
34
|
+
"required": true
|
|
35
|
+
},
|
|
36
|
+
"insights": { "type": "text[]", "min": 2, "max": 4, "itemMax": 60, "required": true },
|
|
37
|
+
"next": { "type": "text[]", "min": 1, "max": 3, "itemMax": 50, "optional": true },
|
|
38
|
+
"closing": { "type": "text", "max": 60, "default": "Decision needed on next steps" },
|
|
39
|
+
"length": { "type": "enum", "values": ["short", "standard", "long"], "default": "standard" },
|
|
40
|
+
"style": { "type": "enum", "values": ["exec", "walkthrough", "memo"], "default": "walkthrough" }
|
|
41
|
+
},
|
|
42
|
+
"example": {
|
|
43
|
+
"subject": "Quarterly review",
|
|
44
|
+
"period": "Q3 (illustrative data)",
|
|
45
|
+
"kpis": [
|
|
46
|
+
{
|
|
47
|
+
"value": "4.2",
|
|
48
|
+
"unit": "M",
|
|
49
|
+
"label": "Revenue",
|
|
50
|
+
"delta": "+12%",
|
|
51
|
+
"trend": "up",
|
|
52
|
+
"good": "up"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"value": "86",
|
|
56
|
+
"unit": "%",
|
|
57
|
+
"label": "Retention",
|
|
58
|
+
"delta": "-2 pts",
|
|
59
|
+
"trend": "down",
|
|
60
|
+
"good": "up"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"value": "3.1",
|
|
64
|
+
"unit": "days",
|
|
65
|
+
"label": "Time to resolve",
|
|
66
|
+
"delta": "-0.6",
|
|
67
|
+
"trend": "down",
|
|
68
|
+
"good": "down"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"value": "18",
|
|
72
|
+
"unit": "%",
|
|
73
|
+
"label": "Cost share",
|
|
74
|
+
"delta": "+1 pt",
|
|
75
|
+
"trend": "up",
|
|
76
|
+
"good": "down"
|
|
77
|
+
}
|
|
78
|
+
],
|
|
79
|
+
"insights": [
|
|
80
|
+
"Revenue grew on larger average orders",
|
|
81
|
+
"Retention slipped in the newest cohort",
|
|
82
|
+
"Faster resolution followed the new queue"
|
|
83
|
+
],
|
|
84
|
+
"next": ["Review the newest cohort", "Hold costs flat", "Set next quarter targets"],
|
|
85
|
+
"closing": "Decision needed on next steps"
|
|
86
|
+
},
|
|
87
|
+
"meta": { "title": { "$slot": "subject" }, "lang": "en" },
|
|
88
|
+
"scenes": [
|
|
89
|
+
{
|
|
90
|
+
"id": "intro",
|
|
91
|
+
"type": "title",
|
|
92
|
+
"props": {
|
|
93
|
+
"kicker": "KPI review",
|
|
94
|
+
"title": { "$slot": "subject" },
|
|
95
|
+
"subtitle": { "$slot": "period" }
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"id": "numbers",
|
|
100
|
+
"type": "kpi-grid",
|
|
101
|
+
"props": { "title": "Results", "items": { "$slot": "kpis" } }
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"id": "why",
|
|
105
|
+
"type": "bullets",
|
|
106
|
+
"props": { "title": "What drove it", "items": { "$slot": "insights" }, "marker": "dot" }
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"when": "next",
|
|
110
|
+
"id": "next",
|
|
111
|
+
"type": "bullets",
|
|
112
|
+
"props": { "title": "Next", "items": { "$slot": "next" }, "marker": "number" }
|
|
113
|
+
},
|
|
114
|
+
{ "id": "end", "type": "outro", "props": { "title": { "$slot": "closing" } } }
|
|
115
|
+
]
|
|
116
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "status",
|
|
3
|
+
"purpose": "Report a project's health: 2-6 workstreams, each a state word with its own icon, up to 3 risks and one ask.",
|
|
4
|
+
"discover": {
|
|
5
|
+
"useCases": [
|
|
6
|
+
"Report a project's health by workstream, with the main risks and one request.",
|
|
7
|
+
"Give sponsors a one-minute status before a go or no-go decision.",
|
|
8
|
+
"Show what is on track, at risk or blocked and what help would unblock it."
|
|
9
|
+
],
|
|
10
|
+
"audience": ["executives", "managers", "stakeholders"],
|
|
11
|
+
"goodFor": "A project or programme with 2-6 parts, each with a clear state, and an ask.",
|
|
12
|
+
"notFor": "Metric results (kpi-review), weekly team progress (update/weekly-update).",
|
|
13
|
+
"tags": ["report", "status", "review", "internal", "update", "roadmap"],
|
|
14
|
+
"tone": ["formal", "direct"],
|
|
15
|
+
"aspects": ["16:9"],
|
|
16
|
+
"lengths": { "min": 20, "max": 60 }
|
|
17
|
+
},
|
|
18
|
+
"slots": {
|
|
19
|
+
"project": { "type": "text", "max": 40, "required": true },
|
|
20
|
+
"asOf": { "type": "text", "max": 40, "default": "Current status" },
|
|
21
|
+
"workstreams": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"fields": { "icon": "text", "label": "text", "detail": "text" },
|
|
24
|
+
"list": true,
|
|
25
|
+
"min": 2,
|
|
26
|
+
"max": 6,
|
|
27
|
+
"required": true
|
|
28
|
+
},
|
|
29
|
+
"risks": { "type": "text[]", "min": 1, "max": 3, "itemMax": 60, "optional": true },
|
|
30
|
+
"ask": { "type": "text", "max": 100, "optional": true },
|
|
31
|
+
"closing": { "type": "text", "max": 60, "default": "Next update in two weeks" },
|
|
32
|
+
"length": { "type": "enum", "values": ["short", "standard", "long"], "default": "standard" },
|
|
33
|
+
"style": { "type": "enum", "values": ["exec", "walkthrough", "memo"], "default": "exec" }
|
|
34
|
+
},
|
|
35
|
+
"example": {
|
|
36
|
+
"project": "Platform migration",
|
|
37
|
+
"asOf": "Status as of week 12 (illustrative)",
|
|
38
|
+
"workstreams": [
|
|
39
|
+
{ "icon": "badge-check", "label": "Done", "detail": "Data transfer" },
|
|
40
|
+
{ "icon": "trending-up", "label": "On track", "detail": "Service cutover" },
|
|
41
|
+
{ "icon": "triangle-alert", "label": "At risk", "detail": "Vendor contract" },
|
|
42
|
+
{ "icon": "ban", "label": "Blocked", "detail": "Security review" }
|
|
43
|
+
],
|
|
44
|
+
"risks": ["Contract signature may slip two weeks", "Review needs one more engineer"],
|
|
45
|
+
"ask": "Approve one extra reviewer to hold the launch date",
|
|
46
|
+
"closing": "Next update in two weeks"
|
|
47
|
+
},
|
|
48
|
+
"meta": { "title": { "$slot": "project" }, "lang": "en" },
|
|
49
|
+
"scenes": [
|
|
50
|
+
{
|
|
51
|
+
"id": "intro",
|
|
52
|
+
"type": "title",
|
|
53
|
+
"props": {
|
|
54
|
+
"kicker": "Status",
|
|
55
|
+
"title": { "$slot": "project" },
|
|
56
|
+
"subtitle": { "$slot": "asOf" }
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"id": "streams",
|
|
61
|
+
"type": "icon-grid",
|
|
62
|
+
"props": { "title": "Workstreams", "items": { "$slot": "workstreams" } }
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"when": "risks",
|
|
66
|
+
"id": "risks",
|
|
67
|
+
"type": "bullets",
|
|
68
|
+
"props": { "title": "Risks", "items": { "$slot": "risks" }, "marker": "cross" }
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"when": "ask",
|
|
72
|
+
"id": "ask",
|
|
73
|
+
"type": "callout",
|
|
74
|
+
"props": { "text": { "$slot": "ask" }, "kind": "statement", "label": "The ask" }
|
|
75
|
+
},
|
|
76
|
+
{ "id": "end", "type": "outro", "props": { "title": { "$slot": "closing" } } }
|
|
77
|
+
]
|
|
78
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Report copy guide
|
|
2
|
+
|
|
3
|
+
Tone: formal, direct, numerate. State the result, then the reason. No spin.
|
|
4
|
+
|
|
5
|
+
Do
|
|
6
|
+
- Values exactly as measured ("98.9", "$4.2M"); unit in its own field ("%", "days"); label 1-3 words.
|
|
7
|
+
- Delta against the previous period with a sign ("+0.4 pts"). Say which direction is good when a fall is good.
|
|
8
|
+
- Insights: one clause, cause then effect ("Faster reviews cut churn").
|
|
9
|
+
- Workstreams: the state word is the label ("On track", "At risk", "Blocked", "Done") with its own icon; the workstream name is the detail. Never rely on colour alone. Risks name an owner or a need.
|
|
10
|
+
- Close with the single decision or request.
|
|
11
|
+
|
|
12
|
+
Don't
|
|
13
|
+
- No adjectives that judge ("great", "disappointing"); let the number speak.
|
|
14
|
+
- No more than 4 numbers, 4 insights, 6 workstreams or 3 risks per report.
|
|
15
|
+
- No invented figures; every number comes from the brief.
|
|
16
|
+
|
|
17
|
+
Vocabulary: "quarter" not "Q-end", "risk" not "challenge", "ask" not "wish".
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"wordsPerSecond": 2.5,
|
|
3
|
+
"sceneSeconds": {
|
|
4
|
+
"title": { "short": 3, "standard": 4, "long": 5 },
|
|
5
|
+
"kpi-grid": { "short": 5, "standard": 6, "long": 7 },
|
|
6
|
+
"bullets": { "short": 5, "standard": 7, "long": 10 },
|
|
7
|
+
"icon-grid": { "short": 6, "standard": 9, "long": 12 },
|
|
8
|
+
"callout": { "short": 4, "standard": 6, "long": 8 },
|
|
9
|
+
"outro": { "short": 3, "standard": 4, "long": 5 }
|
|
10
|
+
},
|
|
11
|
+
"lengths": {
|
|
12
|
+
"short": { "scenes": [3, 5], "totalSec": [15, 40] },
|
|
13
|
+
"standard": { "scenes": [4, 5], "totalSec": [25, 60] },
|
|
14
|
+
"long": { "scenes": [4, 6], "totalSec": [40, 90] }
|
|
15
|
+
}
|
|
16
|
+
}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"templateVersion": 1,
|
|
3
|
+
"id": "report",
|
|
4
|
+
"version": "1.0.1",
|
|
5
|
+
"title": "Report",
|
|
6
|
+
"summary": "Numbers for decision makers: KPI reviews and project status with risks and an ask. 16:9.",
|
|
7
|
+
"domains": ["finance", "management", "operations"],
|
|
8
|
+
"discover": {
|
|
9
|
+
"useCases": [
|
|
10
|
+
"Summarise a period's results for leadership with three or four headline numbers.",
|
|
11
|
+
"Review key metrics against the previous period and name what drove the change.",
|
|
12
|
+
"Report a project's health by workstream, with the main risks and one request.",
|
|
13
|
+
"Prepare a decision meeting by stating the evidence and the next steps in under a minute."
|
|
14
|
+
],
|
|
15
|
+
"audience": ["executives", "managers", "finance", "stakeholders"],
|
|
16
|
+
"goodFor": "Periodic results or status for people who decide, with 2-4 numbers or 2-6 workstreams.",
|
|
17
|
+
"notFor": "Telling the story of one finding (datastory), persuading buyers (pitch).",
|
|
18
|
+
"tags": ["report", "kpi", "status", "finance", "data", "review", "update", "internal"],
|
|
19
|
+
"tone": ["formal", "direct"],
|
|
20
|
+
"aspects": ["16:9"]
|
|
21
|
+
},
|
|
22
|
+
"requires": {
|
|
23
|
+
"storyboard": 1,
|
|
24
|
+
"scenes": ["title", "kpi-grid", "bullets", "icon-grid", "callout", "outro"]
|
|
25
|
+
},
|
|
26
|
+
"themes": [
|
|
27
|
+
{ "id": "data-light", "file": "@shared/data-light.json", "mode": "light", "pair": "data-dark" },
|
|
28
|
+
{ "id": "data-dark", "file": "@shared/data-dark.json", "mode": "dark", "pair": "data-light" },
|
|
29
|
+
{ "id": "calm-light", "file": "@shared/calm-light.json", "mode": "light", "pair": "calm-dark" },
|
|
30
|
+
{ "id": "calm-dark", "file": "@shared/calm-dark.json", "mode": "dark", "pair": "calm-light" },
|
|
31
|
+
{
|
|
32
|
+
"id": "editorial-light",
|
|
33
|
+
"file": "@shared/editorial-light.json",
|
|
34
|
+
"mode": "light",
|
|
35
|
+
"pair": "editorial-dark"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"id": "editorial-dark",
|
|
39
|
+
"file": "@shared/editorial-dark.json",
|
|
40
|
+
"mode": "dark",
|
|
41
|
+
"pair": "editorial-light"
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
"styles": [
|
|
45
|
+
{ "id": "exec", "file": "styles/exec.json" },
|
|
46
|
+
{ "id": "walkthrough", "file": "styles/walkthrough.json" },
|
|
47
|
+
{ "id": "memo", "file": "styles/memo.json" }
|
|
48
|
+
],
|
|
49
|
+
"blueprints": [
|
|
50
|
+
{ "id": "kpi-review", "file": "blueprints/kpi-review.json" },
|
|
51
|
+
{ "id": "status", "file": "blueprints/status.json" }
|
|
52
|
+
],
|
|
53
|
+
"pacing": "pacing.json",
|
|
54
|
+
"copy": "copy.md",
|
|
55
|
+
"license": "Apache-2.0"
|
|
56
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "announce",
|
|
3
|
+
"purpose": "A vertical announcement clip: a big headline card, an optional big number, and a call to action.",
|
|
4
|
+
"discover": {
|
|
5
|
+
"useCases": [
|
|
6
|
+
"Announce news or a launch with one big number and a call to action.",
|
|
7
|
+
"Tease something new in a short vertical clip that ends with where to go next.",
|
|
8
|
+
"Share a milestone with one number and a thank-you."
|
|
9
|
+
],
|
|
10
|
+
"audience": ["followers", "customers", "community"],
|
|
11
|
+
"goodFor": "One headline, at most one number and one action, 8-20 s, vertical.",
|
|
12
|
+
"notFor": "Several points (tip, listicle), detailed updates (update), data stories (datastory).",
|
|
13
|
+
"tags": ["social", "vertical", "announce", "launch", "promo", "marketing"],
|
|
14
|
+
"tone": ["punchy", "excited"],
|
|
15
|
+
"aspects": ["9:16", "1:1"],
|
|
16
|
+
"lengths": {
|
|
17
|
+
"min": 8,
|
|
18
|
+
"max": 20
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"slots": {
|
|
22
|
+
"headline": {
|
|
23
|
+
"type": "text",
|
|
24
|
+
"max": 50,
|
|
25
|
+
"required": true
|
|
26
|
+
},
|
|
27
|
+
"stat": {
|
|
28
|
+
"type": "object",
|
|
29
|
+
"fields": {
|
|
30
|
+
"value": "number",
|
|
31
|
+
"label": "text"
|
|
32
|
+
},
|
|
33
|
+
"optional": true
|
|
34
|
+
},
|
|
35
|
+
"cta": {
|
|
36
|
+
"type": "text",
|
|
37
|
+
"max": 36,
|
|
38
|
+
"required": true
|
|
39
|
+
},
|
|
40
|
+
"handle": {
|
|
41
|
+
"type": "text",
|
|
42
|
+
"max": 24,
|
|
43
|
+
"optional": true
|
|
44
|
+
},
|
|
45
|
+
"platform": {
|
|
46
|
+
"type": "enum",
|
|
47
|
+
"values": ["tiktok", "reels", "shorts"],
|
|
48
|
+
"default": "tiktok"
|
|
49
|
+
},
|
|
50
|
+
"length": {
|
|
51
|
+
"type": "enum",
|
|
52
|
+
"values": ["short", "standard", "long"],
|
|
53
|
+
"default": "standard"
|
|
54
|
+
},
|
|
55
|
+
"style": {
|
|
56
|
+
"type": "enum",
|
|
57
|
+
"values": ["hook-first", "captioned", "techcut"],
|
|
58
|
+
"default": "hook-first"
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"example": {
|
|
62
|
+
"headline": "Briar Notes 2.0 is [here]",
|
|
63
|
+
"stat": {
|
|
64
|
+
"value": 500,
|
|
65
|
+
"label": "people on the waitlist"
|
|
66
|
+
},
|
|
67
|
+
"cta": "Link in bio",
|
|
68
|
+
"handle": "@briar.labs"
|
|
69
|
+
},
|
|
70
|
+
"meta": {
|
|
71
|
+
"title": {
|
|
72
|
+
"$slot": "cta"
|
|
73
|
+
},
|
|
74
|
+
"lang": "en"
|
|
75
|
+
},
|
|
76
|
+
"scenes": [
|
|
77
|
+
{
|
|
78
|
+
"id": "headline",
|
|
79
|
+
"type": "callout",
|
|
80
|
+
"props": {
|
|
81
|
+
"kind": "statement",
|
|
82
|
+
"text": {
|
|
83
|
+
"$slot": "headline"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"when": "stat",
|
|
89
|
+
"id": "number",
|
|
90
|
+
"type": "stat",
|
|
91
|
+
"props": {
|
|
92
|
+
"$spread": "stat"
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"id": "end",
|
|
97
|
+
"type": "title",
|
|
98
|
+
"props": {
|
|
99
|
+
"kicker": {
|
|
100
|
+
"$slot": "handle"
|
|
101
|
+
},
|
|
102
|
+
"title": {
|
|
103
|
+
"$slot": "cta"
|
|
104
|
+
},
|
|
105
|
+
"subtitle": "Follow along"
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
]
|
|
109
|
+
}
|