stillmade-sdk 0.1.42 → 0.1.44

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 (262) hide show
  1. package/.stillmade/sdk-baseline.json +6 -8
  2. package/AGENTS.md +15 -10
  3. package/FRAME_VIEWS.md +113 -0
  4. package/INTERFACE_DESIGN.md +62 -22
  5. package/MOBILE_UI.md +4 -2
  6. package/MODULES.md +152 -6
  7. package/PASTE_TO_LLM.md +35 -25
  8. package/README.md +3 -2
  9. package/SDK.md +994 -550
  10. package/UI_AESTHETIC.md +22 -2
  11. package/blocks/generate/package.js +1 -0
  12. package/blocks/generate/versions/1.0.0/package.js +463 -0
  13. package/docs/build/audio-to-editor.md +36 -0
  14. package/docs/build/block-builder-contract.md +150 -0
  15. package/docs/build/comfyui.md +227 -0
  16. package/docs/build/concepts.md +40 -0
  17. package/docs/build/context.md +159 -0
  18. package/docs/build/cookbook.md +57 -0
  19. package/docs/build/custom-interface.md +617 -0
  20. package/docs/build/data-types.md +83 -0
  21. package/docs/build/frame-views.md +259 -0
  22. package/docs/build/generate-media.md +59 -0
  23. package/docs/build/github-applications.md +314 -0
  24. package/docs/build/hosted-images.md +214 -0
  25. package/docs/build/hosted-music.md +39 -0
  26. package/docs/build/hosted-speech.md +157 -0
  27. package/docs/build/hosted-text.md +246 -0
  28. package/docs/build/image-description.md +49 -0
  29. package/docs/build/interface-design.md +343 -0
  30. package/docs/build/javascript.md +63 -0
  31. package/docs/build/local-preview.md +61 -0
  32. package/docs/build/media-analysis.md +27 -0
  33. package/docs/build/media.md +400 -0
  34. package/docs/build/mobile-ui.md +106 -0
  35. package/docs/build/modules.md +487 -0
  36. package/docs/build/original-blocks.md +70 -0
  37. package/docs/build/outside-apis.md +128 -0
  38. package/docs/build/production-context-templates.md +12 -0
  39. package/docs/build/project-storage.md +94 -0
  40. package/docs/build/quickstart.md +48 -0
  41. package/docs/build/recipes.md +103 -0
  42. package/docs/build/script-handoff.md +45 -0
  43. package/docs/build/script-writer.md +34 -0
  44. package/docs/build/state.md +223 -0
  45. package/docs/build/testing.md +112 -0
  46. package/docs/build/timeline-edits.md +116 -0
  47. package/docs/build/timeline-proposals.md +76 -0
  48. package/docs/build/transcription.md +59 -0
  49. package/docs/build/triggers.md +59 -0
  50. package/docs/build/tutorial.md +52 -0
  51. package/docs/build/typescript.md +34 -0
  52. package/docs/build/video-generation.md +61 -0
  53. package/docs/build/web-reading.md +37 -0
  54. package/docs/build/with-your-ai.md +27 -0
  55. package/docs/changelog.md +9 -0
  56. package/docs/creators.md +21 -0
  57. package/docs/distribute/discovery.md +43 -0
  58. package/docs/distribute/imports.md +58 -0
  59. package/docs/distribute/publishing.md +29 -0
  60. package/docs/distribute/sdk-versions.md +36 -0
  61. package/docs/distribute/selling.md +14 -0
  62. package/docs/distribute/teams.md +60 -0
  63. package/docs/distribute/versioning.md +28 -0
  64. package/docs/examples.md +23 -0
  65. package/docs/gallery.md +26 -0
  66. package/docs/index.md +50 -0
  67. package/docs/native-mcp.md +307 -0
  68. package/docs/project-types/automation.md +43 -0
  69. package/docs/project-types/batches.md +50 -0
  70. package/docs/project-types/build.md +42 -0
  71. package/docs/project-types/completion.md +15 -0
  72. package/docs/project-types/conditions.md +21 -0
  73. package/docs/project-types/hosted-review.md +115 -0
  74. package/docs/project-types/onboarding.md +75 -0
  75. package/docs/project-types/running.md +309 -0
  76. package/docs/project-types/testing.md +72 -0
  77. package/docs/reference/application-artifacts.md +87 -0
  78. package/docs/reference/authoring-guide.md +134 -0
  79. package/docs/reference/browser-applications.md +267 -0
  80. package/docs/reference/capabilities.md +45 -0
  81. package/docs/reference/cli.md +71 -0
  82. package/docs/reference/connection-api.md +59 -0
  83. package/docs/reference/cooperative-jobs.md +13 -0
  84. package/docs/reference/desktop-capabilities.md +172 -0
  85. package/docs/reference/desktop-execution.md +77 -0
  86. package/docs/reference/errors.md +233 -0
  87. package/docs/reference/execution.md +800 -0
  88. package/docs/reference/first-party-blocks.md +40 -0
  89. package/docs/reference/generation-models.md +59 -0
  90. package/docs/reference/limits.md +306 -0
  91. package/docs/reference/manifest-kinds-controls.md +36 -0
  92. package/docs/reference/manifest.md +181 -0
  93. package/docs/reference/operations.md +36 -0
  94. package/docs/reference/package-jobs.md +35 -0
  95. package/docs/reference/parity.md +55 -0
  96. package/docs/reference/permissions.md +86 -0
  97. package/docs/reference/ports.md +26 -0
  98. package/docs/reference/types.md +268 -0
  99. package/docs/reference/universal-resolver.md +303 -0
  100. package/docs/reference/view-bridge.md +60 -0
  101. package/docs/reference/view-rules.md +15 -0
  102. package/docs/reference/workspace-sync.md +25 -0
  103. package/docs/sdk.md +34 -0
  104. package/docs/tools/block-remix.md +211 -0
  105. package/docs/tools/llm.md +2213 -0
  106. package/docs/tools/repository-adaptation.md +613 -0
  107. package/examples/check-clip.stillmade.json +4 -1
  108. package/examples/generate-video.stillmade.json +6 -2
  109. package/examples/research-topic.stillmade.json +5 -1
  110. package/examples/text-workflow.stillmade.json +3 -32
  111. package/examples/timeline-polish.stillmade.json +11 -3
  112. package/examples/transcribe-audio.stillmade.json +11 -3
  113. package/package.json +1 -1
  114. package/packages/block-cli/cli.js +13 -6
  115. package/packages/block-cli/dev-host/assets/host.js +76 -38
  116. package/packages/block-cli/dev-host/assets/index.css +1 -1
  117. package/packages/block-cli/format.js +1 -1
  118. package/packages/block-cli/templates.js +31 -13
  119. package/packages/block-cli/type-packages.js +119 -0
  120. package/packages/block-platform/block-readiness.js +5 -0
  121. package/packages/block-platform/canvas.js +2 -1
  122. package/packages/block-platform/catalog.js +27 -48
  123. package/packages/block-platform/native-host-inventory.js +0 -226
  124. package/packages/block-platform/plain-descriptions.js +1 -25
  125. package/packages/block-platform/project-type-starters.js +13 -53
  126. package/packages/block-platform/script-handoff.js +2 -4
  127. package/packages/block-platform/type-workspace.js +2 -0
  128. package/packages/block-sdk/appearance.js +3 -1
  129. package/packages/block-sdk/block-tier.js +1 -1
  130. package/packages/block-sdk/builder-contract.js +10 -8
  131. package/packages/block-sdk/capabilities.js +1 -1
  132. package/packages/block-sdk/contracts.js +6 -2
  133. package/packages/block-sdk/first-party-identities.js +1 -84
  134. package/packages/block-sdk/first-party-packages.js +3 -85
  135. package/packages/block-sdk/generation-catalog.js +15 -3
  136. package/packages/block-sdk/index.d.ts +2 -1
  137. package/packages/block-sdk/media-analysis-example.js +1 -1
  138. package/packages/block-sdk/mock-host.js +7 -1
  139. package/packages/block-sdk/module-host-calls.js +35 -10
  140. package/packages/block-sdk/module-hosted.js +15 -2
  141. package/packages/block-sdk/module-media-access.js +71 -0
  142. package/packages/block-sdk/module-node.js +1 -1
  143. package/packages/block-sdk/portable-media-actions.js +1 -1
  144. package/packages/block-sdk/runtime.js +1 -1
  145. package/packages/block-sdk/timeline-proposal-example.js +1 -1
  146. package/packages/block-sdk/transcription-example.js +1 -1
  147. package/packages/block-sdk/video-generation-example.js +1 -1
  148. package/packages/block-sdk/view-bridge.js +4 -1
  149. package/packages/block-sdk/view-design.js +17 -14
  150. package/packages/block-sdk/web-example.js +1 -1
  151. package/packages/design-system/block-kit.css +48 -12
  152. package/packages/design-system/block-kit.html +3 -2
  153. package/blocks/mcp-motion-planner/versions/1.1.0/package.js +0 -97
  154. package/blocks/motion-designer/versions/1.0.1/package.js +0 -173318
  155. package/blocks/motion-designer/versions/1.0.2/package.js +0 -173318
  156. package/blocks/motion-frame-review/versions/1.1.1/package.js +0 -465
  157. package/blocks/motion-frame-review/versions/1.1.2/package.snapshot.js +0 -572
  158. package/blocks/narration/package.js +0 -1
  159. package/blocks/narration/versions/1.0.0/package.js +0 -221
  160. package/blocks/narration/versions/1.0.1/package.js +0 -221
  161. package/blocks/native/sm.animated-scene/versions/2.0.0/package.js +0 -475
  162. package/blocks/native/sm.animated-scene/versions/2.1.0/package.js +0 -498
  163. package/blocks/native/sm.animated-scene/versions/2.2.0/package.js +0 -524
  164. package/blocks/native/sm.animated-scene/versions/2.3.0/package.js +0 -618
  165. package/blocks/native/sm.animated-scene/versions/2.3.1/package.js +0 -618
  166. package/blocks/native/sm.animated-scene/versions/2.3.2/package.js +0 -723
  167. package/blocks/native/sm.animated-scene/versions/2.3.3/package.js +0 -723
  168. package/blocks/native/sm.animated-scene/versions/2.3.4/package.js +0 -676
  169. package/blocks/native/sm.animated-scene/versions/2.3.5/package.js +0 -693
  170. package/blocks/native/sm.animated-scene/versions/2.3.6/package.js +0 -700
  171. package/blocks/native/sm.animated-scene/versions/2.3.7/package.js +0 -747
  172. package/blocks/native/sm.animated-scene/versions/2.3.8/package.js +0 -769
  173. package/blocks/native/sm.animated-scene/versions/2.3.9/package.js +0 -769
  174. package/blocks/native/sm.animated-scene-assistant/versions/1.0.0/package.js +0 -183
  175. package/blocks/native/sm.blueprint/versions/2.0.0/package.js +0 -358
  176. package/blocks/native/sm.blueprint/versions/2.1.0/package.js +0 -358
  177. package/blocks/native/sm.blueprint/versions/2.1.1/package.js +0 -358
  178. package/blocks/native/sm.blueprint/versions/2.1.2/package.js +0 -358
  179. package/blocks/native/sm.blueprint/versions/2.1.3/package.js +0 -381
  180. package/blocks/native/sm.blueprint/versions/2.1.4/package.js +0 -381
  181. package/blocks/native/sm.blueprint/versions/2.1.5/package.js +0 -339
  182. package/blocks/native/sm.blueprint/versions/2.1.6/package.js +0 -356
  183. package/blocks/native/sm.blueprint/versions/2.1.7/package.js +0 -363
  184. package/blocks/native/sm.blueprint/versions/2.1.8/package.js +0 -410
  185. package/blocks/native/sm.blueprint/versions/2.1.9/package.js +0 -422
  186. package/blocks/native/sm.blueprint-assistant/versions/1.0.0/package.js +0 -172
  187. package/blocks/native/sm.chat/versions/2.0.0/package.js +0 -144
  188. package/blocks/native/sm.chat/versions/2.0.1/package.js +0 -97
  189. package/blocks/native/sm.chat/versions/2.0.2/package.js +0 -100
  190. package/blocks/native/sm.chat/versions/2.0.3/package.js +0 -100
  191. package/blocks/native/sm.continue-if/versions/1.0.0/package.js +0 -168
  192. package/blocks/native/sm.describe-media/versions/2.0.0/package.js +0 -153
  193. package/blocks/native/sm.describe-media/versions/2.0.1/package.js +0 -156
  194. package/blocks/native/sm.describe-media/versions/2.1.0/package.js +0 -140
  195. package/blocks/native/sm.image-editor/versions/2.0.0/package.js +0 -183
  196. package/blocks/native/sm.image-editor/versions/2.0.1/package.js +0 -190
  197. package/blocks/native/sm.new-items/versions/1.0.0/package.js +0 -191
  198. package/blocks/native/sm.pick-photos/versions/1.0.0/package.js +0 -334
  199. package/blocks/native/sm.quality-audit/versions/1.0.0/package.js +0 -192
  200. package/blocks/native/sm.quality-audit/versions/1.0.1/package.js +0 -192
  201. package/blocks/native/sm.quality-audit/versions/1.0.2/package.js +0 -195
  202. package/blocks/native/sm.research/versions/2.0.0/package.js +0 -175
  203. package/blocks/native/sm.research/versions/2.0.1/package.js +0 -184
  204. package/blocks/native/sm.research/versions/2.0.2/package.js +0 -187
  205. package/blocks/native/sm.script/versions/2.0.0/package.js +0 -144
  206. package/blocks/native/sm.script/versions/2.1.0/package.js +0 -144
  207. package/blocks/native/sm.script/versions/2.1.1/package.js +0 -144
  208. package/blocks/native/sm.script/versions/2.1.2/package.js +0 -105
  209. package/blocks/native/sm.script/versions/2.1.3/package.js +0 -152
  210. package/blocks/native/sm.script/versions/2.1.4/package.js +0 -156
  211. package/blocks/native/sm.script/versions/2.1.5/package.js +0 -156
  212. package/blocks/native/sm.shot-plan/versions/2.0.0/package.js +0 -301
  213. package/blocks/native/sm.shot-plan/versions/2.1.0/package.js +0 -528
  214. package/blocks/native/sm.shot-plan/versions/2.1.1/package.js +0 -528
  215. package/blocks/native/sm.shot-plan/versions/2.1.2/package.js +0 -528
  216. package/blocks/native/sm.shot-plan/versions/2.1.3/package.js +0 -536
  217. package/blocks/native/sm.shot-plan/versions/2.2.0/package.js +0 -800
  218. package/blocks/native/sm.shot-plan/versions/2.2.1/package.js +0 -920
  219. package/blocks/native/sm.shot-plan-assistant/versions/1.0.0/package.js +0 -173
  220. package/blocks/native/sm.stock-search/versions/2.0.0/package.js +0 -174
  221. package/blocks/native/sm.thumbnail/versions/2.0.0/package.js +0 -137
  222. package/blocks/native/sm.thumbnail/versions/2.0.1/package.js +0 -140
  223. package/blocks/native/sm.transcribe/versions/2.0.0/package.js +0 -163
  224. package/blocks/native/sm.transcribe/versions/2.0.1/package.js +0 -168
  225. package/blocks/native/sm.whiteboard-assistant/versions/1.0.0/package.js +0 -175
  226. package/blocks/native/sm.youtube/versions/2.0.0/package.js +0 -217
  227. package/blocks/occasion-story/package.js +0 -1
  228. package/blocks/occasion-story/versions/1.0.0/package.js +0 -1658
  229. package/blocks/occasion-story/versions/1.0.1/package.js +0 -1699
  230. package/blocks/occasion-story/versions/1.0.2/package.js +0 -1682
  231. package/blocks/photo-reel-composer/versions/1.0.0/package.js +0 -3043
  232. package/blocks/photo-reel-composer/versions/1.0.1/package.js +0 -3026
  233. package/blocks/photo-reel-composer/versions/1.0.2/package.js +0 -4149
  234. package/blocks/product-ad-variants/versions/1.0.0/package.js +0 -2911
  235. package/blocks/product-launch-director/versions/1.0.0/package.js +0 -103
  236. package/blocks/release-visuals/package.js +0 -1
  237. package/blocks/release-visuals/versions/1.0.0/package.js +0 -1492
  238. package/blocks/release-visuals/versions/1.0.1/package.js +0 -1517
  239. package/blocks/release-visuals/versions/1.0.2/package.js +0 -1500
  240. package/blocks/screen-recorder/package.js +0 -1
  241. package/blocks/screen-recorder/versions/1.0.0/package.js +0 -223
  242. package/blocks/screen-recorder/versions/1.0.1/package.js +0 -223
  243. package/blocks/short-form-finish/package.js +0 -1
  244. package/blocks/short-form-finish/versions/1.0.0/package.js +0 -1043
  245. package/blocks/short-form-finish/versions/1.0.1/package.js +0 -1043
  246. package/blocks/short-form-finish/versions/1.0.2/package.js +0 -1043
  247. package/blocks/short-form-finish/versions/1.0.3/package.js +0 -1026
  248. package/examples/saas-product-launch-reviewed-source.stillmade.json +0 -383
  249. package/examples/saas-product-launch.stillmade.json +0 -304
  250. package/packages/block-platform/dealer-inventory-video-project-type.js +0 -38
  251. package/packages/block-platform/first-revenue-project-types.js +0 -46
  252. package/packages/block-platform/fixture-starters.js +0 -13
  253. package/packages/block-platform/launch-project-source.js +0 -10
  254. package/packages/block-platform/launch-project.js +0 -30
  255. package/packages/block-platform/motion-project-types.js +0 -55
  256. package/packages/block-platform/motion-starters.js +0 -14
  257. package/packages/block-platform/product-ad-variants-project-type.js +0 -30
  258. package/packages/block-platform/product-launch-updated.js +0 -90
  259. package/packages/block-platform/revenue-review-project-types.js +0 -36
  260. package/packages/block-platform/revenue-review-starters.js +0 -13
  261. package/packages/block-platform/script-writer.js +0 -29
  262. package/packages/block-platform/website-source-block.js +0 -14
