stillmade-sdk 0.1.42 → 0.1.43

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,572 +0,0 @@
1
- // Immutable SDK data for the 1.1.2 release.
2
- export default {
3
- "manifest": {
4
- "schemaVersion": 1,
5
- "sdkVersion": "0.1.0",
6
- "id": "stillmade.motion-frame-review",
7
- "name": "Motion Frame Review",
8
- "version": "1.1.2",
9
- "kind": "workspace",
10
- "runtime": "javascript",
11
- "entry": "src/run.js",
12
- "description": "Plan one approved image every 3, 5, or 10 seconds, deterministically match exact supplied product images to visual scenes for free, optionally request a quoted batch for remaining styleframes, and hand only approved images to coded Motion Designer layers.",
13
- "inputs": {
14
- "designPackage": {
15
- "type": "text",
16
- "primary": true,
17
- "required": true,
18
- "role": "motion_design_package",
19
- "description": "Version 1 design package from Motion Director or Product Launch Director."
20
- },
21
- "assets": {
22
- "type": "asset[]",
23
- "context": "assets",
24
- "required": false,
25
- "description": "Exact saved project images reused as styleframes before any generation is proposed."
26
- },
27
- "generatedImages": {
28
- "type": "image[]",
29
- "required": false,
30
- "imageMode": "reference",
31
- "description": "Completed exact styleframe images returned by the separately approved batch action."
32
- },
33
- "cadenceSec": {
34
- "type": "number",
35
- "required": false,
36
- "default": 5,
37
- "min": 3,
38
- "max": 10,
39
- "description": "One planned image every 3, 5, or 10 seconds."
40
- },
41
- "action": {
42
- "type": "text",
43
- "required": false,
44
- "default": "prepare",
45
- "description": "Prepare locally, request a quoted batch for missing images, or confirm reviewed styleframes."
46
- },
47
- "approvals": {
48
- "type": "json",
49
- "required": false,
50
- "description": "Human approval and notes for exact completed styleframes."
51
- }
52
- },
53
- "outputs": {
54
- "designPackage": {
55
- "type": "text",
56
- "primary": true,
57
- "required": false,
58
- "role": "motion_design_package",
59
- "description": "Design package with approved exact styleframe IDs assigned to their coded scenes."
60
- },
61
- "styleframeAssets": {
62
- "type": "image[]",
63
- "required": false,
64
- "role": "approved_motion_styleframes",
65
- "description": "Approved exact image versions for Motion Designer content layers."
66
- },
67
- "styleframePlan": {
68
- "type": "metadata",
69
- "role": "motion_styleframe_plan",
70
- "description": "Deterministic timestamps, prompts, supplied-asset reuse, and generation readiness."
71
- },
72
- "frameReview": {
73
- "type": "metadata",
74
- "required": false,
75
- "role": "motion_frame_review",
76
- "description": "Approved timestamp-to-image mapping and explicit AI/local execution accounting."
77
- },
78
- "generateAction": {
79
- "type": "approval",
80
- "required": false,
81
- "role": "portable_media_action",
82
- "description": "Host-quoted batch request for missing styleframes; provider, model, credentials, pricing, reservation, and settlement remain host-owned."
83
- }
84
- },
85
- "permissions": {
86
- "project": [
87
- "context.assets.read"
88
- ],
89
- "actions": [
90
- "image.generate.batch"
91
- ],
92
- "network": [],
93
- "filesystem": [],
94
- "secrets": []
95
- },
96
- "ui": [],
97
- "platforms": {
98
- "phone": {
99
- "supported": true
100
- },
101
- "browser": {
102
- "supported": true
103
- },
104
- "desktop": {
105
- "supported": true
106
- }
107
- },
108
- "license": "MIT",
109
- "provenance": {
110
- "notice": "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"
111
- }
112
- },
113
- "code": "const reviewPreviousVersion=function reviewMotionFrames(input){\n const clone=value=>JSON.parse(JSON.stringify(value));\n const text=value=>value===undefined||value===null?'':String(value);\n const safeId=value=>text(value).trim().replace(/[^a-zA-Z0-9_-]+/g,'-').replace(/^-+|-+$/g,'').slice(0,120);\n const fingerprint=value=>{const source=JSON.stringify(value);let hash=2166136261;for(let index=0;index<source.length;index++){hash^=source.charCodeAt(index);hash=Math.imul(hash,16777619)}return (hash>>>0).toString(36)};\n const parsePackage=value=>{let candidate=value;if(candidate&&typeof candidate.text==='string')candidate=candidate.text;if(typeof candidate==='string'){try{candidate=JSON.parse(candidate)}catch{throw new Error('The connected design package is not valid JSON.')}}if(!candidate||Array.isArray(candidate)||candidate.schemaVersion!==1||candidate.kind!=='motion-design-package'||!Array.isArray(candidate.scenes)||!candidate.scenes.length)throw new Error('Connect a version 1 motion design package before planning styleframes.');return clone(candidate)};\n const pkg=parsePackage(input.designPackage),assets=Array.isArray(input.assets)?input.assets.filter(asset=>asset&&asset.assetId&&asset.versionId):[],assetById=id=>assets.find(asset=>asset.assetId===id||asset.versionId===id),cadence=Number(input.cadenceSec||5);\n if(![3,5,10].includes(cadence))throw new Error('Choose a 3, 5, or 10 second styleframe interval.');\n const duration=Number(pkg.intendedOutputs?.[0]?.durationSec)||pkg.scenes.reduce((sum,scene)=>sum+Math.max(1,Number(scene.durationSec)||1),0),aspect=text(pkg.intendedOutputs?.[0]?.aspect||'16:9');\n if(!Number.isFinite(duration)||duration<=0||duration>21600||!['16:9','9:16','1:1'].includes(aspect))throw new Error('The design package needs a supported duration and aspect.');\n const regular=Array.from({length:Math.floor(duration/cadence)+1},(_,index)=>Math.min(duration,index*cadence)),timestamps=(duration-regular.at(-1)>.25?[...regular,duration]:regular).map(value=>Number(value.toFixed(3)));\n if(timestamps.length>60)throw new Error('This interval creates more than 60 styleframes. Choose a larger interval.');\n const starts=[];let cursor=0;for(const scene of pkg.scenes){starts.push({scene,start:cursor,end:cursor+Math.max(1,Number(scene.durationSec)||1)});cursor+=Math.max(1,Number(scene.durationSec)||1)}\n const style=pkg.style||{},intent=pkg.creativeIntent||{},planItems=timestamps.map((timestamp,index)=>{const entry=starts.find(item=>timestamp>=item.start&&timestamp<item.end)||starts.at(-1),scene=entry.scene,content=(scene.assetIds||[]).map(assetById).find(asset=>asset&&asset.kind==='image'),copy=scene.copy||{},panelId='styleframe-'+String(index+1).padStart(2,'0')+'-'+String(Math.round(timestamp*1000)),brief=['Create one polished motion-graphics styleframe, not a complete video.','Aspect '+aspect+'. Timestamp '+String(timestamp)+' seconds.','Communication goal: '+text(scene.goal),'Exact on-screen copy: '+[copy.eyebrow,copy.headline,copy.support].map(text).filter(Boolean).join(' / '),'Composition: '+text(scene.layout),'Visual treatment: '+text(scene.visualApproach),'Motion implication: '+text(scene.motionIntent),'Global visual language: '+text(intent.visualLanguage),'Tone and density: '+[intent.tone,intent.density].map(text).filter(Boolean).join(', '),'Palette: background '+text(style.background)+', foreground '+text(style.foreground)+', accent '+text(style.accent)+'.','Make an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.'].filter(line=>!line.endsWith(': ')).join('\\n');return {panelId,timestampSec:timestamp,sceneId:safeId(scene.id)||'scene-'+String(index+1),sceneLabel:text(scene.goal||copy.headline||'Styleframe '+String(index+1)),brief,status:content?'supplied':'missing',image:content?{kind:'image',assetId:content.assetId,versionId:content.versionId,url:content.url,...(content.width?{width:content.width}:{}),...(content.height?{height:content.height}:{})}:null}});\n const generated=Array.isArray(input.generatedImages)?input.generatedImages.filter(image=>image&&image.kind==='image'&&image.assetId&&image.versionId&&image.url):[],byPanel=new Map(generated.map(image=>[text(image.panelId),image])),items=planItems.map(item=>{const image=item.image||byPanel.get(item.panelId);return {...item,status:image?'ready':'missing',image:image?clone(image):null}}),plan={schemaVersion:1,kind:'motion-styleframe-plan',sourceRevision:text(pkg.revision),cadenceSec:cadence,durationSec:Number(duration.toFixed(3)),aspectRatio:aspect,items,execution:{planning:'local-deterministic',imageGeneration:items.some(item=>!item.image)?'explicit-quoted-action-required':'not-required'}};\n const outputs={styleframePlan:plan};\n if(input.action==='generate-batch'){\n const missing=items.filter(item=>!item.image);\n if(!missing.length)throw new Error('Every planned styleframe already has an exact image.');\n outputs.generateAction={schemaVersion:1,kind:'stillmade.media-action',operation:'image.generate.batch',request:{source:{id:'stillmade.motion-frame-review',version:'1.1.2'},items:missing.map(item=>({panelId:item.panelId,prompt:item.brief})),aspectRatio:aspect},resultPort:'generatedImages'};\n }\n if(input.action==='confirm'){\n const approvals=Array.isArray(input.approvals)?input.approvals:[],approvalById=new Map(approvals.map(item=>[text(item.panelId),item])),approved=items.filter(item=>{const decision=approvalById.get(item.panelId);return decision?.approved===true&&item.image}).map(item=>{const decision=approvalById.get(item.panelId);return {...item,notes:text(decision.notes).trim().slice(0,500)}});\n if(!approved.length)throw new Error('Approve at least one completed styleframe before continuing.');\n const next=clone(pkg),approvedByScene=new Map();for(const item of approved){if(!approvedByScene.has(item.sceneId))approvedByScene.set(item.sceneId,[]);approvedByScene.get(item.sceneId).push(item)}\n next.scenes=next.scenes.map(scene=>{const selected=approvedByScene.get(safeId(scene.id))||[],ids=selected.map(item=>item.image.assetId);return {...scene,assetIds:[...new Set([...(scene.assetIds||[]),...ids])],styleframeIds:selected.map(item=>item.panelId)}});\n const existing=new Set((next.references||[]).map(reference=>text(reference.assetId)+'::'+text(reference.versionId)));next.references=[...(next.references||[]),...approved.filter(item=>!existing.has(item.image.assetId+'::'+item.image.versionId)).map(item=>({label:item.sceneLabel,assetId:item.image.assetId,versionId:item.image.versionId,role:'content',confidence:'approved-styleframe',notes:'Approved at '+String(item.timestampSec)+' seconds for coded layer animation.'}))];\n next.styleframeReview={schemaVersion:1,cadenceSec:cadence,durationSec:Number(duration.toFixed(3)),aspectRatio:aspect,approved:approved.map(item=>({panelId:item.panelId,timestampSec:item.timestampSec,sceneId:item.sceneId,assetId:item.image.assetId,versionId:item.image.versionId,notes:item.notes})),execution:{planningAi:false,imageGenerationUsed:approved.some(item=>byPanel.has(item.panelId)),stillmadeCreditsRequiredForPlanning:false,stillmadeCreditsRequiredForGeneratedImages:approved.some(item=>byPanel.has(item.panelId))}};\n next.revision=text(next.revision||'draft-1')+'-styleframes-'+fingerprint(next.styleframeReview);outputs.designPackage=JSON.stringify(next);outputs.styleframeAssets=approved.map(item=>clone(item.image));outputs.frameReview=next.styleframeReview;\n }\n return outputs;\n};\nconst next=JSON.parse(JSON.stringify(input));\nconst assets=Array.isArray(next.assets)?next.assets:[],images=assets.filter(asset=>asset?.kind==='image'&&asset.assetId&&asset.versionId&&asset.url);\nlet pkg=next.designPackage;\nif(pkg&&typeof pkg.text==='string')pkg=pkg.text;\nif(typeof pkg==='string'&&images.length){\n try{\n const parsed=JSON.parse(pkg);\n if(parsed?.schemaVersion===1&&parsed.kind==='motion-design-package'&&Array.isArray(parsed.scenes)){\n let visualIndex=0;\n parsed.scenes=parsed.scenes.map(scene=>{\n if(Array.isArray(scene.assetIds)&&scene.assetIds.length)return scene;\n const direction=[scene.goal,scene.visualApproach,scene.layout].filter(Boolean).join(' ');\n if(!/\\b(ui|interface|image|screenshot|editor|timeline|product|layer stack|composition)\\b/i.test(direction))return scene;\n const image=images[visualIndex++%images.length];\n return {...scene,assetIds:[image.assetId],evidenceRefs:[...new Set([...(Array.isArray(scene.evidenceRefs)?scene.evidenceRefs:[]),image.assetId])]};\n });\n next.designPackage=JSON.stringify(parsed);\n }\n }catch{}\n}\nreturn reviewPreviousVersion(next);",
114
- "view": {
115
- "html": "<main><div class=\"toolbar\"><label>One frame every<select id=\"cadence\"><option value=\"3\">3 seconds</option><option value=\"5\" selected>5 seconds</option><option value=\"10\">10 seconds</option></select></label><button id=\"plan\" type=\"button\" data-stillmade-action=\"run\">Prepare frames · free</button></div><p id=\"source\">Connect a motion plan to review frames.</p><output id=\"status\" role=\"status\" aria-live=\"polite\">Choose an interval, then prepare your frames.</output><div id=\"frames\" class=\"frames\"><p>Your actual images will appear here for approval.</p></div><div class=\"handoff\"><p id=\"selection\">No frames selected.</p><button id=\"confirm\" type=\"button\" disabled>Confirm selected frames</button></div><details><summary>Selection and missing images</summary><div class=\"actions\"><button id=\"approve-all\" class=\"secondary\" type=\"button\">Select ready frames</button><button id=\"reject-all\" class=\"secondary\" type=\"button\">Clear selection</button><button id=\"generate\" class=\"secondary\" type=\"button\" disabled>Generate missing images</button></div><p class=\"notice\">Review and supplied images are free. Generating missing images requires a separate price approval before credits are spent.</p></details></main>",
116
- "css": "\nmain{padding:16px;color:var(--fg);font-family:var(--font-body)}\n.toolbar,.actions,.handoff{display:flex;align-items:center;flex-wrap:wrap;gap:12px}\n.toolbar{justify-content:space-between;margin-bottom:16px}\nlabel{display:grid;gap:8px;font-size:13px}\nselect,textarea{box-sizing:border-box;width:100%;padding:10px;border:1px solid var(--border-tok);border-radius:var(--r-2);background:var(--bg);color:var(--fg);font:inherit}\nbutton{min-height:44px;padding:10px 16px;border:0;border-radius:999px;background:var(--fg);color:var(--bg);font:inherit;cursor:pointer}\nbutton.secondary{background:transparent;color:var(--fg);border:1px solid var(--border-tok)}\nbutton:disabled{opacity:.5;cursor:default}\nbutton:focus-visible,select:focus-visible,textarea:focus-visible,input:focus-visible,summary:focus-visible{outline:2px solid var(--signal);outline-offset:3px}\np,small,output{color:var(--fg-muted)}\noutput{display:block;min-height:24px;margin:12px 0}\n.frames{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,280px),1fr));gap:28px 20px}\n.frame{min-width:0}\n.frame img,.preview{display:block;width:100%;aspect-ratio:16/9;object-fit:contain;background:var(--bg-inset)}\n.preview{display:grid;place-items:center;color:var(--fg-muted)}\n.frame-head{display:flex;justify-content:space-between;gap:12px;margin:12px 0}\n.frame-head small{white-space:nowrap;font-variant-numeric:tabular-nums}\n.approve{display:flex;align-items:center;gap:8px;min-height:44px}\n.approve input{width:18px;height:18px;margin:0;flex:none}\ndetails{margin-top:8px}summary{cursor:pointer;min-height:32px;color:var(--fg-muted)}\ntextarea{min-height:76px;resize:vertical}\n.handoff{justify-content:space-between;margin-top:28px;padding-top:16px;border-top:1px solid var(--border-tok)}\n.handoff p{margin:0}.notice{font-size:13px;margin:16px 0}\n@media(max-width:520px){main{padding:8px}.toolbar,.handoff{align-items:stretch;flex-direction:column}.actions{gap:8px}}\n",
117
- "themedCss": "\nmain{padding:16px;color:var(--fg);font-family:var(--font-body)}\n.toolbar,.actions,.handoff{display:flex;align-items:center;flex-wrap:wrap;gap:12px}\n.toolbar{justify-content:space-between;margin-bottom:16px}\nlabel{display:grid;gap:8px;font-size:13px}\nselect,textarea{box-sizing:border-box;width:100%;padding:10px;border:1px solid var(--border-tok);border-radius:var(--r-2);background:var(--bg);color:var(--fg);font:inherit}\nbutton{min-height:44px;padding:10px 16px;border:0;border-radius:999px;background:var(--fg);color:var(--bg);font:inherit;cursor:pointer}\nbutton.secondary{background:transparent;color:var(--fg);border:1px solid var(--border-tok)}\nbutton:disabled{opacity:.5;cursor:default}\nbutton:focus-visible,select:focus-visible,textarea:focus-visible,input:focus-visible,summary:focus-visible{outline:2px solid var(--signal);outline-offset:3px}\np,small,output{color:var(--fg-muted)}\noutput{display:block;min-height:24px;margin:12px 0}\n.frames{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,280px),1fr));gap:28px 20px}\n.frame{min-width:0}\n.frame img,.preview{display:block;width:100%;aspect-ratio:16/9;object-fit:contain;background:var(--bg-inset)}\n.preview{display:grid;place-items:center;color:var(--fg-muted)}\n.frame-head{display:flex;justify-content:space-between;gap:12px;margin:12px 0}\n.frame-head small{white-space:nowrap;font-variant-numeric:tabular-nums}\n.approve{display:flex;align-items:center;gap:8px;min-height:44px}\n.approve input{width:18px;height:18px;margin:0;flex:none}\ndetails{margin-top:8px}summary{cursor:pointer;min-height:32px;color:var(--fg-muted)}\ntextarea{min-height:76px;resize:vertical}\n.handoff{justify-content:space-between;margin-top:28px;padding-top:16px;border-top:1px solid var(--border-tok)}\n.handoff p{margin:0}.notice{font-size:13px;margin:16px 0}\n@media(max-width:520px){main{padding:8px}.toolbar,.handoff{align-items:stretch;flex-direction:column}.actions{gap:8px}}\n",
118
- "javascript": "\nconst e=id=>document.getElementById(id),status=e('status');\nlet designPackage=null,assets=[],generatedImages=[],plan=null,decisions=new Map(),busy=false,inputRevision=0,displayRevision=0,previewQueue=(async()=>{})(),cadenceEdited=false;\nconst text=value=>value===undefined||value===null?'':String(value);\nconst imageFor=item=>item.image||generatedImages.find(image=>text(image.panelId)===item.panelId);\nconst selected=()=> (plan?.items||[]).filter(item=>imageFor(item)&&decisions.get(item.panelId)?.approved);\nconst refresh=()=>{\n const items=plan?.items||[],stale=plan&&plan.cadenceSec!==Number(e('cadence').value);\n e('plan').disabled=busy||!designPackage;\n e('confirm').disabled=busy||stale||!selected().length;\n e('generate').disabled=busy||stale||!items.some(item=>!imageFor(item));\n e('approve-all').disabled=busy||!items.some(imageFor);\n e('reject-all').disabled=busy||!items.length;\n e('selection').textContent=String(selected().length)+' of '+String(items.length)+' frames selected'+(stale?' · Prepare frames for the new interval.':'');\n};\nconst card=(item,index)=>{\n const image=imageFor(item),decision=decisions.get(item.panelId)||{approved:false,notes:''};\n return {tag:'article',className:'frame',children:[\n image?{tag:'img',id:'frame-image-'+String(index),label:'Frame at '+String(item.timestampSec)+' seconds'}:{tag:'div',className:'preview',text:'Image needed'},\n {tag:'div',className:'frame-head',children:[{tag:'strong',text:item.sceneLabel},{tag:'small',text:String(item.timestampSec)+'s'}]},\n {tag:'small',id:'frame-status-'+String(index),text:image?'Loading image…':'Supply an image or generate missing images below.'},\n {tag:'label',className:'approve',children:[{tag:'input',id:'frame-approval-'+String(index),type:'checkbox',action:'approve:'+String(index),checked:decision.approved,disabled:!image,label:'Use frame at '+String(item.timestampSec)+' seconds'},{tag:'span',text:'Use this frame'}]},\n {tag:'details',children:[{tag:'summary',text:'Add a revision note'},{tag:'label',children:[{tag:'span',text:'What should change?'},{tag:'textarea',action:'notes:'+String(index),value:decision.notes,placeholder:'Keep the image; adjust the headline…'}]}]}\n ]};\n};\nconst draw=()=>{\n const revision=++displayRevision,items=plan?.items||[];\n StillMade.render('frames',items.length?items.map(card):[{tag:'p',text:'Your actual images will appear here for approval.'}]);\n // Serialize display requests across redraws: the SDK permits one in flight.\n items.forEach((item,index)=>{\n const image=imageFor(item);if(!image)return;\n previewQueue=previewQueue.then(async()=>{\n if(revision!==displayRevision)return;\n try{\n const preview=await StillMade.previewImage(image);\n if(revision!==displayRevision)return;\n e('frame-image-'+String(index)).src=preview.url;\n e('frame-status-'+String(index)).textContent='';\n }catch(error){\n if(revision!==displayRevision)return;\n e('frame-status-'+String(index)).textContent=error.message||'Image preview unavailable. Prepare frames to retry.';\n }\n });\n });refresh();\n};\nconst request=action=>StillMade.run({designPackage,assets,generatedImages,cadenceSec:Number(e('cadence').value),action,...(action==='confirm'?{approvals:(plan?.items||[]).map(item=>({panelId:item.panelId,approved:decisions.get(item.panelId)?.approved===true,notes:text(decisions.get(item.panelId)?.notes)}))}:{})});\nStillMade.onInput(values=>{\n const changed=designPackage!==values.designPackage;\n inputRevision++;designPackage=values.designPackage||null;assets=Array.isArray(values.assets)?values.assets:[];generatedImages=Array.isArray(values.generatedImages)?values.generatedImages:[];\n if(!cadenceEdited&&[3,5,10].includes(Number(values.cadenceSec)))e('cadence').value=String(values.cadenceSec);\n if(changed){plan=null;decisions.forEach((decision,key)=>decisions.set(key,{approved:false,notes:decision.notes}))}\n e('source').textContent=designPackage?'Review the images before creating motion.':'Connect a motion plan to review frames.';\n status.textContent=changed?'Prepare frames for the connected plan.':generatedImages.length?'New images are ready to review.':'Review each image, then confirm your selection.';\n draw();\n});\nStillMade.onAction(event=>{\n const parts=event.action.split(':'),item=plan?.items?.at(Number(parts.at(1)));if(!item)return;\n const current=decisions.get(item.panelId)||{approved:false,notes:''};\n if(parts.at(0)==='approve')current.approved=event.checked;\n if(parts.at(0)==='notes')current.notes=text(event.value).slice(0,500);\n decisions.set(item.panelId,current);refresh();\n});\ne('cadence').addEventListener('change',()=>{cadenceEdited=true;refresh()});\ne('plan').addEventListener('click',async()=>{\n if(busy||!designPackage)return;busy=true;refresh();const revision=inputRevision;status.textContent='Preparing frames from supplied images…';\n try{const result=await request('prepare');if(revision!==inputRevision)return;plan=result.styleframePlan;status.textContent=String(plan.items.length)+' frames ready for review. Select the images you want to use.';draw()}\n catch(error){status.textContent=error.message||'Frames could not be prepared.'}finally{busy=false;refresh()}\n});\ne('generate').addEventListener('click',async()=>{\n if(busy)return;busy=true;refresh();status.textContent='Preparing a price approval for missing images…';\n try{await request('generate-batch');status.textContent='Review the image batch and maximum price below before approving generation.'}\n catch(error){status.textContent=error.message||'The image batch could not be prepared.'}finally{busy=false;refresh()}\n});\nconst selectAll=approved=>{(plan?.items||[]).forEach((item,index)=>{const current=decisions.get(item.panelId)||{notes:''};decisions.set(item.panelId,{approved:approved&&!!imageFor(item),notes:current.notes});e('frame-approval-'+String(index)).checked=approved&&!!imageFor(item)});refresh()};\ne('approve-all').addEventListener('click',()=>selectAll(true));\ne('reject-all').addEventListener('click',()=>selectAll(false));\ne('confirm').addEventListener('click',async()=>{\n if(busy)return;busy=true;refresh();status.textContent='Confirming selected images…';\n try{const result=await request('confirm');status.textContent=String(result.frameReview.approved.length)+' frames confirmed for Motion Designer.'}\n catch(error){status.textContent=error.message||'The frames could not be confirmed.'}finally{busy=false;refresh()}\n});\n"
119
- },
120
- "tests": [
121
- {
122
- "name": "Reuse supplied images and approve an exact generated styleframe handoff",
123
- "input": {
124
- "designPackage": "{\"schemaVersion\":1,\"revision\":\"reference-1\",\"kind\":\"motion-design-package\",\"brief\":\"Launch the product\",\"audience\":\"creative teams\",\"creativeIntent\":{\"idea\":\"Product proof with editorial restraint\",\"tone\":\"confident\",\"visualLanguage\":\"real UI, oversized typography, warm whitespace\",\"motionCharacter\":\"measured\",\"density\":\"open\",\"avoid\":[]},\"constraints\":{\"required\":[],\"preferences\":[],\"locks\":[]},\"references\":[],\"intendedOutputs\":[{\"aspect\":\"16:9\",\"durationSec\":12,\"channel\":\"web\"}],\"style\":{\"background\":\"#F1EEE8\",\"foreground\":\"#101010\",\"accent\":\"#F0642B\",\"fontDirection\":\"modern sans\"},\"scenes\":[{\"id\":\"scene-1\",\"goal\":\"Show the product\",\"copy\":{\"headline\":\"Build it your way\",\"support\":\"\"},\"durationSec\":6,\"visualApproach\":\"Real product UI inside an editorial composition\",\"layout\":\"offset editorial\",\"motionIntent\":\"measured reveal\",\"assetIds\":[\"ui-1\"],\"evidenceRefs\":[],\"locks\":[]},{\"id\":\"scene-2\",\"goal\":\"Land the brand\",\"copy\":{\"headline\":\"StillMade\",\"support\":\"Motion you can edit\"},\"durationSec\":6,\"visualApproach\":\"Oversized type and restrained brand mark\",\"layout\":\"centered poster\",\"motionIntent\":\"precise finish\",\"assetIds\":[],\"evidenceRefs\":[],\"locks\":[]}],\"audio\":{\"mode\":\"silent\",\"assetIds\":[],\"captions\":[],\"notes\":\"\"},\"unresolved\":[],\"branch\":{\"intent\":\"create\",\"parentRevision\":null}}",
125
- "assets": [
126
- {
127
- "kind": "image",
128
- "assetId": "ui-1",
129
- "versionId": "ui-v1",
130
- "url": "https://media.example/ui.png",
131
- "width": 1600,
132
- "height": 900
133
- }
134
- ],
135
- "generatedImages": [
136
- {
137
- "kind": "image",
138
- "assetId": "generated-1",
139
- "versionId": "generated-v1",
140
- "url": "https://media.example/generated.png",
141
- "panelId": "styleframe-03-10000",
142
- "width": 1024,
143
- "height": 1024
144
- }
145
- ],
146
- "cadenceSec": 5,
147
- "action": "confirm",
148
- "approvals": [
149
- {
150
- "panelId": "styleframe-01-0",
151
- "approved": true,
152
- "notes": ""
153
- },
154
- {
155
- "panelId": "styleframe-02-5000",
156
- "approved": false,
157
- "notes": ""
158
- },
159
- {
160
- "panelId": "styleframe-03-10000",
161
- "approved": true,
162
- "notes": ""
163
- },
164
- {
165
- "panelId": "styleframe-04-12000",
166
- "approved": true,
167
- "notes": ""
168
- }
169
- ]
170
- },
171
- "expected": {
172
- "styleframePlan": {
173
- "schemaVersion": 1,
174
- "kind": "motion-styleframe-plan",
175
- "sourceRevision": "reference-1",
176
- "cadenceSec": 5,
177
- "durationSec": 12,
178
- "aspectRatio": "16:9",
179
- "items": [
180
- {
181
- "panelId": "styleframe-01-0",
182
- "timestampSec": 0,
183
- "sceneId": "scene-1",
184
- "sceneLabel": "Show the product",
185
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 0 seconds.\nCommunication goal: Show the product\nExact on-screen copy: Build it your way\nComposition: offset editorial\nVisual treatment: Real product UI inside an editorial composition\nMotion implication: measured reveal\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
186
- "status": "ready",
187
- "image": {
188
- "kind": "image",
189
- "assetId": "ui-1",
190
- "versionId": "ui-v1",
191
- "url": "https://media.example/ui.png",
192
- "width": 1600,
193
- "height": 900
194
- }
195
- },
196
- {
197
- "panelId": "styleframe-02-5000",
198
- "timestampSec": 5,
199
- "sceneId": "scene-1",
200
- "sceneLabel": "Show the product",
201
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 5 seconds.\nCommunication goal: Show the product\nExact on-screen copy: Build it your way\nComposition: offset editorial\nVisual treatment: Real product UI inside an editorial composition\nMotion implication: measured reveal\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
202
- "status": "ready",
203
- "image": {
204
- "kind": "image",
205
- "assetId": "ui-1",
206
- "versionId": "ui-v1",
207
- "url": "https://media.example/ui.png",
208
- "width": 1600,
209
- "height": 900
210
- }
211
- },
212
- {
213
- "panelId": "styleframe-03-10000",
214
- "timestampSec": 10,
215
- "sceneId": "scene-2",
216
- "sceneLabel": "Land the brand",
217
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 10 seconds.\nCommunication goal: Land the brand\nExact on-screen copy: StillMade / Motion you can edit\nComposition: centered poster\nVisual treatment: Oversized type and restrained brand mark\nMotion implication: precise finish\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
218
- "status": "ready",
219
- "image": {
220
- "kind": "image",
221
- "assetId": "generated-1",
222
- "versionId": "generated-v1",
223
- "url": "https://media.example/generated.png",
224
- "panelId": "styleframe-03-10000",
225
- "width": 1024,
226
- "height": 1024
227
- }
228
- },
229
- {
230
- "panelId": "styleframe-04-12000",
231
- "timestampSec": 12,
232
- "sceneId": "scene-2",
233
- "sceneLabel": "Land the brand",
234
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 12 seconds.\nCommunication goal: Land the brand\nExact on-screen copy: StillMade / Motion you can edit\nComposition: centered poster\nVisual treatment: Oversized type and restrained brand mark\nMotion implication: precise finish\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
235
- "status": "missing",
236
- "image": null
237
- }
238
- ],
239
- "execution": {
240
- "planning": "local-deterministic",
241
- "imageGeneration": "explicit-quoted-action-required"
242
- }
243
- },
244
- "designPackage": "{\"schemaVersion\":1,\"revision\":\"reference-1-styleframes-a6px0m\",\"kind\":\"motion-design-package\",\"brief\":\"Launch the product\",\"audience\":\"creative teams\",\"creativeIntent\":{\"idea\":\"Product proof with editorial restraint\",\"tone\":\"confident\",\"visualLanguage\":\"real UI, oversized typography, warm whitespace\",\"motionCharacter\":\"measured\",\"density\":\"open\",\"avoid\":[]},\"constraints\":{\"required\":[],\"preferences\":[],\"locks\":[]},\"references\":[{\"label\":\"Show the product\",\"assetId\":\"ui-1\",\"versionId\":\"ui-v1\",\"role\":\"content\",\"confidence\":\"approved-styleframe\",\"notes\":\"Approved at 0 seconds for coded layer animation.\"},{\"label\":\"Land the brand\",\"assetId\":\"generated-1\",\"versionId\":\"generated-v1\",\"role\":\"content\",\"confidence\":\"approved-styleframe\",\"notes\":\"Approved at 10 seconds for coded layer animation.\"}],\"intendedOutputs\":[{\"aspect\":\"16:9\",\"durationSec\":12,\"channel\":\"web\"}],\"style\":{\"background\":\"#F1EEE8\",\"foreground\":\"#101010\",\"accent\":\"#F0642B\",\"fontDirection\":\"modern sans\"},\"scenes\":[{\"id\":\"scene-1\",\"goal\":\"Show the product\",\"copy\":{\"headline\":\"Build it your way\",\"support\":\"\"},\"durationSec\":6,\"visualApproach\":\"Real product UI inside an editorial composition\",\"layout\":\"offset editorial\",\"motionIntent\":\"measured reveal\",\"assetIds\":[\"ui-1\"],\"evidenceRefs\":[],\"locks\":[],\"styleframeIds\":[\"styleframe-01-0\"]},{\"id\":\"scene-2\",\"goal\":\"Land the brand\",\"copy\":{\"headline\":\"StillMade\",\"support\":\"Motion you can edit\"},\"durationSec\":6,\"visualApproach\":\"Oversized type and restrained brand mark\",\"layout\":\"centered poster\",\"motionIntent\":\"precise finish\",\"assetIds\":[\"generated-1\"],\"evidenceRefs\":[],\"locks\":[],\"styleframeIds\":[\"styleframe-03-10000\"]}],\"audio\":{\"mode\":\"silent\",\"assetIds\":[],\"captions\":[],\"notes\":\"\"},\"unresolved\":[],\"branch\":{\"intent\":\"create\",\"parentRevision\":null},\"styleframeReview\":{\"schemaVersion\":1,\"cadenceSec\":5,\"durationSec\":12,\"aspectRatio\":\"16:9\",\"approved\":[{\"panelId\":\"styleframe-01-0\",\"timestampSec\":0,\"sceneId\":\"scene-1\",\"assetId\":\"ui-1\",\"versionId\":\"ui-v1\",\"notes\":\"\"},{\"panelId\":\"styleframe-03-10000\",\"timestampSec\":10,\"sceneId\":\"scene-2\",\"assetId\":\"generated-1\",\"versionId\":\"generated-v1\",\"notes\":\"\"}],\"execution\":{\"planningAi\":false,\"imageGenerationUsed\":true,\"stillmadeCreditsRequiredForPlanning\":false,\"stillmadeCreditsRequiredForGeneratedImages\":true}}}",
245
- "styleframeAssets": [
246
- {
247
- "kind": "image",
248
- "assetId": "ui-1",
249
- "versionId": "ui-v1",
250
- "url": "https://media.example/ui.png",
251
- "width": 1600,
252
- "height": 900
253
- },
254
- {
255
- "kind": "image",
256
- "assetId": "generated-1",
257
- "versionId": "generated-v1",
258
- "url": "https://media.example/generated.png",
259
- "panelId": "styleframe-03-10000",
260
- "width": 1024,
261
- "height": 1024
262
- }
263
- ],
264
- "frameReview": {
265
- "schemaVersion": 1,
266
- "cadenceSec": 5,
267
- "durationSec": 12,
268
- "aspectRatio": "16:9",
269
- "approved": [
270
- {
271
- "panelId": "styleframe-01-0",
272
- "timestampSec": 0,
273
- "sceneId": "scene-1",
274
- "assetId": "ui-1",
275
- "versionId": "ui-v1",
276
- "notes": ""
277
- },
278
- {
279
- "panelId": "styleframe-03-10000",
280
- "timestampSec": 10,
281
- "sceneId": "scene-2",
282
- "assetId": "generated-1",
283
- "versionId": "generated-v1",
284
- "notes": ""
285
- }
286
- ],
287
- "execution": {
288
- "planningAi": false,
289
- "imageGenerationUsed": true,
290
- "stillmadeCreditsRequiredForPlanning": false,
291
- "stillmadeCreditsRequiredForGeneratedImages": true
292
- }
293
- }
294
- }
295
- },
296
- {
297
- "name": "Prepare a free cadence plan before generation",
298
- "input": {
299
- "designPackage": "{\"schemaVersion\":1,\"revision\":\"reference-1\",\"kind\":\"motion-design-package\",\"brief\":\"Launch the product\",\"audience\":\"creative teams\",\"creativeIntent\":{\"idea\":\"Product proof with editorial restraint\",\"tone\":\"confident\",\"visualLanguage\":\"real UI, oversized typography, warm whitespace\",\"motionCharacter\":\"measured\",\"density\":\"open\",\"avoid\":[]},\"constraints\":{\"required\":[],\"preferences\":[],\"locks\":[]},\"references\":[],\"intendedOutputs\":[{\"aspect\":\"16:9\",\"durationSec\":12,\"channel\":\"web\"}],\"style\":{\"background\":\"#F1EEE8\",\"foreground\":\"#101010\",\"accent\":\"#F0642B\",\"fontDirection\":\"modern sans\"},\"scenes\":[{\"id\":\"scene-1\",\"goal\":\"Show the product\",\"copy\":{\"headline\":\"Build it your way\",\"support\":\"\"},\"durationSec\":6,\"visualApproach\":\"Real product UI inside an editorial composition\",\"layout\":\"offset editorial\",\"motionIntent\":\"measured reveal\",\"assetIds\":[\"ui-1\"],\"evidenceRefs\":[],\"locks\":[]},{\"id\":\"scene-2\",\"goal\":\"Land the brand\",\"copy\":{\"headline\":\"StillMade\",\"support\":\"Motion you can edit\"},\"durationSec\":6,\"visualApproach\":\"Oversized type and restrained brand mark\",\"layout\":\"centered poster\",\"motionIntent\":\"precise finish\",\"assetIds\":[],\"evidenceRefs\":[],\"locks\":[]}],\"audio\":{\"mode\":\"silent\",\"assetIds\":[],\"captions\":[],\"notes\":\"\"},\"unresolved\":[],\"branch\":{\"intent\":\"create\",\"parentRevision\":null}}",
300
- "assets": [
301
- {
302
- "kind": "image",
303
- "assetId": "ui-1",
304
- "versionId": "ui-v1",
305
- "url": "https://media.example/ui.png",
306
- "width": 1600,
307
- "height": 900
308
- }
309
- ],
310
- "cadenceSec": 5,
311
- "action": "prepare"
312
- },
313
- "expected": {
314
- "styleframePlan": {
315
- "schemaVersion": 1,
316
- "kind": "motion-styleframe-plan",
317
- "sourceRevision": "reference-1",
318
- "cadenceSec": 5,
319
- "durationSec": 12,
320
- "aspectRatio": "16:9",
321
- "items": [
322
- {
323
- "panelId": "styleframe-01-0",
324
- "timestampSec": 0,
325
- "sceneId": "scene-1",
326
- "sceneLabel": "Show the product",
327
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 0 seconds.\nCommunication goal: Show the product\nExact on-screen copy: Build it your way\nComposition: offset editorial\nVisual treatment: Real product UI inside an editorial composition\nMotion implication: measured reveal\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
328
- "status": "ready",
329
- "image": {
330
- "kind": "image",
331
- "assetId": "ui-1",
332
- "versionId": "ui-v1",
333
- "url": "https://media.example/ui.png",
334
- "width": 1600,
335
- "height": 900
336
- }
337
- },
338
- {
339
- "panelId": "styleframe-02-5000",
340
- "timestampSec": 5,
341
- "sceneId": "scene-1",
342
- "sceneLabel": "Show the product",
343
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 5 seconds.\nCommunication goal: Show the product\nExact on-screen copy: Build it your way\nComposition: offset editorial\nVisual treatment: Real product UI inside an editorial composition\nMotion implication: measured reveal\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
344
- "status": "ready",
345
- "image": {
346
- "kind": "image",
347
- "assetId": "ui-1",
348
- "versionId": "ui-v1",
349
- "url": "https://media.example/ui.png",
350
- "width": 1600,
351
- "height": 900
352
- }
353
- },
354
- {
355
- "panelId": "styleframe-03-10000",
356
- "timestampSec": 10,
357
- "sceneId": "scene-2",
358
- "sceneLabel": "Land the brand",
359
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 10 seconds.\nCommunication goal: Land the brand\nExact on-screen copy: StillMade / Motion you can edit\nComposition: centered poster\nVisual treatment: Oversized type and restrained brand mark\nMotion implication: precise finish\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
360
- "status": "missing",
361
- "image": null
362
- },
363
- {
364
- "panelId": "styleframe-04-12000",
365
- "timestampSec": 12,
366
- "sceneId": "scene-2",
367
- "sceneLabel": "Land the brand",
368
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 12 seconds.\nCommunication goal: Land the brand\nExact on-screen copy: StillMade / Motion you can edit\nComposition: centered poster\nVisual treatment: Oversized type and restrained brand mark\nMotion implication: precise finish\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
369
- "status": "missing",
370
- "image": null
371
- }
372
- ],
373
- "execution": {
374
- "planning": "local-deterministic",
375
- "imageGeneration": "explicit-quoted-action-required"
376
- }
377
- }
378
- }
379
- },
380
- {
381
- "name": "Match exact supplied project images to unassigned visual scenes before approval",
382
- "input": {
383
- "designPackage": "{\"schemaVersion\":1,\"revision\":\"automatic-real-media-1\",\"kind\":\"motion-design-package\",\"brief\":\"Launch the product\",\"audience\":\"creative teams\",\"creativeIntent\":{\"idea\":\"Product proof with editorial restraint\",\"tone\":\"confident\",\"visualLanguage\":\"real UI, oversized typography, warm whitespace\",\"motionCharacter\":\"measured\",\"density\":\"open\",\"avoid\":[]},\"constraints\":{\"required\":[],\"preferences\":[],\"locks\":[]},\"references\":[],\"intendedOutputs\":[{\"aspect\":\"16:9\",\"durationSec\":12,\"channel\":\"web\"}],\"style\":{\"background\":\"#F1EEE8\",\"foreground\":\"#101010\",\"accent\":\"#F0642B\",\"fontDirection\":\"modern sans\"},\"scenes\":[{\"id\":\"scene-1\",\"goal\":\"Show the product\",\"copy\":{\"headline\":\"Build it your way\",\"support\":\"\"},\"durationSec\":6,\"visualApproach\":\"Actual product UI screenshot inside the composition\",\"layout\":\"offset editorial\",\"motionIntent\":\"measured reveal\",\"assetIds\":[],\"evidenceRefs\":[],\"locks\":[]},{\"id\":\"scene-2\",\"goal\":\"Land the brand\",\"copy\":{\"headline\":\"StillMade\",\"support\":\"Motion you can edit\"},\"durationSec\":6,\"visualApproach\":\"Oversized type and restrained brand mark\",\"layout\":\"centered poster\",\"motionIntent\":\"precise finish\",\"assetIds\":[],\"evidenceRefs\":[],\"locks\":[]}],\"audio\":{\"mode\":\"silent\",\"assetIds\":[],\"captions\":[],\"notes\":\"\"},\"unresolved\":[],\"branch\":{\"intent\":\"create\",\"parentRevision\":null}}",
384
- "assets": [
385
- {
386
- "kind": "image",
387
- "assetId": "ui-1",
388
- "versionId": "ui-v1",
389
- "url": "https://media.example/ui.png",
390
- "width": 1600,
391
- "height": 900
392
- }
393
- ],
394
- "cadenceSec": 5,
395
- "action": "prepare"
396
- },
397
- "expected": {
398
- "styleframePlan": {
399
- "schemaVersion": 1,
400
- "kind": "motion-styleframe-plan",
401
- "sourceRevision": "automatic-real-media-1",
402
- "cadenceSec": 5,
403
- "durationSec": 12,
404
- "aspectRatio": "16:9",
405
- "items": [
406
- {
407
- "panelId": "styleframe-01-0",
408
- "timestampSec": 0,
409
- "sceneId": "scene-1",
410
- "sceneLabel": "Show the product",
411
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 0 seconds.\nCommunication goal: Show the product\nExact on-screen copy: Build it your way\nComposition: offset editorial\nVisual treatment: Actual product UI screenshot inside the composition\nMotion implication: measured reveal\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
412
- "status": "ready",
413
- "image": {
414
- "kind": "image",
415
- "assetId": "ui-1",
416
- "versionId": "ui-v1",
417
- "url": "https://media.example/ui.png",
418
- "width": 1600,
419
- "height": 900
420
- }
421
- },
422
- {
423
- "panelId": "styleframe-02-5000",
424
- "timestampSec": 5,
425
- "sceneId": "scene-1",
426
- "sceneLabel": "Show the product",
427
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 5 seconds.\nCommunication goal: Show the product\nExact on-screen copy: Build it your way\nComposition: offset editorial\nVisual treatment: Actual product UI screenshot inside the composition\nMotion implication: measured reveal\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
428
- "status": "ready",
429
- "image": {
430
- "kind": "image",
431
- "assetId": "ui-1",
432
- "versionId": "ui-v1",
433
- "url": "https://media.example/ui.png",
434
- "width": 1600,
435
- "height": 900
436
- }
437
- },
438
- {
439
- "panelId": "styleframe-03-10000",
440
- "timestampSec": 10,
441
- "sceneId": "scene-2",
442
- "sceneLabel": "Land the brand",
443
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 10 seconds.\nCommunication goal: Land the brand\nExact on-screen copy: StillMade / Motion you can edit\nComposition: centered poster\nVisual treatment: Oversized type and restrained brand mark\nMotion implication: precise finish\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
444
- "status": "missing",
445
- "image": null
446
- },
447
- {
448
- "panelId": "styleframe-04-12000",
449
- "timestampSec": 12,
450
- "sceneId": "scene-2",
451
- "sceneLabel": "Land the brand",
452
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 12 seconds.\nCommunication goal: Land the brand\nExact on-screen copy: StillMade / Motion you can edit\nComposition: centered poster\nVisual treatment: Oversized type and restrained brand mark\nMotion implication: precise finish\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
453
- "status": "missing",
454
- "image": null
455
- }
456
- ],
457
- "execution": {
458
- "planning": "local-deterministic",
459
- "imageGeneration": "explicit-quoted-action-required"
460
- }
461
- }
462
- }
463
- },
464
- {
465
- "name": "Bind missing-image approval to this exact release",
466
- "input": {
467
- "designPackage": "{\"schemaVersion\":1,\"revision\":\"reference-1\",\"kind\":\"motion-design-package\",\"brief\":\"Launch the product\",\"audience\":\"creative teams\",\"creativeIntent\":{\"idea\":\"Product proof with editorial restraint\",\"tone\":\"confident\",\"visualLanguage\":\"real UI, oversized typography, warm whitespace\",\"motionCharacter\":\"measured\",\"density\":\"open\",\"avoid\":[]},\"constraints\":{\"required\":[],\"preferences\":[],\"locks\":[]},\"references\":[],\"intendedOutputs\":[{\"aspect\":\"16:9\",\"durationSec\":12,\"channel\":\"web\"}],\"style\":{\"background\":\"#F1EEE8\",\"foreground\":\"#101010\",\"accent\":\"#F0642B\",\"fontDirection\":\"modern sans\"},\"scenes\":[{\"id\":\"scene-1\",\"goal\":\"Show the product\",\"copy\":{\"headline\":\"Build it your way\",\"support\":\"\"},\"durationSec\":6,\"visualApproach\":\"Real product UI inside an editorial composition\",\"layout\":\"offset editorial\",\"motionIntent\":\"measured reveal\",\"assetIds\":[\"ui-1\"],\"evidenceRefs\":[],\"locks\":[]},{\"id\":\"scene-2\",\"goal\":\"Land the brand\",\"copy\":{\"headline\":\"StillMade\",\"support\":\"Motion you can edit\"},\"durationSec\":6,\"visualApproach\":\"Oversized type and restrained brand mark\",\"layout\":\"centered poster\",\"motionIntent\":\"precise finish\",\"assetIds\":[],\"evidenceRefs\":[],\"locks\":[]}],\"audio\":{\"mode\":\"silent\",\"assetIds\":[],\"captions\":[],\"notes\":\"\"},\"unresolved\":[],\"branch\":{\"intent\":\"create\",\"parentRevision\":null}}",
468
- "assets": [
469
- {
470
- "kind": "image",
471
- "assetId": "ui-1",
472
- "versionId": "ui-v1",
473
- "url": "https://media.example/ui.png",
474
- "width": 1600,
475
- "height": 900
476
- }
477
- ],
478
- "cadenceSec": 5,
479
- "action": "generate-batch"
480
- },
481
- "expected": {
482
- "styleframePlan": {
483
- "schemaVersion": 1,
484
- "kind": "motion-styleframe-plan",
485
- "sourceRevision": "reference-1",
486
- "cadenceSec": 5,
487
- "durationSec": 12,
488
- "aspectRatio": "16:9",
489
- "items": [
490
- {
491
- "panelId": "styleframe-01-0",
492
- "timestampSec": 0,
493
- "sceneId": "scene-1",
494
- "sceneLabel": "Show the product",
495
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 0 seconds.\nCommunication goal: Show the product\nExact on-screen copy: Build it your way\nComposition: offset editorial\nVisual treatment: Real product UI inside an editorial composition\nMotion implication: measured reveal\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
496
- "status": "ready",
497
- "image": {
498
- "kind": "image",
499
- "assetId": "ui-1",
500
- "versionId": "ui-v1",
501
- "url": "https://media.example/ui.png",
502
- "width": 1600,
503
- "height": 900
504
- }
505
- },
506
- {
507
- "panelId": "styleframe-02-5000",
508
- "timestampSec": 5,
509
- "sceneId": "scene-1",
510
- "sceneLabel": "Show the product",
511
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 5 seconds.\nCommunication goal: Show the product\nExact on-screen copy: Build it your way\nComposition: offset editorial\nVisual treatment: Real product UI inside an editorial composition\nMotion implication: measured reveal\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
512
- "status": "ready",
513
- "image": {
514
- "kind": "image",
515
- "assetId": "ui-1",
516
- "versionId": "ui-v1",
517
- "url": "https://media.example/ui.png",
518
- "width": 1600,
519
- "height": 900
520
- }
521
- },
522
- {
523
- "panelId": "styleframe-03-10000",
524
- "timestampSec": 10,
525
- "sceneId": "scene-2",
526
- "sceneLabel": "Land the brand",
527
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 10 seconds.\nCommunication goal: Land the brand\nExact on-screen copy: StillMade / Motion you can edit\nComposition: centered poster\nVisual treatment: Oversized type and restrained brand mark\nMotion implication: precise finish\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
528
- "status": "missing",
529
- "image": null
530
- },
531
- {
532
- "panelId": "styleframe-04-12000",
533
- "timestampSec": 12,
534
- "sceneId": "scene-2",
535
- "sceneLabel": "Land the brand",
536
- "brief": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 12 seconds.\nCommunication goal: Land the brand\nExact on-screen copy: StillMade / Motion you can edit\nComposition: centered poster\nVisual treatment: Oversized type and restrained brand mark\nMotion implication: precise finish\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation.",
537
- "status": "missing",
538
- "image": null
539
- }
540
- ],
541
- "execution": {
542
- "planning": "local-deterministic",
543
- "imageGeneration": "explicit-quoted-action-required"
544
- }
545
- },
546
- "generateAction": {
547
- "schemaVersion": 1,
548
- "kind": "stillmade.media-action",
549
- "operation": "image.generate.batch",
550
- "request": {
551
- "source": {
552
- "id": "stillmade.motion-frame-review",
553
- "version": "1.1.2"
554
- },
555
- "items": [
556
- {
557
- "panelId": "styleframe-03-10000",
558
- "prompt": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 10 seconds.\nCommunication goal: Land the brand\nExact on-screen copy: StillMade / Motion you can edit\nComposition: centered poster\nVisual treatment: Oversized type and restrained brand mark\nMotion implication: precise finish\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation."
559
- },
560
- {
561
- "panelId": "styleframe-04-12000",
562
- "prompt": "Create one polished motion-graphics styleframe, not a complete video.\nAspect 16:9. Timestamp 12 seconds.\nCommunication goal: Land the brand\nExact on-screen copy: StillMade / Motion you can edit\nComposition: centered poster\nVisual treatment: Oversized type and restrained brand mark\nMotion implication: precise finish\nGlobal visual language: real UI, oversized typography, warm whitespace\nTone and density: confident, open\nPalette: background #F1EEE8, foreground #101010, accent #F0642B.\nMake an editorial, premium frame suitable for coded vector, SVG, typography, masks, UI plates, and layered animation. Do not invent product UI, logos, claims, metrics, testimonials, prices, or unreadable fake interface text. Leave clear structure for later coded layer animation."
563
- }
564
- ],
565
- "aspectRatio": "16:9"
566
- },
567
- "resultPort": "generatedImages"
568
- }
569
- }
570
- }
571
- ]
572
- };