@@ -1,2911 +0,0 @@
1
- // Generated from the independently owned versioned source.
2
- export default {
3
- "manifest": {
4
- "schemaVersion": 1,
5
- "sdkVersion": "0.1.0",
6
- "id": "stillmade.product-ad-variants",
7
- "version": "1.0.0",
8
- "name": "Product Ad Variants",
9
- "description": "Create three distinct source-footage previews and approved hooks ahead of the same full product demonstration. No generated scenes or invented claims.",
10
- "kind": "task",
11
- "runtime": "javascript",
12
- "entry": "src/run.js",
13
- "license": "MIT",
14
- "inputs": {
15
- "timeline": {
16
- "type": "timeline",
17
- "primary": true,
18
- "required": true,
19
- "default": {
20
- "schemaVersion": 1,
21
- "clips": [],
22
- "audioItems": [],
23
- "captions": [],
24
- "textOverlays": []
25
- },
26
- "semantic": "legacy.timeline.updatededitor",
27
- "sources": [
28
- "upstream",
29
- "user"
30
- ],
31
- "description": "Reviewed portrait demonstration from one original video. Keep its complete frame, source-speed cuts, approved copy and optional original speech/captions."
32
- },
33
- "hookA": {
34
- "type": "text",
35
- "default": "",
36
- "required": true,
37
- "description": "Exact approved hook A. Up to 64 characters; it must be supported by the real footage and offer.",
38
- "semantic": "stillmade.product_ad_variants.hooka",
39
- "sources": [
40
- "user",
41
- "default"
42
- ]
43
- },
44
- "hookB": {
45
- "type": "text",
46
- "default": "",
47
- "required": true,
48
- "description": "Exact approved hook B. Use a genuinely different opening angle, without inventing a benefit or claim.",
49
- "semantic": "stillmade.product_ad_variants.hookb",
50
- "sources": [
51
- "user",
52
- "default"
53
- ]
54
- },
55
- "hookC": {
56
- "type": "text",
57
- "default": "",
58
- "required": true,
59
- "description": "Exact approved hook C. Keep this distinct from A and B and supported by the source.",
60
- "semantic": "stillmade.product_ad_variants.hookc",
61
- "sources": [
62
- "user",
63
- "default"
64
- ]
65
- },
66
- "openingA": {
67
- "type": "number",
68
- "min": 0,
69
- "default": 0,
70
- "description": "Source-video start in seconds for preview A. Choose a visible product moment.",
71
- "semantic": "stillmade.product_ad_variants.openinga",
72
- "sources": [
73
- "user",
74
- "default"
75
- ],
76
- "required": false
77
- },
78
- "openingB": {
79
- "type": "number",
80
- "min": 0,
81
- "default": 2,
82
- "description": "Source-video start in seconds for preview B. It must not overlap the other two previews.",
83
- "semantic": "stillmade.product_ad_variants.openingb",
84
- "sources": [
85
- "user",
86
- "default"
87
- ],
88
- "required": false
89
- },
90
- "openingC": {
91
- "type": "number",
92
- "min": 0,
93
- "default": 4,
94
- "description": "Source-video start in seconds for preview C. Choose a different visible source moment.",
95
- "semantic": "stillmade.product_ad_variants.openingc",
96
- "sources": [
97
- "user",
98
- "default"
99
- ],
100
- "required": false
101
- },
102
- "openingDuration": {
103
- "type": "number",
104
- "min": 1,
105
- "max": 3,
106
- "default": 2,
107
- "description": "Length of each source preview, 1–3 seconds. The full unchanged demonstration follows each preview.",
108
- "semantic": "stillmade.product_ad_variants.openingduration",
109
- "sources": [
110
- "user",
111
- "default"
112
- ],
113
- "required": false
114
- },
115
- "copyApproved": {
116
- "type": "boolean",
117
- "default": false,
118
- "required": true,
119
- "sources": [
120
- "user"
121
- ],
122
- "description": "I have permission to use this footage and have approved all three exact hooks against what it actually shows.",
123
- "semantic": "stillmade.product_ad_variants.copyapproved"
124
- }
125
- },
126
- "outputs": {
127
- "variantA": {
128
- "type": "timeline",
129
- "primary": true,
130
- "semantic": "legacy.timeline.updatededitor",
131
- "description": "Variant A: its selected actual-footage preview and approved hook, followed by the full demonstration. Review and export separately."
132
- },
133
- "variantB": {
134
- "type": "timeline",
135
- "semantic": "legacy.timeline.updatededitor",
136
- "description": "Variant B: its selected actual-footage preview and approved hook, followed by the full demonstration. Review and export separately."
137
- },
138
- "variantC": {
139
- "type": "timeline",
140
- "semantic": "legacy.timeline.updatededitor",
141
- "description": "Variant C: its selected actual-footage preview and approved hook, followed by the full demonstration. Review and export separately."
142
- },
143
- "review": {
144
- "type": "json",
145
- "semantic": "stillmade.product_ad_variants.review",
146
- "description": "Exact source, opening selections, approved hooks and outstanding human review.",
147
- "schema": {
148
- "schemaVersion": "integer",
149
- "state": "string",
150
- "humanApproved": "boolean",
151
- "providerCalls": "integer",
152
- "source": {
153
- "assetId": "string",
154
- "versionId": "string"
155
- },
156
- "bodyDuration": "number",
157
- "outputDuration": "number",
158
- "variants": [
159
- {
160
- "id": "string",
161
- "hook": "string",
162
- "openingFrom": "number",
163
- "openingTo": "number"
164
- }
165
- ],
166
- "warnings": "string[]"
167
- }
168
- }
169
- },
170
- "permissions": {
171
- "project": [
172
- "asset.read"
173
- ],
174
- "network": [],
175
- "filesystem": [],
176
- "secrets": []
177
- },
178
- "ui": [
179
- {
180
- "port": "openingDuration",
181
- "control": "slider",
182
- "min": 1,
183
- "max": 3,
184
- "step": 0.1
185
- }
186
- ],
187
- "provenance": {
188
- "notice": "Original source (authorship declared by the packager)\nLicense: MIT\nChanges: Original implementation declared by the packager; no reused repository or dependency code.\nFiles: LICENSE, src/run.js\n\nMIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and \nassociated documentation files (the \"Software\"), to deal in the Software without restriction, including \nwithout limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell \ncopies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the \nfollowing conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial \nportions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT \nLIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO \nEVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER \nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE \nUSE OR OTHER DEALINGS IN THE SOFTWARE.\n",
189
- "portableSources": [
190
- {
191
- "kind": "original",
192
- "license": "MIT",
193
- "paths": [
194
- "LICENSE",
195
- "src/run.js"
196
- ],
197
- "evidence": [
198
- "upstream/0/LICENSE",
199
- "upstream/0/src/run.js"
200
- ],
201
- "changes": "Original implementation declared by the packager; no reused repository or dependency code."
202
- }
203
- ]
204
- },
205
- "semantics": [
206
- {
207
- "name": "stillmade.product_ad_variants.hooka",
208
- "description": "Exact approved hook A. Up to 64 characters; it must be supported by the real footage and offer.",
209
- "parents": []
210
- },
211
- {
212
- "name": "stillmade.product_ad_variants.hookb",
213
- "description": "Exact approved hook B. Use a genuinely different opening angle, without inventing a benefit or claim.",
214
- "parents": []
215
- },
216
- {
217
- "name": "stillmade.product_ad_variants.hookc",
218
- "description": "Exact approved hook C. Keep this distinct from A and B and supported by the source.",
219
- "parents": []
220
- },
221
- {
222
- "name": "stillmade.product_ad_variants.openinga",
223
- "description": "Source-video start in seconds for preview A. Choose a visible product moment.",
224
- "parents": []
225
- },
226
- {
227
- "name": "stillmade.product_ad_variants.openingb",
228
- "description": "Source-video start in seconds for preview B. It must not overlap the other two previews.",
229
- "parents": []
230
- },
231
- {
232
- "name": "stillmade.product_ad_variants.openingc",
233
- "description": "Source-video start in seconds for preview C. Choose a different visible source moment.",
234
- "parents": []
235
- },
236
- {
237
- "name": "stillmade.product_ad_variants.openingduration",
238
- "description": "Length of each source preview, 1–3 seconds. The full unchanged demonstration follows each preview.",
239
- "parents": []
240
- },
241
- {
242
- "name": "stillmade.product_ad_variants.copyapproved",
243
- "description": "I have permission to use this footage and have approved all three exact hooks against what it actually shows.",
244
- "parents": []
245
- },
246
- {
247
- "name": "stillmade.product_ad_variants.review",
248
- "description": "Exact source, opening selections, approved hooks and outstanding human review.",
249
- "parents": []
250
- }
251
- ]
252
- },
253
- "code": "// Block-owned source editing, executed only inside the declared SDK sandbox.\nconst clone = value => JSON.parse(JSON.stringify(value));\nconst check = (condition, message) => { if (!condition) throw Error(message); };\nconst round = value => Math.round(value * 1000000) / 1000000;\nconst base = input.timeline;\ncheck(base && base.schemaVersion === 1 && Array.isArray(base.clips) && base.clips.length > 0 && base.clips.length <= 12, 'Connect the reviewed Product Demonstration timeline.');\ncheck(base.aspect === '9:16', 'Prepare a portrait 9:16 demonstration before making variants.');\ncheck(Number.isFinite(base.targetDuration) && base.targetDuration >= 5 && base.targetDuration <= 60, 'Use a complete 5–60 second product demonstration.');\ncheck(input.copyApproved === true, 'Confirm permission for the source footage and review all three exact hooks against what it actually shows.');\ncheck(!base.stillmadeWatermark && !base.stillmadeEndScreen, 'Use an editable source timeline, before host export branding.');\ncheck(!(base.effects || []).length && !(base.stickers || []).length, 'Use the simple demonstration timeline before adding effects or graphic layers.');\nconst source = base.clips[0].asset;\ncheck(source && source.kind === 'video' && source.assetId && source.versionId && Number.isFinite(source.duration) && source.duration > 0 && Number.isFinite(source.width) && source.width > 0 && Number.isFinite(source.height) && source.height > 0, 'The original video needs its saved asset/version, duration and dimensions.');\ncheck(typeof source.url === 'string' && /^(https:\\/\\/|http:\\/\\/(localhost|127\\.0\\.0\\.1)(:\\d+)?\\/|\\/api\\/media\\/[a-zA-Z0-9_-]+\\/|sm-media:|blob:)/.test(source.url) && !/^https?:\\/\\/[^/?#]*@/.test(source.url), 'Use an authorized saved source video reference.');\nlet end = 0;\nfor (const clip of base.clips) {\n check(clip.kind === 'video' && clip.asset?.assetId === source.assetId && clip.asset?.versionId === source.versionId && clip.url === source.url, 'All demonstration selections must use the same exact original footage.');\n check(Number.isFinite(clip.start) && Math.abs(clip.start - end) < .001 && Number.isFinite(clip.duration) && clip.duration > 0, 'Keep the demonstration selections sequential, without gaps or overlaps.');\n check(clip.speed === 1 && Number.isFinite(clip.trimStart) && clip.trimStart >= 0 && clip.trimStart + clip.duration <= source.duration + .02, 'Use source-speed cuts within the original footage.');\n check(clip.transform?.fit === 'contain' && clip.transform?.rotation === 0 && clip.transform?.scale === 1 && clip.transform?.x === 0 && clip.transform?.y === 0, 'Keep the complete original frame for these evidence-preserving variants.');\n end = round(clip.start + clip.duration);\n}\ncheck(Math.abs(end - base.targetDuration) < .02, 'The demonstration duration must match its actual source selections.');\nconst length = input.openingDuration;\ncheck(Number.isFinite(length) && length >= 1 && length <= 3, 'Choose a 1–3 second opening preview.');\nconst options = ['A', 'B', 'C'].map(id => {\n const hook = input['hook' + id];\n check(typeof hook === 'string' && hook.trim() && hook.length <= 64 && !/[\\u0000-\\u001f<>]/.test(hook) && hook.split(/\\s+/).every(word => word.length <= 28), 'Supply a distinct approved hook of up to 64 plain-text characters for each variant.');\n const from = input['opening' + id];\n check(Number.isFinite(from) && from >= 0 && from + length <= source.duration + .001, 'Every opening preview must fit inside the original source video.');\n return {id, hook: hook.trim(), from, to: round(from + length)};\n});\ncheck(new Set(options.map(option => option.hook.toLowerCase())).size === 3, 'Use three distinct approved hooks.');\nfor (let i = 0; i < options.length; i++) for (let j = i + 1; j < options.length; j++) check(Math.abs(options[i].from - options[j].from) >= length - .001, 'Choose three non-overlapping source moments so the openings genuinely differ.');\nconst duration = round(base.targetDuration + length);\nconst shift = row => ({...clone(row), start: round((row.start || 0) + length), ...(Number.isFinite(row.end) ? {end: round(row.end + length)} : {})});\nconst rows = key => { check(base[key] === undefined || Array.isArray(base[key]), 'The demonstration contains unsupported editing data.'); return base[key] || []; };\nconst originalAudio = rows('audioItems'), originalCaptions = rows('captions'), originalCopy = rows('textOverlays');\ncheck(originalCaptions.length <= 500 && originalCopy.length <= 20 && originalAudio.length <= 20, 'Use a bounded demonstration timeline.');\nconst openingText = (id, text, y, size) => ({id,trackId:'variant-hook',type:'text',text,start:0,end:length,font:'Hanken Grotesk',size,color:'#F7F0DB',background:'#0A0A0A',backgroundOpacity:85,backgroundPadding:5,width:.82,x:50,y,position:'center',animation:'fade',animIn:.12,animOut:.1});\nconst outputs = {};\nfor (const option of options) {\n const timeline = clone(base);\n timeline.name = 'Variant ' + option.id + ' · ' + option.hook;\n timeline.targetDuration = duration;\n timeline.clips = [{...clone(base.clips[0]), id:'opening-preview-' + option.id, title:'Source preview ' + option.id, start:0, duration:length, trimStart:option.from, volume:0, transition:{type:'Cut',duration:0}, motion:{type:'none'}}, ...base.clips.map(shift)];\n timeline.audioItems = originalAudio.map(row => {\n // Only the existing explicitly named music bed may continue across the new\n // preview. Original speech stays attached to the untouched demonstration.\n if (row.id !== 'music-bed' || row.asset?.kind !== 'audio' || row.start !== 0) return shift(row);\n const offset = row.sourceOffset || row.trimStart || 0;\n check(Number.isFinite(row.asset.duration) && row.asset.duration >= offset + duration, 'The licensed music is too short for the opening plus full demonstration. Choose a longer soundtrack or omit it.');\n return {...clone(row), duration};\n });\n timeline.captions = originalCaptions.map(shift);\n const hookSize = Math.min(16, (369 * 9 / 16 * .82 - 12) / Math.max(18, ...option.hook.split(/\\s+/).map(word => word.length)));\n timeline.textOverlays = originalCopy.filter(row => row.id !== 'opening').map(row => row.id === 'disclosure' ? {...clone(row),start:0,end:duration} : shift(row));\n timeline.textOverlays.push(openingText('preview-label', 'Preview · actual footage', 8, 7), openingText('approved-hook-' + option.id, option.hook, 18, hookSize));\n timeline.tracks = [...(timeline.tracks || []), {id:'variant-hook',type:'text',label:'Approved opening hook'}];\n timeline.trackOrder = [...(timeline.trackOrder || []), 'variant-hook'];\n timeline.audio = clone(timeline.audioItems);\n timeline.overlays = clone([...timeline.captions, ...timeline.textOverlays]);\n timeline.productAdVariant = {schemaVersion:1,block:{id:'stillmade.product-ad-variants',version:'1.0.0'},variant:option.id,opening:{from:option.from,to:option.to,silent:true},bodyOffset:length,source:{assetId:source.assetId,versionId:source.versionId},hook:option.hook};\n outputs['variant' + option.id] = timeline;\n}\noutputs.review = {schemaVersion:1,state:'needs-human-review',humanApproved:false,providerCalls:0,source:{assetId:source.assetId,versionId:source.versionId},bodyDuration:base.targetDuration,outputDuration:duration,variants:options.map(option => ({id:option.id,hook:option.hook,openingFrom:option.from,openingTo:option.to})),warnings:['The three previews use different supplied source moments, followed by the same complete demonstration. They are not generated product scenes.','Preview sound is muted to avoid presenting partial speech as a quote. Original body speech and captions retain their timing and exact words.','Watch and listen to all three exports at phone size. Verify each hook against the actual footage and approved offer.','No conversion performance, customer endorsement or independent rights verification is claimed.']};\nreturn outputs;\n",
254
- "tests": [
255
- {
256
- "name": "Make three exact source previews and preserve the complete demonstration",
257
- "input": {
258
- "timeline": {
259
- "schemaVersion": 1,
260
- "activeTimelineId": "short-form",
261
- "name": "Approved demonstration",
262
- "aspect": "9:16",
263
- "aspectRatio": "9:16",
264
- "previewH": 369,
265
- "backgroundColor": "#0A0A0A",
266
- "tracks": [
267
- {
268
- "id": "video",
269
- "type": "video",
270
- "label": "Source selections"
271
- },
272
- {
273
- "id": "speech",
274
- "type": "audio",
275
- "label": "Original speech"
276
- },
277
- {
278
- "id": "music",
279
- "type": "audio",
280
- "label": "Music"
281
- },
282
- {
283
- "id": "captions",
284
- "type": "caption",
285
- "label": "Reviewed subtitles"
286
- },
287
- {
288
- "id": "copy",
289
- "type": "text",
290
- "label": "Approved copy"
291
- }
292
- ],
293
- "trackOrder": [
294
- "video",
295
- "speech",
296
- "music",
297
- "captions",
298
- "copy"
299
- ],
300
- "clips": [
301
- {
302
- "id": "selection-1",
303
- "kind": "video",
304
- "trackId": "video",
305
- "asset": {
306
- "kind": "video",
307
- "assetId": "approved-video",
308
- "versionId": "v1",
309
- "url": "https://media.example/approved.mp4",
310
- "width": 1080,
311
- "height": 1920,
312
- "duration": 12
313
- },
314
- "assetId": "approved-video",
315
- "versionId": "v1",
316
- "url": "https://media.example/approved.mp4",
317
- "title": "Original video",
318
- "start": 0,
319
- "duration": 12,
320
- "trimStart": 0,
321
- "speed": 1,
322
- "volume": 0,
323
- "transform": {
324
- "fit": "contain",
325
- "scale": 1,
326
- "x": 0,
327
- "y": 0,
328
- "rotation": 0,
329
- "opacity": 1
330
- },
331
- "motion": {
332
- "type": "none"
333
- },
334
- "transition": {
335
- "type": "Cut",
336
- "duration": 0
337
- }
338
- }
339
- ],
340
- "audioItems": [
341
- {
342
- "id": "selection-1-sound",
343
- "trackId": "speech",
344
- "asset": {
345
- "kind": "video",
346
- "assetId": "approved-video",
347
- "versionId": "v1",
348
- "url": "https://media.example/approved.mp4",
349
- "width": 1080,
350
- "height": 1920,
351
- "duration": 12
352
- },
353
- "assetId": "approved-video",
354
- "versionId": "v1",
355
- "url": "https://media.example/approved.mp4",
356
- "title": "Original speech",
357
- "start": 0,
358
- "duration": 12,
359
- "sourceOffset": 0,
360
- "trimStart": 0,
361
- "volume": 100,
362
- "rate": 1,
363
- "fadeIn": 0,
364
- "fadeOut": 0
365
- }
366
- ],
367
- "captions": [],
368
- "textOverlays": [
369
- {
370
- "id": "opening",
371
- "trackId": "copy",
372
- "type": "text",
373
- "text": "Approved demonstration",
374
- "start": 0,
375
- "end": 3,
376
- "font": "Hanken Grotesk",
377
- "size": 16,
378
- "color": "#F7F0DB",
379
- "background": "#0A0A0A",
380
- "backgroundOpacity": 80,
381
- "backgroundPadding": 5,
382
- "width": 0.82,
383
- "x": 50,
384
- "y": 16,
385
- "position": "center",
386
- "animation": "fade",
387
- "animIn": 0.2,
388
- "animOut": 0.15
389
- },
390
- {
391
- "id": "cta",
392
- "trackId": "copy",
393
- "type": "text",
394
- "text": "See the details",
395
- "start": 9,
396
- "end": 12,
397
- "font": "Hanken Grotesk",
398
- "size": 14,
399
- "color": "#F7F0DB",
400
- "background": "#0A0A0A",
401
- "backgroundOpacity": 80,
402
- "backgroundPadding": 5,
403
- "width": 0.82,
404
- "x": 50,
405
- "y": 17,
406
- "position": "center",
407
- "animation": "fade",
408
- "animIn": 0.2,
409
- "animOut": 0.15
410
- }
411
- ],
412
- "stickers": [],
413
- "effects": [],
414
- "audio": [
415
- {
416
- "id": "selection-1-sound",
417
- "trackId": "speech",
418
- "asset": {
419
- "kind": "video",
420
- "assetId": "approved-video",
421
- "versionId": "v1",
422
- "url": "https://media.example/approved.mp4",
423
- "width": 1080,
424
- "height": 1920,
425
- "duration": 12
426
- },
427
- "assetId": "approved-video",
428
- "versionId": "v1",
429
- "url": "https://media.example/approved.mp4",
430
- "title": "Original speech",
431
- "start": 0,
432
- "duration": 12,
433
- "sourceOffset": 0,
434
- "trimStart": 0,
435
- "volume": 100,
436
- "rate": 1,
437
- "fadeIn": 0,
438
- "fadeOut": 0
439
- }
440
- ],
441
- "overlays": [
442
- {
443
- "id": "opening",
444
- "trackId": "copy",
445
- "type": "text",
446
- "text": "Approved demonstration",
447
- "start": 0,
448
- "end": 3,
449
- "font": "Hanken Grotesk",
450
- "size": 16,
451
- "color": "#F7F0DB",
452
- "background": "#0A0A0A",
453
- "backgroundOpacity": 80,
454
- "backgroundPadding": 5,
455
- "width": 0.82,
456
- "x": 50,
457
- "y": 16,
458
- "position": "center",
459
- "animation": "fade",
460
- "animIn": 0.2,
461
- "animOut": 0.15
462
- },
463
- {
464
- "id": "cta",
465
- "trackId": "copy",
466
- "type": "text",
467
- "text": "See the details",
468
- "start": 9,
469
- "end": 12,
470
- "font": "Hanken Grotesk",
471
- "size": 14,
472
- "color": "#F7F0DB",
473
- "background": "#0A0A0A",
474
- "backgroundOpacity": 80,
475
- "backgroundPadding": 5,
476
- "width": 0.82,
477
- "x": 50,
478
- "y": 17,
479
- "position": "center",
480
- "animation": "fade",
481
- "animIn": 0.2,
482
- "animOut": 0.15
483
- }
484
- ],
485
- "targetDuration": 12,
486
- "exportSettings": {
487
- "aspect": "9:16",
488
- "fps": 30,
489
- "resolution": "1080p",
490
- "quality": "high"
491
- }
492
- },
493
- "hookA": "Watch the preparation",
494
- "hookB": "Look at the process",
495
- "hookC": "See the finished pour",
496
- "openingA": 0,
497
- "openingB": 2,
498
- "openingC": 4,
499
- "openingDuration": 2,
500
- "copyApproved": true
501
- },
502
- "expected": {
503
- "variantA": {
504
- "schemaVersion": 1,
505
- "activeTimelineId": "short-form",
506
- "name": "Variant A · Watch the preparation",
507
- "aspect": "9:16",
508
- "aspectRatio": "9:16",
509
- "previewH": 369,
510
- "backgroundColor": "#0A0A0A",
511
- "tracks": [
512
- {
513
- "id": "video",
514
- "type": "video",
515
- "label": "Source selections"
516
- },
517
- {
518
- "id": "speech",
519
- "type": "audio",
520
- "label": "Original speech"
521
- },
522
- {
523
- "id": "music",
524
- "type": "audio",
525
- "label": "Music"
526
- },
527
- {
528
- "id": "captions",
529
- "type": "caption",
530
- "label": "Reviewed subtitles"
531
- },
532
- {
533
- "id": "copy",
534
- "type": "text",
535
- "label": "Approved copy"
536
- },
537
- {
538
- "id": "variant-hook",
539
- "type": "text",
540
- "label": "Approved opening hook"
541
- }
542
- ],
543
- "trackOrder": [
544
- "video",
545
- "speech",
546
- "music",
547
- "captions",
548
- "copy",
549
- "variant-hook"
550
- ],
551
- "clips": [
552
- {
553
- "id": "opening-preview-A",
554
- "kind": "video",
555
- "trackId": "video",
556
- "asset": {
557
- "kind": "video",
558
- "assetId": "approved-video",
559
- "versionId": "v1",
560
- "url": "https://media.example/approved.mp4",
561
- "width": 1080,
562
- "height": 1920,
563
- "duration": 12
564
- },
565
- "assetId": "approved-video",
566
- "versionId": "v1",
567
- "url": "https://media.example/approved.mp4",
568
- "title": "Source preview A",
569
- "start": 0,
570
- "duration": 2,
571
- "trimStart": 0,
572
- "speed": 1,
573
- "volume": 0,
574
- "transform": {
575
- "fit": "contain",
576
- "scale": 1,
577
- "x": 0,
578
- "y": 0,
579
- "rotation": 0,
580
- "opacity": 1
581
- },
582
- "motion": {
583
- "type": "none"
584
- },
585
- "transition": {
586
- "type": "Cut",
587
- "duration": 0
588
- }
589
- },
590
- {
591
- "id": "selection-1",
592
- "kind": "video",
593
- "trackId": "video",
594
- "asset": {
595
- "kind": "video",
596
- "assetId": "approved-video",
597
- "versionId": "v1",
598
- "url": "https://media.example/approved.mp4",
599
- "width": 1080,
600
- "height": 1920,
601
- "duration": 12
602
- },
603
- "assetId": "approved-video",
604
- "versionId": "v1",
605
- "url": "https://media.example/approved.mp4",
606
- "title": "Original video",
607
- "start": 2,
608
- "duration": 12,
609
- "trimStart": 0,
610
- "speed": 1,
611
- "volume": 0,
612
- "transform": {
613
- "fit": "contain",
614
- "scale": 1,
615
- "x": 0,
616
- "y": 0,
617
- "rotation": 0,
618
- "opacity": 1
619
- },
620
- "motion": {
621
- "type": "none"
622
- },
623
- "transition": {
624
- "type": "Cut",
625
- "duration": 0
626
- }
627
- }
628
- ],
629
- "audioItems": [
630
- {
631
- "id": "selection-1-sound",
632
- "trackId": "speech",
633
- "asset": {
634
- "kind": "video",
635
- "assetId": "approved-video",
636
- "versionId": "v1",
637
- "url": "https://media.example/approved.mp4",
638
- "width": 1080,
639
- "height": 1920,
640
- "duration": 12
641
- },
642
- "assetId": "approved-video",
643
- "versionId": "v1",
644
- "url": "https://media.example/approved.mp4",
645
- "title": "Original speech",
646
- "start": 2,
647
- "duration": 12,
648
- "sourceOffset": 0,
649
- "trimStart": 0,
650
- "volume": 100,
651
- "rate": 1,
652
- "fadeIn": 0,
653
- "fadeOut": 0
654
- }
655
- ],
656
- "captions": [],
657
- "textOverlays": [
658
- {
659
- "id": "cta",
660
- "trackId": "copy",
661
- "type": "text",
662
- "text": "See the details",
663
- "start": 11,
664
- "end": 14,
665
- "font": "Hanken Grotesk",
666
- "size": 14,
667
- "color": "#F7F0DB",
668
- "background": "#0A0A0A",
669
- "backgroundOpacity": 80,
670
- "backgroundPadding": 5,
671
- "width": 0.82,
672
- "x": 50,
673
- "y": 17,
674
- "position": "center",
675
- "animation": "fade",
676
- "animIn": 0.2,
677
- "animOut": 0.15
678
- },
679
- {
680
- "id": "preview-label",
681
- "trackId": "variant-hook",
682
- "type": "text",
683
- "text": "Preview · actual footage",
684
- "start": 0,
685
- "end": 2,
686
- "font": "Hanken Grotesk",
687
- "size": 7,
688
- "color": "#F7F0DB",
689
- "background": "#0A0A0A",
690
- "backgroundOpacity": 85,
691
- "backgroundPadding": 5,
692
- "width": 0.82,
693
- "x": 50,
694
- "y": 8,
695
- "position": "center",
696
- "animation": "fade",
697
- "animIn": 0.12,
698
- "animOut": 0.1
699
- },
700
- {
701
- "id": "approved-hook-A",
702
- "trackId": "variant-hook",
703
- "type": "text",
704
- "text": "Watch the preparation",
705
- "start": 0,
706
- "end": 2,
707
- "font": "Hanken Grotesk",
708
- "size": 8.788958333333333,
709
- "color": "#F7F0DB",
710
- "background": "#0A0A0A",
711
- "backgroundOpacity": 85,
712
- "backgroundPadding": 5,
713
- "width": 0.82,
714
- "x": 50,
715
- "y": 18,
716
- "position": "center",
717
- "animation": "fade",
718
- "animIn": 0.12,
719
- "animOut": 0.1
720
- }
721
- ],
722
- "stickers": [],
723
- "effects": [],
724
- "audio": [
725
- {
726
- "id": "selection-1-sound",
727
- "trackId": "speech",
728
- "asset": {
729
- "kind": "video",
730
- "assetId": "approved-video",
731
- "versionId": "v1",
732
- "url": "https://media.example/approved.mp4",
733
- "width": 1080,
734
- "height": 1920,
735
- "duration": 12
736
- },
737
- "assetId": "approved-video",
738
- "versionId": "v1",
739
- "url": "https://media.example/approved.mp4",
740
- "title": "Original speech",
741
- "start": 2,
742
- "duration": 12,
743
- "sourceOffset": 0,
744
- "trimStart": 0,
745
- "volume": 100,
746
- "rate": 1,
747
- "fadeIn": 0,
748
- "fadeOut": 0
749
- }
750
- ],
751
- "overlays": [
752
- {
753
- "id": "cta",
754
- "trackId": "copy",
755
- "type": "text",
756
- "text": "See the details",
757
- "start": 11,
758
- "end": 14,
759
- "font": "Hanken Grotesk",
760
- "size": 14,
761
- "color": "#F7F0DB",
762
- "background": "#0A0A0A",
763
- "backgroundOpacity": 80,
764
- "backgroundPadding": 5,
765
- "width": 0.82,
766
- "x": 50,
767
- "y": 17,
768
- "position": "center",
769
- "animation": "fade",
770
- "animIn": 0.2,
771
- "animOut": 0.15
772
- },
773
- {
774
- "id": "preview-label",
775
- "trackId": "variant-hook",
776
- "type": "text",
777
- "text": "Preview · actual footage",
778
- "start": 0,
779
- "end": 2,
780
- "font": "Hanken Grotesk",
781
- "size": 7,
782
- "color": "#F7F0DB",
783
- "background": "#0A0A0A",
784
- "backgroundOpacity": 85,
785
- "backgroundPadding": 5,
786
- "width": 0.82,
787
- "x": 50,
788
- "y": 8,
789
- "position": "center",
790
- "animation": "fade",
791
- "animIn": 0.12,
792
- "animOut": 0.1
793
- },
794
- {
795
- "id": "approved-hook-A",
796
- "trackId": "variant-hook",
797
- "type": "text",
798
- "text": "Watch the preparation",
799
- "start": 0,
800
- "end": 2,
801
- "font": "Hanken Grotesk",
802
- "size": 8.788958333333333,
803
- "color": "#F7F0DB",
804
- "background": "#0A0A0A",
805
- "backgroundOpacity": 85,
806
- "backgroundPadding": 5,
807
- "width": 0.82,
808
- "x": 50,
809
- "y": 18,
810
- "position": "center",
811
- "animation": "fade",
812
- "animIn": 0.12,
813
- "animOut": 0.1
814
- }
815
- ],
816
- "targetDuration": 14,
817
- "exportSettings": {
818
- "aspect": "9:16",
819
- "fps": 30,
820
- "resolution": "1080p",
821
- "quality": "high"
822
- },
823
- "productAdVariant": {
824
- "schemaVersion": 1,
825
- "block": {
826
- "id": "stillmade.product-ad-variants",
827
- "version": "1.0.0"
828
- },
829
- "variant": "A",
830
- "opening": {
831
- "from": 0,
832
- "to": 2,
833
- "silent": true
834
- },
835
- "bodyOffset": 2,
836
- "source": {
837
- "assetId": "approved-video",
838
- "versionId": "v1"
839
- },
840
- "hook": "Watch the preparation"
841
- }
842
- },
843
- "variantB": {
844
- "schemaVersion": 1,
845
- "activeTimelineId": "short-form",
846
- "name": "Variant B · Look at the process",
847
- "aspect": "9:16",
848
- "aspectRatio": "9:16",
849
- "previewH": 369,
850
- "backgroundColor": "#0A0A0A",
851
- "tracks": [
852
- {
853
- "id": "video",
854
- "type": "video",
855
- "label": "Source selections"
856
- },
857
- {
858
- "id": "speech",
859
- "type": "audio",
860
- "label": "Original speech"
861
- },
862
- {
863
- "id": "music",
864
- "type": "audio",
865
- "label": "Music"
866
- },
867
- {
868
- "id": "captions",
869
- "type": "caption",
870
- "label": "Reviewed subtitles"
871
- },
872
- {
873
- "id": "copy",
874
- "type": "text",
875
- "label": "Approved copy"
876
- },
877
- {
878
- "id": "variant-hook",
879
- "type": "text",
880
- "label": "Approved opening hook"
881
- }
882
- ],
883
- "trackOrder": [
884
- "video",
885
- "speech",
886
- "music",
887
- "captions",
888
- "copy",
889
- "variant-hook"
890
- ],
891
- "clips": [
892
- {
893
- "id": "opening-preview-B",
894
- "kind": "video",
895
- "trackId": "video",
896
- "asset": {
897
- "kind": "video",
898
- "assetId": "approved-video",
899
- "versionId": "v1",
900
- "url": "https://media.example/approved.mp4",
901
- "width": 1080,
902
- "height": 1920,
903
- "duration": 12
904
- },
905
- "assetId": "approved-video",
906
- "versionId": "v1",
907
- "url": "https://media.example/approved.mp4",
908
- "title": "Source preview B",
909
- "start": 0,
910
- "duration": 2,
911
- "trimStart": 2,
912
- "speed": 1,
913
- "volume": 0,
914
- "transform": {
915
- "fit": "contain",
916
- "scale": 1,
917
- "x": 0,
918
- "y": 0,
919
- "rotation": 0,
920
- "opacity": 1
921
- },
922
- "motion": {
923
- "type": "none"
924
- },
925
- "transition": {
926
- "type": "Cut",
927
- "duration": 0
928
- }
929
- },
930
- {
931
- "id": "selection-1",
932
- "kind": "video",
933
- "trackId": "video",
934
- "asset": {
935
- "kind": "video",
936
- "assetId": "approved-video",
937
- "versionId": "v1",
938
- "url": "https://media.example/approved.mp4",
939
- "width": 1080,
940
- "height": 1920,
941
- "duration": 12
942
- },
943
- "assetId": "approved-video",
944
- "versionId": "v1",
945
- "url": "https://media.example/approved.mp4",
946
- "title": "Original video",
947
- "start": 2,
948
- "duration": 12,
949
- "trimStart": 0,
950
- "speed": 1,
951
- "volume": 0,
952
- "transform": {
953
- "fit": "contain",
954
- "scale": 1,
955
- "x": 0,
956
- "y": 0,
957
- "rotation": 0,
958
- "opacity": 1
959
- },
960
- "motion": {
961
- "type": "none"
962
- },
963
- "transition": {
964
- "type": "Cut",
965
- "duration": 0
966
- }
967
- }
968
- ],
969
- "audioItems": [
970
- {
971
- "id": "selection-1-sound",
972
- "trackId": "speech",
973
- "asset": {
974
- "kind": "video",
975
- "assetId": "approved-video",
976
- "versionId": "v1",
977
- "url": "https://media.example/approved.mp4",
978
- "width": 1080,
979
- "height": 1920,
980
- "duration": 12
981
- },
982
- "assetId": "approved-video",
983
- "versionId": "v1",
984
- "url": "https://media.example/approved.mp4",
985
- "title": "Original speech",
986
- "start": 2,
987
- "duration": 12,
988
- "sourceOffset": 0,
989
- "trimStart": 0,
990
- "volume": 100,
991
- "rate": 1,
992
- "fadeIn": 0,
993
- "fadeOut": 0
994
- }
995
- ],
996
- "captions": [],
997
- "textOverlays": [
998
- {
999
- "id": "cta",
1000
- "trackId": "copy",
1001
- "type": "text",
1002
- "text": "See the details",
1003
- "start": 11,
1004
- "end": 14,
1005
- "font": "Hanken Grotesk",
1006
- "size": 14,
1007
- "color": "#F7F0DB",
1008
- "background": "#0A0A0A",
1009
- "backgroundOpacity": 80,
1010
- "backgroundPadding": 5,
1011
- "width": 0.82,
1012
- "x": 50,
1013
- "y": 17,
1014
- "position": "center",
1015
- "animation": "fade",
1016
- "animIn": 0.2,
1017
- "animOut": 0.15
1018
- },
1019
- {
1020
- "id": "preview-label",
1021
- "trackId": "variant-hook",
1022
- "type": "text",
1023
- "text": "Preview · actual footage",
1024
- "start": 0,
1025
- "end": 2,
1026
- "font": "Hanken Grotesk",
1027
- "size": 7,
1028
- "color": "#F7F0DB",
1029
- "background": "#0A0A0A",
1030
- "backgroundOpacity": 85,
1031
- "backgroundPadding": 5,
1032
- "width": 0.82,
1033
- "x": 50,
1034
- "y": 8,
1035
- "position": "center",
1036
- "animation": "fade",
1037
- "animIn": 0.12,
1038
- "animOut": 0.1
1039
- },
1040
- {
1041
- "id": "approved-hook-B",
1042
- "trackId": "variant-hook",
1043
- "type": "text",
1044
- "text": "Look at the process",
1045
- "start": 0,
1046
- "end": 2,
1047
- "font": "Hanken Grotesk",
1048
- "size": 8.788958333333333,
1049
- "color": "#F7F0DB",
1050
- "background": "#0A0A0A",
1051
- "backgroundOpacity": 85,
1052
- "backgroundPadding": 5,
1053
- "width": 0.82,
1054
- "x": 50,
1055
- "y": 18,
1056
- "position": "center",
1057
- "animation": "fade",
1058
- "animIn": 0.12,
1059
- "animOut": 0.1
1060
- }
1061
- ],
1062
- "stickers": [],
1063
- "effects": [],
1064
- "audio": [
1065
- {
1066
- "id": "selection-1-sound",
1067
- "trackId": "speech",
1068
- "asset": {
1069
- "kind": "video",
1070
- "assetId": "approved-video",
1071
- "versionId": "v1",
1072
- "url": "https://media.example/approved.mp4",
1073
- "width": 1080,
1074
- "height": 1920,
1075
- "duration": 12
1076
- },
1077
- "assetId": "approved-video",
1078
- "versionId": "v1",
1079
- "url": "https://media.example/approved.mp4",
1080
- "title": "Original speech",
1081
- "start": 2,
1082
- "duration": 12,
1083
- "sourceOffset": 0,
1084
- "trimStart": 0,
1085
- "volume": 100,
1086
- "rate": 1,
1087
- "fadeIn": 0,
1088
- "fadeOut": 0
1089
- }
1090
- ],
1091
- "overlays": [
1092
- {
1093
- "id": "cta",
1094
- "trackId": "copy",
1095
- "type": "text",
1096
- "text": "See the details",
1097
- "start": 11,
1098
- "end": 14,
1099
- "font": "Hanken Grotesk",
1100
- "size": 14,
1101
- "color": "#F7F0DB",
1102
- "background": "#0A0A0A",
1103
- "backgroundOpacity": 80,
1104
- "backgroundPadding": 5,
1105
- "width": 0.82,
1106
- "x": 50,
1107
- "y": 17,
1108
- "position": "center",
1109
- "animation": "fade",
1110
- "animIn": 0.2,
1111
- "animOut": 0.15
1112
- },
1113
- {
1114
- "id": "preview-label",
1115
- "trackId": "variant-hook",
1116
- "type": "text",
1117
- "text": "Preview · actual footage",
1118
- "start": 0,
1119
- "end": 2,
1120
- "font": "Hanken Grotesk",
1121
- "size": 7,
1122
- "color": "#F7F0DB",
1123
- "background": "#0A0A0A",
1124
- "backgroundOpacity": 85,
1125
- "backgroundPadding": 5,
1126
- "width": 0.82,
1127
- "x": 50,
1128
- "y": 8,
1129
- "position": "center",
1130
- "animation": "fade",
1131
- "animIn": 0.12,
1132
- "animOut": 0.1
1133
- },
1134
- {
1135
- "id": "approved-hook-B",
1136
- "trackId": "variant-hook",
1137
- "type": "text",
1138
- "text": "Look at the process",
1139
- "start": 0,
1140
- "end": 2,
1141
- "font": "Hanken Grotesk",
1142
- "size": 8.788958333333333,
1143
- "color": "#F7F0DB",
1144
- "background": "#0A0A0A",
1145
- "backgroundOpacity": 85,
1146
- "backgroundPadding": 5,
1147
- "width": 0.82,
1148
- "x": 50,
1149
- "y": 18,
1150
- "position": "center",
1151
- "animation": "fade",
1152
- "animIn": 0.12,
1153
- "animOut": 0.1
1154
- }
1155
- ],
1156
- "targetDuration": 14,
1157
- "exportSettings": {
1158
- "aspect": "9:16",
1159
- "fps": 30,
1160
- "resolution": "1080p",
1161
- "quality": "high"
1162
- },
1163
- "productAdVariant": {
1164
- "schemaVersion": 1,
1165
- "block": {
1166
- "id": "stillmade.product-ad-variants",
1167
- "version": "1.0.0"
1168
- },
1169
- "variant": "B",
1170
- "opening": {
1171
- "from": 2,
1172
- "to": 4,
1173
- "silent": true
1174
- },
1175
- "bodyOffset": 2,
1176
- "source": {
1177
- "assetId": "approved-video",
1178
- "versionId": "v1"
1179
- },
1180
- "hook": "Look at the process"
1181
- }
1182
- },
1183
- "variantC": {
1184
- "schemaVersion": 1,
1185
- "activeTimelineId": "short-form",
1186
- "name": "Variant C · See the finished pour",
1187
- "aspect": "9:16",
1188
- "aspectRatio": "9:16",
1189
- "previewH": 369,
1190
- "backgroundColor": "#0A0A0A",
1191
- "tracks": [
1192
- {
1193
- "id": "video",
1194
- "type": "video",
1195
- "label": "Source selections"
1196
- },
1197
- {
1198
- "id": "speech",
1199
- "type": "audio",
1200
- "label": "Original speech"
1201
- },
1202
- {
1203
- "id": "music",
1204
- "type": "audio",
1205
- "label": "Music"
1206
- },
1207
- {
1208
- "id": "captions",
1209
- "type": "caption",
1210
- "label": "Reviewed subtitles"
1211
- },
1212
- {
1213
- "id": "copy",
1214
- "type": "text",
1215
- "label": "Approved copy"
1216
- },
1217
- {
1218
- "id": "variant-hook",
1219
- "type": "text",
1220
- "label": "Approved opening hook"
1221
- }
1222
- ],
1223
- "trackOrder": [
1224
- "video",
1225
- "speech",
1226
- "music",
1227
- "captions",
1228
- "copy",
1229
- "variant-hook"
1230
- ],
1231
- "clips": [
1232
- {
1233
- "id": "opening-preview-C",
1234
- "kind": "video",
1235
- "trackId": "video",
1236
- "asset": {
1237
- "kind": "video",
1238
- "assetId": "approved-video",
1239
- "versionId": "v1",
1240
- "url": "https://media.example/approved.mp4",
1241
- "width": 1080,
1242
- "height": 1920,
1243
- "duration": 12
1244
- },
1245
- "assetId": "approved-video",
1246
- "versionId": "v1",
1247
- "url": "https://media.example/approved.mp4",
1248
- "title": "Source preview C",
1249
- "start": 0,
1250
- "duration": 2,
1251
- "trimStart": 4,
1252
- "speed": 1,
1253
- "volume": 0,
1254
- "transform": {
1255
- "fit": "contain",
1256
- "scale": 1,
1257
- "x": 0,
1258
- "y": 0,
1259
- "rotation": 0,
1260
- "opacity": 1
1261
- },
1262
- "motion": {
1263
- "type": "none"
1264
- },
1265
- "transition": {
1266
- "type": "Cut",
1267
- "duration": 0
1268
- }
1269
- },
1270
- {
1271
- "id": "selection-1",
1272
- "kind": "video",
1273
- "trackId": "video",
1274
- "asset": {
1275
- "kind": "video",
1276
- "assetId": "approved-video",
1277
- "versionId": "v1",
1278
- "url": "https://media.example/approved.mp4",
1279
- "width": 1080,
1280
- "height": 1920,
1281
- "duration": 12
1282
- },
1283
- "assetId": "approved-video",
1284
- "versionId": "v1",
1285
- "url": "https://media.example/approved.mp4",
1286
- "title": "Original video",
1287
- "start": 2,
1288
- "duration": 12,
1289
- "trimStart": 0,
1290
- "speed": 1,
1291
- "volume": 0,
1292
- "transform": {
1293
- "fit": "contain",
1294
- "scale": 1,
1295
- "x": 0,
1296
- "y": 0,
1297
- "rotation": 0,
1298
- "opacity": 1
1299
- },
1300
- "motion": {
1301
- "type": "none"
1302
- },
1303
- "transition": {
1304
- "type": "Cut",
1305
- "duration": 0
1306
- }
1307
- }
1308
- ],
1309
- "audioItems": [
1310
- {
1311
- "id": "selection-1-sound",
1312
- "trackId": "speech",
1313
- "asset": {
1314
- "kind": "video",
1315
- "assetId": "approved-video",
1316
- "versionId": "v1",
1317
- "url": "https://media.example/approved.mp4",
1318
- "width": 1080,
1319
- "height": 1920,
1320
- "duration": 12
1321
- },
1322
- "assetId": "approved-video",
1323
- "versionId": "v1",
1324
- "url": "https://media.example/approved.mp4",
1325
- "title": "Original speech",
1326
- "start": 2,
1327
- "duration": 12,
1328
- "sourceOffset": 0,
1329
- "trimStart": 0,
1330
- "volume": 100,
1331
- "rate": 1,
1332
- "fadeIn": 0,
1333
- "fadeOut": 0
1334
- }
1335
- ],
1336
- "captions": [],
1337
- "textOverlays": [
1338
- {
1339
- "id": "cta",
1340
- "trackId": "copy",
1341
- "type": "text",
1342
- "text": "See the details",
1343
- "start": 11,
1344
- "end": 14,
1345
- "font": "Hanken Grotesk",
1346
- "size": 14,
1347
- "color": "#F7F0DB",
1348
- "background": "#0A0A0A",
1349
- "backgroundOpacity": 80,
1350
- "backgroundPadding": 5,
1351
- "width": 0.82,
1352
- "x": 50,
1353
- "y": 17,
1354
- "position": "center",
1355
- "animation": "fade",
1356
- "animIn": 0.2,
1357
- "animOut": 0.15
1358
- },
1359
- {
1360
- "id": "preview-label",
1361
- "trackId": "variant-hook",
1362
- "type": "text",
1363
- "text": "Preview · actual footage",
1364
- "start": 0,
1365
- "end": 2,
1366
- "font": "Hanken Grotesk",
1367
- "size": 7,
1368
- "color": "#F7F0DB",
1369
- "background": "#0A0A0A",
1370
- "backgroundOpacity": 85,
1371
- "backgroundPadding": 5,
1372
- "width": 0.82,
1373
- "x": 50,
1374
- "y": 8,
1375
- "position": "center",
1376
- "animation": "fade",
1377
- "animIn": 0.12,
1378
- "animOut": 0.1
1379
- },
1380
- {
1381
- "id": "approved-hook-C",
1382
- "trackId": "variant-hook",
1383
- "type": "text",
1384
- "text": "See the finished pour",
1385
- "start": 0,
1386
- "end": 2,
1387
- "font": "Hanken Grotesk",
1388
- "size": 8.788958333333333,
1389
- "color": "#F7F0DB",
1390
- "background": "#0A0A0A",
1391
- "backgroundOpacity": 85,
1392
- "backgroundPadding": 5,
1393
- "width": 0.82,
1394
- "x": 50,
1395
- "y": 18,
1396
- "position": "center",
1397
- "animation": "fade",
1398
- "animIn": 0.12,
1399
- "animOut": 0.1
1400
- }
1401
- ],
1402
- "stickers": [],
1403
- "effects": [],
1404
- "audio": [
1405
- {
1406
- "id": "selection-1-sound",
1407
- "trackId": "speech",
1408
- "asset": {
1409
- "kind": "video",
1410
- "assetId": "approved-video",
1411
- "versionId": "v1",
1412
- "url": "https://media.example/approved.mp4",
1413
- "width": 1080,
1414
- "height": 1920,
1415
- "duration": 12
1416
- },
1417
- "assetId": "approved-video",
1418
- "versionId": "v1",
1419
- "url": "https://media.example/approved.mp4",
1420
- "title": "Original speech",
1421
- "start": 2,
1422
- "duration": 12,
1423
- "sourceOffset": 0,
1424
- "trimStart": 0,
1425
- "volume": 100,
1426
- "rate": 1,
1427
- "fadeIn": 0,
1428
- "fadeOut": 0
1429
- }
1430
- ],
1431
- "overlays": [
1432
- {
1433
- "id": "cta",
1434
- "trackId": "copy",
1435
- "type": "text",
1436
- "text": "See the details",
1437
- "start": 11,
1438
- "end": 14,
1439
- "font": "Hanken Grotesk",
1440
- "size": 14,
1441
- "color": "#F7F0DB",
1442
- "background": "#0A0A0A",
1443
- "backgroundOpacity": 80,
1444
- "backgroundPadding": 5,
1445
- "width": 0.82,
1446
- "x": 50,
1447
- "y": 17,
1448
- "position": "center",
1449
- "animation": "fade",
1450
- "animIn": 0.2,
1451
- "animOut": 0.15
1452
- },
1453
- {
1454
- "id": "preview-label",
1455
- "trackId": "variant-hook",
1456
- "type": "text",
1457
- "text": "Preview · actual footage",
1458
- "start": 0,
1459
- "end": 2,
1460
- "font": "Hanken Grotesk",
1461
- "size": 7,
1462
- "color": "#F7F0DB",
1463
- "background": "#0A0A0A",
1464
- "backgroundOpacity": 85,
1465
- "backgroundPadding": 5,
1466
- "width": 0.82,
1467
- "x": 50,
1468
- "y": 8,
1469
- "position": "center",
1470
- "animation": "fade",
1471
- "animIn": 0.12,
1472
- "animOut": 0.1
1473
- },
1474
- {
1475
- "id": "approved-hook-C",
1476
- "trackId": "variant-hook",
1477
- "type": "text",
1478
- "text": "See the finished pour",
1479
- "start": 0,
1480
- "end": 2,
1481
- "font": "Hanken Grotesk",
1482
- "size": 8.788958333333333,
1483
- "color": "#F7F0DB",
1484
- "background": "#0A0A0A",
1485
- "backgroundOpacity": 85,
1486
- "backgroundPadding": 5,
1487
- "width": 0.82,
1488
- "x": 50,
1489
- "y": 18,
1490
- "position": "center",
1491
- "animation": "fade",
1492
- "animIn": 0.12,
1493
- "animOut": 0.1
1494
- }
1495
- ],
1496
- "targetDuration": 14,
1497
- "exportSettings": {
1498
- "aspect": "9:16",
1499
- "fps": 30,
1500
- "resolution": "1080p",
1501
- "quality": "high"
1502
- },
1503
- "productAdVariant": {
1504
- "schemaVersion": 1,
1505
- "block": {
1506
- "id": "stillmade.product-ad-variants",
1507
- "version": "1.0.0"
1508
- },
1509
- "variant": "C",
1510
- "opening": {
1511
- "from": 4,
1512
- "to": 6,
1513
- "silent": true
1514
- },
1515
- "bodyOffset": 2,
1516
- "source": {
1517
- "assetId": "approved-video",
1518
- "versionId": "v1"
1519
- },
1520
- "hook": "See the finished pour"
1521
- }
1522
- },
1523
- "review": {
1524
- "schemaVersion": 1,
1525
- "state": "needs-human-review",
1526
- "humanApproved": false,
1527
- "providerCalls": 0,
1528
- "source": {
1529
- "assetId": "approved-video",
1530
- "versionId": "v1"
1531
- },
1532
- "bodyDuration": 12,
1533
- "outputDuration": 14,
1534
- "variants": [
1535
- {
1536
- "id": "A",
1537
- "hook": "Watch the preparation",
1538
- "openingFrom": 0,
1539
- "openingTo": 2
1540
- },
1541
- {
1542
- "id": "B",
1543
- "hook": "Look at the process",
1544
- "openingFrom": 2,
1545
- "openingTo": 4
1546
- },
1547
- {
1548
- "id": "C",
1549
- "hook": "See the finished pour",
1550
- "openingFrom": 4,
1551
- "openingTo": 6
1552
- }
1553
- ],
1554
- "warnings": [
1555
- "The three previews use different supplied source moments, followed by the same complete demonstration. They are not generated product scenes.",
1556
- "Preview sound is muted to avoid presenting partial speech as a quote. Original body speech and captions retain their timing and exact words.",
1557
- "Watch and listen to all three exports at phone size. Verify each hook against the actual footage and approved offer.",
1558
- "No conversion performance, customer endorsement or independent rights verification is claimed."
1559
- ]
1560
- }
1561
- }
1562
- },
1563
- {
1564
- "name": "Keep trimmed original speech and captions together after short previews",
1565
- "input": {
1566
- "timeline": {
1567
- "schemaVersion": 1,
1568
- "activeTimelineId": "short-form",
1569
- "name": "An approved hook",
1570
- "aspect": "9:16",
1571
- "aspectRatio": "9:16",
1572
- "previewH": 369,
1573
- "backgroundColor": "#0A0A0A",
1574
- "tracks": [
1575
- {
1576
- "id": "video",
1577
- "type": "video",
1578
- "label": "Source selections"
1579
- },
1580
- {
1581
- "id": "speech",
1582
- "type": "audio",
1583
- "label": "Original speech"
1584
- },
1585
- {
1586
- "id": "music",
1587
- "type": "audio",
1588
- "label": "Music"
1589
- },
1590
- {
1591
- "id": "captions",
1592
- "type": "caption",
1593
- "label": "Reviewed subtitles"
1594
- },
1595
- {
1596
- "id": "copy",
1597
- "type": "text",
1598
- "label": "Approved copy"
1599
- }
1600
- ],
1601
- "trackOrder": [
1602
- "video",
1603
- "speech",
1604
- "music",
1605
- "captions",
1606
- "copy"
1607
- ],
1608
- "clips": [
1609
- {
1610
- "id": "selection-1",
1611
- "kind": "video",
1612
- "trackId": "video",
1613
- "asset": {
1614
- "kind": "video",
1615
- "assetId": "approved-video",
1616
- "versionId": "v1",
1617
- "url": "https://media.example/approved.mp4",
1618
- "width": 1080,
1619
- "height": 1920,
1620
- "duration": 12
1621
- },
1622
- "assetId": "approved-video",
1623
- "versionId": "v1",
1624
- "url": "https://media.example/approved.mp4",
1625
- "title": "Original video",
1626
- "start": 0,
1627
- "duration": 8,
1628
- "trimStart": 4,
1629
- "speed": 1,
1630
- "volume": 0,
1631
- "transform": {
1632
- "fit": "contain",
1633
- "scale": 1,
1634
- "x": 0,
1635
- "y": 0,
1636
- "rotation": 0,
1637
- "opacity": 1
1638
- },
1639
- "motion": {
1640
- "type": "none"
1641
- },
1642
- "transition": {
1643
- "type": "Cut",
1644
- "duration": 0
1645
- }
1646
- }
1647
- ],
1648
- "audioItems": [
1649
- {
1650
- "id": "selection-1-sound",
1651
- "trackId": "speech",
1652
- "asset": {
1653
- "kind": "video",
1654
- "assetId": "approved-video",
1655
- "versionId": "v1",
1656
- "url": "https://media.example/approved.mp4",
1657
- "width": 1080,
1658
- "height": 1920,
1659
- "duration": 12
1660
- },
1661
- "assetId": "approved-video",
1662
- "versionId": "v1",
1663
- "url": "https://media.example/approved.mp4",
1664
- "title": "Original speech",
1665
- "start": 0,
1666
- "duration": 8,
1667
- "sourceOffset": 4,
1668
- "trimStart": 4,
1669
- "volume": 100,
1670
- "rate": 1,
1671
- "fadeIn": 0,
1672
- "fadeOut": 0
1673
- }
1674
- ],
1675
- "captions": [
1676
- {
1677
- "id": "caption-0",
1678
- "trackId": "captions",
1679
- "type": "text",
1680
- "text": "Keep the complete thought in the clip.",
1681
- "start": 0,
1682
- "end": 8,
1683
- "font": "Hanken Grotesk",
1684
- "size": 15,
1685
- "color": "#FFFFFF",
1686
- "background": "#0A0A0A",
1687
- "backgroundOpacity": 75,
1688
- "backgroundPadding": 5,
1689
- "backgroundRadius": 3,
1690
- "width": 0.82,
1691
- "x": 50,
1692
- "y": 76,
1693
- "position": "center",
1694
- "animation": "none",
1695
- "animIn": 0.12,
1696
- "animOut": 0
1697
- }
1698
- ],
1699
- "textOverlays": [
1700
- {
1701
- "id": "opening",
1702
- "trackId": "copy",
1703
- "type": "text",
1704
- "text": "An approved hook",
1705
- "start": 0,
1706
- "end": 3,
1707
- "font": "Hanken Grotesk",
1708
- "size": 16,
1709
- "color": "#F7F0DB",
1710
- "background": "#0A0A0A",
1711
- "backgroundOpacity": 80,
1712
- "backgroundPadding": 5,
1713
- "width": 0.82,
1714
- "x": 50,
1715
- "y": 16,
1716
- "position": "center",
1717
- "animation": "fade",
1718
- "animIn": 0.2,
1719
- "animOut": 0.15
1720
- }
1721
- ],
1722
- "stickers": [],
1723
- "effects": [],
1724
- "audio": [
1725
- {
1726
- "id": "selection-1-sound",
1727
- "trackId": "speech",
1728
- "asset": {
1729
- "kind": "video",
1730
- "assetId": "approved-video",
1731
- "versionId": "v1",
1732
- "url": "https://media.example/approved.mp4",
1733
- "width": 1080,
1734
- "height": 1920,
1735
- "duration": 12
1736
- },
1737
- "assetId": "approved-video",
1738
- "versionId": "v1",
1739
- "url": "https://media.example/approved.mp4",
1740
- "title": "Original speech",
1741
- "start": 0,
1742
- "duration": 8,
1743
- "sourceOffset": 4,
1744
- "trimStart": 4,
1745
- "volume": 100,
1746
- "rate": 1,
1747
- "fadeIn": 0,
1748
- "fadeOut": 0
1749
- }
1750
- ],
1751
- "overlays": [
1752
- {
1753
- "id": "caption-0",
1754
- "trackId": "captions",
1755
- "type": "text",
1756
- "text": "Keep the complete thought in the clip.",
1757
- "start": 0,
1758
- "end": 8,
1759
- "font": "Hanken Grotesk",
1760
- "size": 15,
1761
- "color": "#FFFFFF",
1762
- "background": "#0A0A0A",
1763
- "backgroundOpacity": 75,
1764
- "backgroundPadding": 5,
1765
- "backgroundRadius": 3,
1766
- "width": 0.82,
1767
- "x": 50,
1768
- "y": 76,
1769
- "position": "center",
1770
- "animation": "none",
1771
- "animIn": 0.12,
1772
- "animOut": 0
1773
- },
1774
- {
1775
- "id": "opening",
1776
- "trackId": "copy",
1777
- "type": "text",
1778
- "text": "An approved hook",
1779
- "start": 0,
1780
- "end": 3,
1781
- "font": "Hanken Grotesk",
1782
- "size": 16,
1783
- "color": "#F7F0DB",
1784
- "background": "#0A0A0A",
1785
- "backgroundOpacity": 80,
1786
- "backgroundPadding": 5,
1787
- "width": 0.82,
1788
- "x": 50,
1789
- "y": 16,
1790
- "position": "center",
1791
- "animation": "fade",
1792
- "animIn": 0.2,
1793
- "animOut": 0.15
1794
- }
1795
- ],
1796
- "targetDuration": 8,
1797
- "exportSettings": {
1798
- "aspect": "9:16",
1799
- "fps": 30,
1800
- "resolution": "1080p",
1801
- "quality": "high"
1802
- }
1803
- },
1804
- "hookA": "Watch the preparation",
1805
- "hookB": "Look at the process",
1806
- "hookC": "See the finished pour",
1807
- "openingA": 0,
1808
- "openingB": 2,
1809
- "openingC": 4,
1810
- "openingDuration": 1,
1811
- "copyApproved": true
1812
- },
1813
- "expected": {
1814
- "variantA": {
1815
- "schemaVersion": 1,
1816
- "activeTimelineId": "short-form",
1817
- "name": "Variant A · Watch the preparation",
1818
- "aspect": "9:16",
1819
- "aspectRatio": "9:16",
1820
- "previewH": 369,
1821
- "backgroundColor": "#0A0A0A",
1822
- "tracks": [
1823
- {
1824
- "id": "video",
1825
- "type": "video",
1826
- "label": "Source selections"
1827
- },
1828
- {
1829
- "id": "speech",
1830
- "type": "audio",
1831
- "label": "Original speech"
1832
- },
1833
- {
1834
- "id": "music",
1835
- "type": "audio",
1836
- "label": "Music"
1837
- },
1838
- {
1839
- "id": "captions",
1840
- "type": "caption",
1841
- "label": "Reviewed subtitles"
1842
- },
1843
- {
1844
- "id": "copy",
1845
- "type": "text",
1846
- "label": "Approved copy"
1847
- },
1848
- {
1849
- "id": "variant-hook",
1850
- "type": "text",
1851
- "label": "Approved opening hook"
1852
- }
1853
- ],
1854
- "trackOrder": [
1855
- "video",
1856
- "speech",
1857
- "music",
1858
- "captions",
1859
- "copy",
1860
- "variant-hook"
1861
- ],
1862
- "clips": [
1863
- {
1864
- "id": "opening-preview-A",
1865
- "kind": "video",
1866
- "trackId": "video",
1867
- "asset": {
1868
- "kind": "video",
1869
- "assetId": "approved-video",
1870
- "versionId": "v1",
1871
- "url": "https://media.example/approved.mp4",
1872
- "width": 1080,
1873
- "height": 1920,
1874
- "duration": 12
1875
- },
1876
- "assetId": "approved-video",
1877
- "versionId": "v1",
1878
- "url": "https://media.example/approved.mp4",
1879
- "title": "Source preview A",
1880
- "start": 0,
1881
- "duration": 1,
1882
- "trimStart": 0,
1883
- "speed": 1,
1884
- "volume": 0,
1885
- "transform": {
1886
- "fit": "contain",
1887
- "scale": 1,
1888
- "x": 0,
1889
- "y": 0,
1890
- "rotation": 0,
1891
- "opacity": 1
1892
- },
1893
- "motion": {
1894
- "type": "none"
1895
- },
1896
- "transition": {
1897
- "type": "Cut",
1898
- "duration": 0
1899
- }
1900
- },
1901
- {
1902
- "id": "selection-1",
1903
- "kind": "video",
1904
- "trackId": "video",
1905
- "asset": {
1906
- "kind": "video",
1907
- "assetId": "approved-video",
1908
- "versionId": "v1",
1909
- "url": "https://media.example/approved.mp4",
1910
- "width": 1080,
1911
- "height": 1920,
1912
- "duration": 12
1913
- },
1914
- "assetId": "approved-video",
1915
- "versionId": "v1",
1916
- "url": "https://media.example/approved.mp4",
1917
- "title": "Original video",
1918
- "start": 1,
1919
- "duration": 8,
1920
- "trimStart": 4,
1921
- "speed": 1,
1922
- "volume": 0,
1923
- "transform": {
1924
- "fit": "contain",
1925
- "scale": 1,
1926
- "x": 0,
1927
- "y": 0,
1928
- "rotation": 0,
1929
- "opacity": 1
1930
- },
1931
- "motion": {
1932
- "type": "none"
1933
- },
1934
- "transition": {
1935
- "type": "Cut",
1936
- "duration": 0
1937
- }
1938
- }
1939
- ],
1940
- "audioItems": [
1941
- {
1942
- "id": "selection-1-sound",
1943
- "trackId": "speech",
1944
- "asset": {
1945
- "kind": "video",
1946
- "assetId": "approved-video",
1947
- "versionId": "v1",
1948
- "url": "https://media.example/approved.mp4",
1949
- "width": 1080,
1950
- "height": 1920,
1951
- "duration": 12
1952
- },
1953
- "assetId": "approved-video",
1954
- "versionId": "v1",
1955
- "url": "https://media.example/approved.mp4",
1956
- "title": "Original speech",
1957
- "start": 1,
1958
- "duration": 8,
1959
- "sourceOffset": 4,
1960
- "trimStart": 4,
1961
- "volume": 100,
1962
- "rate": 1,
1963
- "fadeIn": 0,
1964
- "fadeOut": 0
1965
- }
1966
- ],
1967
- "captions": [
1968
- {
1969
- "id": "caption-0",
1970
- "trackId": "captions",
1971
- "type": "text",
1972
- "text": "Keep the complete thought in the clip.",
1973
- "start": 1,
1974
- "end": 9,
1975
- "font": "Hanken Grotesk",
1976
- "size": 15,
1977
- "color": "#FFFFFF",
1978
- "background": "#0A0A0A",
1979
- "backgroundOpacity": 75,
1980
- "backgroundPadding": 5,
1981
- "backgroundRadius": 3,
1982
- "width": 0.82,
1983
- "x": 50,
1984
- "y": 76,
1985
- "position": "center",
1986
- "animation": "none",
1987
- "animIn": 0.12,
1988
- "animOut": 0
1989
- }
1990
- ],
1991
- "textOverlays": [
1992
- {
1993
- "id": "preview-label",
1994
- "trackId": "variant-hook",
1995
- "type": "text",
1996
- "text": "Preview · actual footage",
1997
- "start": 0,
1998
- "end": 1,
1999
- "font": "Hanken Grotesk",
2000
- "size": 7,
2001
- "color": "#F7F0DB",
2002
- "background": "#0A0A0A",
2003
- "backgroundOpacity": 85,
2004
- "backgroundPadding": 5,
2005
- "width": 0.82,
2006
- "x": 50,
2007
- "y": 8,
2008
- "position": "center",
2009
- "animation": "fade",
2010
- "animIn": 0.12,
2011
- "animOut": 0.1
2012
- },
2013
- {
2014
- "id": "approved-hook-A",
2015
- "trackId": "variant-hook",
2016
- "type": "text",
2017
- "text": "Watch the preparation",
2018
- "start": 0,
2019
- "end": 1,
2020
- "font": "Hanken Grotesk",
2021
- "size": 8.788958333333333,
2022
- "color": "#F7F0DB",
2023
- "background": "#0A0A0A",
2024
- "backgroundOpacity": 85,
2025
- "backgroundPadding": 5,
2026
- "width": 0.82,
2027
- "x": 50,
2028
- "y": 18,
2029
- "position": "center",
2030
- "animation": "fade",
2031
- "animIn": 0.12,
2032
- "animOut": 0.1
2033
- }
2034
- ],
2035
- "stickers": [],
2036
- "effects": [],
2037
- "audio": [
2038
- {
2039
- "id": "selection-1-sound",
2040
- "trackId": "speech",
2041
- "asset": {
2042
- "kind": "video",
2043
- "assetId": "approved-video",
2044
- "versionId": "v1",
2045
- "url": "https://media.example/approved.mp4",
2046
- "width": 1080,
2047
- "height": 1920,
2048
- "duration": 12
2049
- },
2050
- "assetId": "approved-video",
2051
- "versionId": "v1",
2052
- "url": "https://media.example/approved.mp4",
2053
- "title": "Original speech",
2054
- "start": 1,
2055
- "duration": 8,
2056
- "sourceOffset": 4,
2057
- "trimStart": 4,
2058
- "volume": 100,
2059
- "rate": 1,
2060
- "fadeIn": 0,
2061
- "fadeOut": 0
2062
- }
2063
- ],
2064
- "overlays": [
2065
- {
2066
- "id": "caption-0",
2067
- "trackId": "captions",
2068
- "type": "text",
2069
- "text": "Keep the complete thought in the clip.",
2070
- "start": 1,
2071
- "end": 9,
2072
- "font": "Hanken Grotesk",
2073
- "size": 15,
2074
- "color": "#FFFFFF",
2075
- "background": "#0A0A0A",
2076
- "backgroundOpacity": 75,
2077
- "backgroundPadding": 5,
2078
- "backgroundRadius": 3,
2079
- "width": 0.82,
2080
- "x": 50,
2081
- "y": 76,
2082
- "position": "center",
2083
- "animation": "none",
2084
- "animIn": 0.12,
2085
- "animOut": 0
2086
- },
2087
- {
2088
- "id": "preview-label",
2089
- "trackId": "variant-hook",
2090
- "type": "text",
2091
- "text": "Preview · actual footage",
2092
- "start": 0,
2093
- "end": 1,
2094
- "font": "Hanken Grotesk",
2095
- "size": 7,
2096
- "color": "#F7F0DB",
2097
- "background": "#0A0A0A",
2098
- "backgroundOpacity": 85,
2099
- "backgroundPadding": 5,
2100
- "width": 0.82,
2101
- "x": 50,
2102
- "y": 8,
2103
- "position": "center",
2104
- "animation": "fade",
2105
- "animIn": 0.12,
2106
- "animOut": 0.1
2107
- },
2108
- {
2109
- "id": "approved-hook-A",
2110
- "trackId": "variant-hook",
2111
- "type": "text",
2112
- "text": "Watch the preparation",
2113
- "start": 0,
2114
- "end": 1,
2115
- "font": "Hanken Grotesk",
2116
- "size": 8.788958333333333,
2117
- "color": "#F7F0DB",
2118
- "background": "#0A0A0A",
2119
- "backgroundOpacity": 85,
2120
- "backgroundPadding": 5,
2121
- "width": 0.82,
2122
- "x": 50,
2123
- "y": 18,
2124
- "position": "center",
2125
- "animation": "fade",
2126
- "animIn": 0.12,
2127
- "animOut": 0.1
2128
- }
2129
- ],
2130
- "targetDuration": 9,
2131
- "exportSettings": {
2132
- "aspect": "9:16",
2133
- "fps": 30,
2134
- "resolution": "1080p",
2135
- "quality": "high"
2136
- },
2137
- "productAdVariant": {
2138
- "schemaVersion": 1,
2139
- "block": {
2140
- "id": "stillmade.product-ad-variants",
2141
- "version": "1.0.0"
2142
- },
2143
- "variant": "A",
2144
- "opening": {
2145
- "from": 0,
2146
- "to": 1,
2147
- "silent": true
2148
- },
2149
- "bodyOffset": 1,
2150
- "source": {
2151
- "assetId": "approved-video",
2152
- "versionId": "v1"
2153
- },
2154
- "hook": "Watch the preparation"
2155
- }
2156
- },
2157
- "variantB": {
2158
- "schemaVersion": 1,
2159
- "activeTimelineId": "short-form",
2160
- "name": "Variant B · Look at the process",
2161
- "aspect": "9:16",
2162
- "aspectRatio": "9:16",
2163
- "previewH": 369,
2164
- "backgroundColor": "#0A0A0A",
2165
- "tracks": [
2166
- {
2167
- "id": "video",
2168
- "type": "video",
2169
- "label": "Source selections"
2170
- },
2171
- {
2172
- "id": "speech",
2173
- "type": "audio",
2174
- "label": "Original speech"
2175
- },
2176
- {
2177
- "id": "music",
2178
- "type": "audio",
2179
- "label": "Music"
2180
- },
2181
- {
2182
- "id": "captions",
2183
- "type": "caption",
2184
- "label": "Reviewed subtitles"
2185
- },
2186
- {
2187
- "id": "copy",
2188
- "type": "text",
2189
- "label": "Approved copy"
2190
- },
2191
- {
2192
- "id": "variant-hook",
2193
- "type": "text",
2194
- "label": "Approved opening hook"
2195
- }
2196
- ],
2197
- "trackOrder": [
2198
- "video",
2199
- "speech",
2200
- "music",
2201
- "captions",
2202
- "copy",
2203
- "variant-hook"
2204
- ],
2205
- "clips": [
2206
- {
2207
- "id": "opening-preview-B",
2208
- "kind": "video",
2209
- "trackId": "video",
2210
- "asset": {
2211
- "kind": "video",
2212
- "assetId": "approved-video",
2213
- "versionId": "v1",
2214
- "url": "https://media.example/approved.mp4",
2215
- "width": 1080,
2216
- "height": 1920,
2217
- "duration": 12
2218
- },
2219
- "assetId": "approved-video",
2220
- "versionId": "v1",
2221
- "url": "https://media.example/approved.mp4",
2222
- "title": "Source preview B",
2223
- "start": 0,
2224
- "duration": 1,
2225
- "trimStart": 2,
2226
- "speed": 1,
2227
- "volume": 0,
2228
- "transform": {
2229
- "fit": "contain",
2230
- "scale": 1,
2231
- "x": 0,
2232
- "y": 0,
2233
- "rotation": 0,
2234
- "opacity": 1
2235
- },
2236
- "motion": {
2237
- "type": "none"
2238
- },
2239
- "transition": {
2240
- "type": "Cut",
2241
- "duration": 0
2242
- }
2243
- },
2244
- {
2245
- "id": "selection-1",
2246
- "kind": "video",
2247
- "trackId": "video",
2248
- "asset": {
2249
- "kind": "video",
2250
- "assetId": "approved-video",
2251
- "versionId": "v1",
2252
- "url": "https://media.example/approved.mp4",
2253
- "width": 1080,
2254
- "height": 1920,
2255
- "duration": 12
2256
- },
2257
- "assetId": "approved-video",
2258
- "versionId": "v1",
2259
- "url": "https://media.example/approved.mp4",
2260
- "title": "Original video",
2261
- "start": 1,
2262
- "duration": 8,
2263
- "trimStart": 4,
2264
- "speed": 1,
2265
- "volume": 0,
2266
- "transform": {
2267
- "fit": "contain",
2268
- "scale": 1,
2269
- "x": 0,
2270
- "y": 0,
2271
- "rotation": 0,
2272
- "opacity": 1
2273
- },
2274
- "motion": {
2275
- "type": "none"
2276
- },
2277
- "transition": {
2278
- "type": "Cut",
2279
- "duration": 0
2280
- }
2281
- }
2282
- ],
2283
- "audioItems": [
2284
- {
2285
- "id": "selection-1-sound",
2286
- "trackId": "speech",
2287
- "asset": {
2288
- "kind": "video",
2289
- "assetId": "approved-video",
2290
- "versionId": "v1",
2291
- "url": "https://media.example/approved.mp4",
2292
- "width": 1080,
2293
- "height": 1920,
2294
- "duration": 12
2295
- },
2296
- "assetId": "approved-video",
2297
- "versionId": "v1",
2298
- "url": "https://media.example/approved.mp4",
2299
- "title": "Original speech",
2300
- "start": 1,
2301
- "duration": 8,
2302
- "sourceOffset": 4,
2303
- "trimStart": 4,
2304
- "volume": 100,
2305
- "rate": 1,
2306
- "fadeIn": 0,
2307
- "fadeOut": 0
2308
- }
2309
- ],
2310
- "captions": [
2311
- {
2312
- "id": "caption-0",
2313
- "trackId": "captions",
2314
- "type": "text",
2315
- "text": "Keep the complete thought in the clip.",
2316
- "start": 1,
2317
- "end": 9,
2318
- "font": "Hanken Grotesk",
2319
- "size": 15,
2320
- "color": "#FFFFFF",
2321
- "background": "#0A0A0A",
2322
- "backgroundOpacity": 75,
2323
- "backgroundPadding": 5,
2324
- "backgroundRadius": 3,
2325
- "width": 0.82,
2326
- "x": 50,
2327
- "y": 76,
2328
- "position": "center",
2329
- "animation": "none",
2330
- "animIn": 0.12,
2331
- "animOut": 0
2332
- }
2333
- ],
2334
- "textOverlays": [
2335
- {
2336
- "id": "preview-label",
2337
- "trackId": "variant-hook",
2338
- "type": "text",
2339
- "text": "Preview · actual footage",
2340
- "start": 0,
2341
- "end": 1,
2342
- "font": "Hanken Grotesk",
2343
- "size": 7,
2344
- "color": "#F7F0DB",
2345
- "background": "#0A0A0A",
2346
- "backgroundOpacity": 85,
2347
- "backgroundPadding": 5,
2348
- "width": 0.82,
2349
- "x": 50,
2350
- "y": 8,
2351
- "position": "center",
2352
- "animation": "fade",
2353
- "animIn": 0.12,
2354
- "animOut": 0.1
2355
- },
2356
- {
2357
- "id": "approved-hook-B",
2358
- "trackId": "variant-hook",
2359
- "type": "text",
2360
- "text": "Look at the process",
2361
- "start": 0,
2362
- "end": 1,
2363
- "font": "Hanken Grotesk",
2364
- "size": 8.788958333333333,
2365
- "color": "#F7F0DB",
2366
- "background": "#0A0A0A",
2367
- "backgroundOpacity": 85,
2368
- "backgroundPadding": 5,
2369
- "width": 0.82,
2370
- "x": 50,
2371
- "y": 18,
2372
- "position": "center",
2373
- "animation": "fade",
2374
- "animIn": 0.12,
2375
- "animOut": 0.1
2376
- }
2377
- ],
2378
- "stickers": [],
2379
- "effects": [],
2380
- "audio": [
2381
- {
2382
- "id": "selection-1-sound",
2383
- "trackId": "speech",
2384
- "asset": {
2385
- "kind": "video",
2386
- "assetId": "approved-video",
2387
- "versionId": "v1",
2388
- "url": "https://media.example/approved.mp4",
2389
- "width": 1080,
2390
- "height": 1920,
2391
- "duration": 12
2392
- },
2393
- "assetId": "approved-video",
2394
- "versionId": "v1",
2395
- "url": "https://media.example/approved.mp4",
2396
- "title": "Original speech",
2397
- "start": 1,
2398
- "duration": 8,
2399
- "sourceOffset": 4,
2400
- "trimStart": 4,
2401
- "volume": 100,
2402
- "rate": 1,
2403
- "fadeIn": 0,
2404
- "fadeOut": 0
2405
- }
2406
- ],
2407
- "overlays": [
2408
- {
2409
- "id": "caption-0",
2410
- "trackId": "captions",
2411
- "type": "text",
2412
- "text": "Keep the complete thought in the clip.",
2413
- "start": 1,
2414
- "end": 9,
2415
- "font": "Hanken Grotesk",
2416
- "size": 15,
2417
- "color": "#FFFFFF",
2418
- "background": "#0A0A0A",
2419
- "backgroundOpacity": 75,
2420
- "backgroundPadding": 5,
2421
- "backgroundRadius": 3,
2422
- "width": 0.82,
2423
- "x": 50,
2424
- "y": 76,
2425
- "position": "center",
2426
- "animation": "none",
2427
- "animIn": 0.12,
2428
- "animOut": 0
2429
- },
2430
- {
2431
- "id": "preview-label",
2432
- "trackId": "variant-hook",
2433
- "type": "text",
2434
- "text": "Preview · actual footage",
2435
- "start": 0,
2436
- "end": 1,
2437
- "font": "Hanken Grotesk",
2438
- "size": 7,
2439
- "color": "#F7F0DB",
2440
- "background": "#0A0A0A",
2441
- "backgroundOpacity": 85,
2442
- "backgroundPadding": 5,
2443
- "width": 0.82,
2444
- "x": 50,
2445
- "y": 8,
2446
- "position": "center",
2447
- "animation": "fade",
2448
- "animIn": 0.12,
2449
- "animOut": 0.1
2450
- },
2451
- {
2452
- "id": "approved-hook-B",
2453
- "trackId": "variant-hook",
2454
- "type": "text",
2455
- "text": "Look at the process",
2456
- "start": 0,
2457
- "end": 1,
2458
- "font": "Hanken Grotesk",
2459
- "size": 8.788958333333333,
2460
- "color": "#F7F0DB",
2461
- "background": "#0A0A0A",
2462
- "backgroundOpacity": 85,
2463
- "backgroundPadding": 5,
2464
- "width": 0.82,
2465
- "x": 50,
2466
- "y": 18,
2467
- "position": "center",
2468
- "animation": "fade",
2469
- "animIn": 0.12,
2470
- "animOut": 0.1
2471
- }
2472
- ],
2473
- "targetDuration": 9,
2474
- "exportSettings": {
2475
- "aspect": "9:16",
2476
- "fps": 30,
2477
- "resolution": "1080p",
2478
- "quality": "high"
2479
- },
2480
- "productAdVariant": {
2481
- "schemaVersion": 1,
2482
- "block": {
2483
- "id": "stillmade.product-ad-variants",
2484
- "version": "1.0.0"
2485
- },
2486
- "variant": "B",
2487
- "opening": {
2488
- "from": 2,
2489
- "to": 3,
2490
- "silent": true
2491
- },
2492
- "bodyOffset": 1,
2493
- "source": {
2494
- "assetId": "approved-video",
2495
- "versionId": "v1"
2496
- },
2497
- "hook": "Look at the process"
2498
- }
2499
- },
2500
- "variantC": {
2501
- "schemaVersion": 1,
2502
- "activeTimelineId": "short-form",
2503
- "name": "Variant C · See the finished pour",
2504
- "aspect": "9:16",
2505
- "aspectRatio": "9:16",
2506
- "previewH": 369,
2507
- "backgroundColor": "#0A0A0A",
2508
- "tracks": [
2509
- {
2510
- "id": "video",
2511
- "type": "video",
2512
- "label": "Source selections"
2513
- },
2514
- {
2515
- "id": "speech",
2516
- "type": "audio",
2517
- "label": "Original speech"
2518
- },
2519
- {
2520
- "id": "music",
2521
- "type": "audio",
2522
- "label": "Music"
2523
- },
2524
- {
2525
- "id": "captions",
2526
- "type": "caption",
2527
- "label": "Reviewed subtitles"
2528
- },
2529
- {
2530
- "id": "copy",
2531
- "type": "text",
2532
- "label": "Approved copy"
2533
- },
2534
- {
2535
- "id": "variant-hook",
2536
- "type": "text",
2537
- "label": "Approved opening hook"
2538
- }
2539
- ],
2540
- "trackOrder": [
2541
- "video",
2542
- "speech",
2543
- "music",
2544
- "captions",
2545
- "copy",
2546
- "variant-hook"
2547
- ],
2548
- "clips": [
2549
- {
2550
- "id": "opening-preview-C",
2551
- "kind": "video",
2552
- "trackId": "video",
2553
- "asset": {
2554
- "kind": "video",
2555
- "assetId": "approved-video",
2556
- "versionId": "v1",
2557
- "url": "https://media.example/approved.mp4",
2558
- "width": 1080,
2559
- "height": 1920,
2560
- "duration": 12
2561
- },
2562
- "assetId": "approved-video",
2563
- "versionId": "v1",
2564
- "url": "https://media.example/approved.mp4",
2565
- "title": "Source preview C",
2566
- "start": 0,
2567
- "duration": 1,
2568
- "trimStart": 4,
2569
- "speed": 1,
2570
- "volume": 0,
2571
- "transform": {
2572
- "fit": "contain",
2573
- "scale": 1,
2574
- "x": 0,
2575
- "y": 0,
2576
- "rotation": 0,
2577
- "opacity": 1
2578
- },
2579
- "motion": {
2580
- "type": "none"
2581
- },
2582
- "transition": {
2583
- "type": "Cut",
2584
- "duration": 0
2585
- }
2586
- },
2587
- {
2588
- "id": "selection-1",
2589
- "kind": "video",
2590
- "trackId": "video",
2591
- "asset": {
2592
- "kind": "video",
2593
- "assetId": "approved-video",
2594
- "versionId": "v1",
2595
- "url": "https://media.example/approved.mp4",
2596
- "width": 1080,
2597
- "height": 1920,
2598
- "duration": 12
2599
- },
2600
- "assetId": "approved-video",
2601
- "versionId": "v1",
2602
- "url": "https://media.example/approved.mp4",
2603
- "title": "Original video",
2604
- "start": 1,
2605
- "duration": 8,
2606
- "trimStart": 4,
2607
- "speed": 1,
2608
- "volume": 0,
2609
- "transform": {
2610
- "fit": "contain",
2611
- "scale": 1,
2612
- "x": 0,
2613
- "y": 0,
2614
- "rotation": 0,
2615
- "opacity": 1
2616
- },
2617
- "motion": {
2618
- "type": "none"
2619
- },
2620
- "transition": {
2621
- "type": "Cut",
2622
- "duration": 0
2623
- }
2624
- }
2625
- ],
2626
- "audioItems": [
2627
- {
2628
- "id": "selection-1-sound",
2629
- "trackId": "speech",
2630
- "asset": {
2631
- "kind": "video",
2632
- "assetId": "approved-video",
2633
- "versionId": "v1",
2634
- "url": "https://media.example/approved.mp4",
2635
- "width": 1080,
2636
- "height": 1920,
2637
- "duration": 12
2638
- },
2639
- "assetId": "approved-video",
2640
- "versionId": "v1",
2641
- "url": "https://media.example/approved.mp4",
2642
- "title": "Original speech",
2643
- "start": 1,
2644
- "duration": 8,
2645
- "sourceOffset": 4,
2646
- "trimStart": 4,
2647
- "volume": 100,
2648
- "rate": 1,
2649
- "fadeIn": 0,
2650
- "fadeOut": 0
2651
- }
2652
- ],
2653
- "captions": [
2654
- {
2655
- "id": "caption-0",
2656
- "trackId": "captions",
2657
- "type": "text",
2658
- "text": "Keep the complete thought in the clip.",
2659
- "start": 1,
2660
- "end": 9,
2661
- "font": "Hanken Grotesk",
2662
- "size": 15,
2663
- "color": "#FFFFFF",
2664
- "background": "#0A0A0A",
2665
- "backgroundOpacity": 75,
2666
- "backgroundPadding": 5,
2667
- "backgroundRadius": 3,
2668
- "width": 0.82,
2669
- "x": 50,
2670
- "y": 76,
2671
- "position": "center",
2672
- "animation": "none",
2673
- "animIn": 0.12,
2674
- "animOut": 0
2675
- }
2676
- ],
2677
- "textOverlays": [
2678
- {
2679
- "id": "preview-label",
2680
- "trackId": "variant-hook",
2681
- "type": "text",
2682
- "text": "Preview · actual footage",
2683
- "start": 0,
2684
- "end": 1,
2685
- "font": "Hanken Grotesk",
2686
- "size": 7,
2687
- "color": "#F7F0DB",
2688
- "background": "#0A0A0A",
2689
- "backgroundOpacity": 85,
2690
- "backgroundPadding": 5,
2691
- "width": 0.82,
2692
- "x": 50,
2693
- "y": 8,
2694
- "position": "center",
2695
- "animation": "fade",
2696
- "animIn": 0.12,
2697
- "animOut": 0.1
2698
- },
2699
- {
2700
- "id": "approved-hook-C",
2701
- "trackId": "variant-hook",
2702
- "type": "text",
2703
- "text": "See the finished pour",
2704
- "start": 0,
2705
- "end": 1,
2706
- "font": "Hanken Grotesk",
2707
- "size": 8.788958333333333,
2708
- "color": "#F7F0DB",
2709
- "background": "#0A0A0A",
2710
- "backgroundOpacity": 85,
2711
- "backgroundPadding": 5,
2712
- "width": 0.82,
2713
- "x": 50,
2714
- "y": 18,
2715
- "position": "center",
2716
- "animation": "fade",
2717
- "animIn": 0.12,
2718
- "animOut": 0.1
2719
- }
2720
- ],
2721
- "stickers": [],
2722
- "effects": [],
2723
- "audio": [
2724
- {
2725
- "id": "selection-1-sound",
2726
- "trackId": "speech",
2727
- "asset": {
2728
- "kind": "video",
2729
- "assetId": "approved-video",
2730
- "versionId": "v1",
2731
- "url": "https://media.example/approved.mp4",
2732
- "width": 1080,
2733
- "height": 1920,
2734
- "duration": 12
2735
- },
2736
- "assetId": "approved-video",
2737
- "versionId": "v1",
2738
- "url": "https://media.example/approved.mp4",
2739
- "title": "Original speech",
2740
- "start": 1,
2741
- "duration": 8,
2742
- "sourceOffset": 4,
2743
- "trimStart": 4,
2744
- "volume": 100,
2745
- "rate": 1,
2746
- "fadeIn": 0,
2747
- "fadeOut": 0
2748
- }
2749
- ],
2750
- "overlays": [
2751
- {
2752
- "id": "caption-0",
2753
- "trackId": "captions",
2754
- "type": "text",
2755
- "text": "Keep the complete thought in the clip.",
2756
- "start": 1,
2757
- "end": 9,
2758
- "font": "Hanken Grotesk",
2759
- "size": 15,
2760
- "color": "#FFFFFF",
2761
- "background": "#0A0A0A",
2762
- "backgroundOpacity": 75,
2763
- "backgroundPadding": 5,
2764
- "backgroundRadius": 3,
2765
- "width": 0.82,
2766
- "x": 50,
2767
- "y": 76,
2768
- "position": "center",
2769
- "animation": "none",
2770
- "animIn": 0.12,
2771
- "animOut": 0
2772
- },
2773
- {
2774
- "id": "preview-label",
2775
- "trackId": "variant-hook",
2776
- "type": "text",
2777
- "text": "Preview · actual footage",
2778
- "start": 0,
2779
- "end": 1,
2780
- "font": "Hanken Grotesk",
2781
- "size": 7,
2782
- "color": "#F7F0DB",
2783
- "background": "#0A0A0A",
2784
- "backgroundOpacity": 85,
2785
- "backgroundPadding": 5,
2786
- "width": 0.82,
2787
- "x": 50,
2788
- "y": 8,
2789
- "position": "center",
2790
- "animation": "fade",
2791
- "animIn": 0.12,
2792
- "animOut": 0.1
2793
- },
2794
- {
2795
- "id": "approved-hook-C",
2796
- "trackId": "variant-hook",
2797
- "type": "text",
2798
- "text": "See the finished pour",
2799
- "start": 0,
2800
- "end": 1,
2801
- "font": "Hanken Grotesk",
2802
- "size": 8.788958333333333,
2803
- "color": "#F7F0DB",
2804
- "background": "#0A0A0A",
2805
- "backgroundOpacity": 85,
2806
- "backgroundPadding": 5,
2807
- "width": 0.82,
2808
- "x": 50,
2809
- "y": 18,
2810
- "position": "center",
2811
- "animation": "fade",
2812
- "animIn": 0.12,
2813
- "animOut": 0.1
2814
- }
2815
- ],
2816
- "targetDuration": 9,
2817
- "exportSettings": {
2818
- "aspect": "9:16",
2819
- "fps": 30,
2820
- "resolution": "1080p",
2821
- "quality": "high"
2822
- },
2823
- "productAdVariant": {
2824
- "schemaVersion": 1,
2825
- "block": {
2826
- "id": "stillmade.product-ad-variants",
2827
- "version": "1.0.0"
2828
- },
2829
- "variant": "C",
2830
- "opening": {
2831
- "from": 4,
2832
- "to": 5,
2833
- "silent": true
2834
- },
2835
- "bodyOffset": 1,
2836
- "source": {
2837
- "assetId": "approved-video",
2838
- "versionId": "v1"
2839
- },
2840
- "hook": "See the finished pour"
2841
- }
2842
- },
2843
- "review": {
2844
- "schemaVersion": 1,
2845
- "state": "needs-human-review",
2846
- "humanApproved": false,
2847
- "providerCalls": 0,
2848
- "source": {
2849
- "assetId": "approved-video",
2850
- "versionId": "v1"
2851
- },
2852
- "bodyDuration": 8,
2853
- "outputDuration": 9,
2854
- "variants": [
2855
- {
2856
- "id": "A",
2857
- "hook": "Watch the preparation",
2858
- "openingFrom": 0,
2859
- "openingTo": 1
2860
- },
2861
- {
2862
- "id": "B",
2863
- "hook": "Look at the process",
2864
- "openingFrom": 2,
2865
- "openingTo": 3
2866
- },
2867
- {
2868
- "id": "C",
2869
- "hook": "See the finished pour",
2870
- "openingFrom": 4,
2871
- "openingTo": 5
2872
- }
2873
- ],
2874
- "warnings": [
2875
- "The three previews use different supplied source moments, followed by the same complete demonstration. They are not generated product scenes.",
2876
- "Preview sound is muted to avoid presenting partial speech as a quote. Original body speech and captions retain their timing and exact words.",
2877
- "Watch and listen to all three exports at phone size. Verify each hook against the actual footage and approved offer.",
2878
- "No conversion performance, customer endorsement or independent rights verification is claimed."
2879
- ]
2880
- }
2881
- }
2882
- }
2883
- ],
2884
- "portable": {
2885
- "format": "stillmade-block/1",
2886
- "dependencies": [],
2887
- "sources": [
2888
- {
2889
- "kind": "original",
2890
- "license": "MIT",
2891
- "paths": [
2892
- "LICENSE",
2893
- "src/run.js"
2894
- ],
2895
- "evidence": [
2896
- "upstream/0/LICENSE",
2897
- "upstream/0/src/run.js"
2898
- ],
2899
- "changes": "Original implementation declared by the packager; no reused repository or dependency code."
2900
- }
2901
- ],
2902
- "files": {
2903
- "upstream/0/LICENSE": "MIT License\n\nCopyright (c) <year> <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and \nassociated documentation files (the \"Software\"), to deal in the Software without restriction, including \nwithout limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell \ncopies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the \nfollowing conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial \nportions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT \nLIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO \nEVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER \nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE \nUSE OR OTHER DEALINGS IN THE SOFTWARE.\n",
2904
- "upstream/0/src/run.js": "// Block-owned source editing, executed only inside the declared SDK sandbox.\nconst clone = value => JSON.parse(JSON.stringify(value));\nconst check = (condition, message) => { if (!condition) throw Error(message); };\nconst round = value => Math.round(value * 1000000) / 1000000;\nconst base = input.timeline;\ncheck(base && base.schemaVersion === 1 && Array.isArray(base.clips) && base.clips.length > 0 && base.clips.length <= 12, 'Connect the reviewed Product Demonstration timeline.');\ncheck(base.aspect === '9:16', 'Prepare a portrait 9:16 demonstration before making variants.');\ncheck(Number.isFinite(base.targetDuration) && base.targetDuration >= 5 && base.targetDuration <= 60, 'Use a complete 5–60 second product demonstration.');\ncheck(input.copyApproved === true, 'Confirm permission for the source footage and review all three exact hooks against what it actually shows.');\ncheck(!base.stillmadeWatermark && !base.stillmadeEndScreen, 'Use an editable source timeline, before host export branding.');\ncheck(!(base.effects || []).length && !(base.stickers || []).length, 'Use the simple demonstration timeline before adding effects or graphic layers.');\nconst source = base.clips[0].asset;\ncheck(source && source.kind === 'video' && source.assetId && source.versionId && Number.isFinite(source.duration) && source.duration > 0 && Number.isFinite(source.width) && source.width > 0 && Number.isFinite(source.height) && source.height > 0, 'The original video needs its saved asset/version, duration and dimensions.');\ncheck(typeof source.url === 'string' && /^(https:\\/\\/|http:\\/\\/(localhost|127\\.0\\.0\\.1)(:\\d+)?\\/|\\/api\\/media\\/[a-zA-Z0-9_-]+\\/|sm-media:|blob:)/.test(source.url) && !/^https?:\\/\\/[^/?#]*@/.test(source.url), 'Use an authorized saved source video reference.');\nlet end = 0;\nfor (const clip of base.clips) {\n check(clip.kind === 'video' && clip.asset?.assetId === source.assetId && clip.asset?.versionId === source.versionId && clip.url === source.url, 'All demonstration selections must use the same exact original footage.');\n check(Number.isFinite(clip.start) && Math.abs(clip.start - end) < .001 && Number.isFinite(clip.duration) && clip.duration > 0, 'Keep the demonstration selections sequential, without gaps or overlaps.');\n check(clip.speed === 1 && Number.isFinite(clip.trimStart) && clip.trimStart >= 0 && clip.trimStart + clip.duration <= source.duration + .02, 'Use source-speed cuts within the original footage.');\n check(clip.transform?.fit === 'contain' && clip.transform?.rotation === 0 && clip.transform?.scale === 1 && clip.transform?.x === 0 && clip.transform?.y === 0, 'Keep the complete original frame for these evidence-preserving variants.');\n end = round(clip.start + clip.duration);\n}\ncheck(Math.abs(end - base.targetDuration) < .02, 'The demonstration duration must match its actual source selections.');\nconst length = input.openingDuration;\ncheck(Number.isFinite(length) && length >= 1 && length <= 3, 'Choose a 1–3 second opening preview.');\nconst options = ['A', 'B', 'C'].map(id => {\n const hook = input['hook' + id];\n check(typeof hook === 'string' && hook.trim() && hook.length <= 64 && !/[\\u0000-\\u001f<>]/.test(hook) && hook.split(/\\s+/).every(word => word.length <= 28), 'Supply a distinct approved hook of up to 64 plain-text characters for each variant.');\n const from = input['opening' + id];\n check(Number.isFinite(from) && from >= 0 && from + length <= source.duration + .001, 'Every opening preview must fit inside the original source video.');\n return {id, hook: hook.trim(), from, to: round(from + length)};\n});\ncheck(new Set(options.map(option => option.hook.toLowerCase())).size === 3, 'Use three distinct approved hooks.');\nfor (let i = 0; i < options.length; i++) for (let j = i + 1; j < options.length; j++) check(Math.abs(options[i].from - options[j].from) >= length - .001, 'Choose three non-overlapping source moments so the openings genuinely differ.');\nconst duration = round(base.targetDuration + length);\nconst shift = row => ({...clone(row), start: round((row.start || 0) + length), ...(Number.isFinite(row.end) ? {end: round(row.end + length)} : {})});\nconst rows = key => { check(base[key] === undefined || Array.isArray(base[key]), 'The demonstration contains unsupported editing data.'); return base[key] || []; };\nconst originalAudio = rows('audioItems'), originalCaptions = rows('captions'), originalCopy = rows('textOverlays');\ncheck(originalCaptions.length <= 500 && originalCopy.length <= 20 && originalAudio.length <= 20, 'Use a bounded demonstration timeline.');\nconst openingText = (id, text, y, size) => ({id,trackId:'variant-hook',type:'text',text,start:0,end:length,font:'Hanken Grotesk',size,color:'#F7F0DB',background:'#0A0A0A',backgroundOpacity:85,backgroundPadding:5,width:.82,x:50,y,position:'center',animation:'fade',animIn:.12,animOut:.1});\nconst outputs = {};\nfor (const option of options) {\n const timeline = clone(base);\n timeline.name = 'Variant ' + option.id + ' · ' + option.hook;\n timeline.targetDuration = duration;\n timeline.clips = [{...clone(base.clips[0]), id:'opening-preview-' + option.id, title:'Source preview ' + option.id, start:0, duration:length, trimStart:option.from, volume:0, transition:{type:'Cut',duration:0}, motion:{type:'none'}}, ...base.clips.map(shift)];\n timeline.audioItems = originalAudio.map(row => {\n // Only the existing explicitly named music bed may continue across the new\n // preview. Original speech stays attached to the untouched demonstration.\n if (row.id !== 'music-bed' || row.asset?.kind !== 'audio' || row.start !== 0) return shift(row);\n const offset = row.sourceOffset || row.trimStart || 0;\n check(Number.isFinite(row.asset.duration) && row.asset.duration >= offset + duration, 'The licensed music is too short for the opening plus full demonstration. Choose a longer soundtrack or omit it.');\n return {...clone(row), duration};\n });\n timeline.captions = originalCaptions.map(shift);\n const hookSize = Math.min(16, (369 * 9 / 16 * .82 - 12) / Math.max(18, ...option.hook.split(/\\s+/).map(word => word.length)));\n timeline.textOverlays = originalCopy.filter(row => row.id !== 'opening').map(row => row.id === 'disclosure' ? {...clone(row),start:0,end:duration} : shift(row));\n timeline.textOverlays.push(openingText('preview-label', 'Preview · actual footage', 8, 7), openingText('approved-hook-' + option.id, option.hook, 18, hookSize));\n timeline.tracks = [...(timeline.tracks || []), {id:'variant-hook',type:'text',label:'Approved opening hook'}];\n timeline.trackOrder = [...(timeline.trackOrder || []), 'variant-hook'];\n timeline.audio = clone(timeline.audioItems);\n timeline.overlays = clone([...timeline.captions, ...timeline.textOverlays]);\n timeline.productAdVariant = {schemaVersion:1,block:{id:'stillmade.product-ad-variants',version:'1.0.0'},variant:option.id,opening:{from:option.from,to:option.to,silent:true},bodyOffset:length,source:{assetId:source.assetId,versionId:source.versionId},hook:option.hook};\n outputs['variant' + option.id] = timeline;\n}\noutputs.review = {schemaVersion:1,state:'needs-human-review',humanApproved:false,providerCalls:0,source:{assetId:source.assetId,versionId:source.versionId},bodyDuration:base.targetDuration,outputDuration:duration,variants:options.map(option => ({id:option.id,hook:option.hook,openingFrom:option.from,openingTo:option.to})),warnings:['The three previews use different supplied source moments, followed by the same complete demonstration. They are not generated product scenes.','Preview sound is muted to avoid presenting partial speech as a quote. Original body speech and captions retain their timing and exact words.','Watch and listen to all three exports at phone size. Verify each hook against the actual footage and approved offer.','No conversion performance, customer endorsement or independent rights verification is claimed.']};\nreturn outputs;\n"
2905
- },
2906
- "lineage": {
2907
- "parents": [],
2908
- "changes": "Packaged original Block source for StillMade."
2909
- }
2910
- }
2911
- };