stillmade-sdk 0.1.41 → 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 (285) hide show
  1. package/.stillmade/sdk-baseline.json +19 -21
  2. package/AGENTS.md +17 -12
  3. package/FRAME_VIEWS.md +113 -0
  4. package/INTERFACE_DESIGN.md +67 -22
  5. package/MOBILE_UI.md +4 -2
  6. package/MODULES.md +152 -6
  7. package/PASTE_TO_LLM.md +42 -32
  8. package/README.md +3 -2
  9. package/SDK.md +1028 -563
  10. package/UI_AESTHETIC.md +30 -3
  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 +8 -1
  108. package/examples/clean-text.stillmade.json +4 -0
  109. package/examples/custom-interface.stillmade.json +4 -0
  110. package/examples/describe-image.stillmade.json +4 -0
  111. package/examples/foley-cue.stillmade.json +4 -0
  112. package/examples/generate-image.stillmade.json +4 -0
  113. package/examples/generate-video.stillmade.json +10 -2
  114. package/examples/module-word-stats/stillmade.block.json +4 -0
  115. package/examples/narrate-script.stillmade.json +4 -0
  116. package/examples/numbered-takes.stillmade.json +4 -0
  117. package/examples/research-topic.stillmade.json +9 -1
  118. package/examples/score-a-scene.stillmade.json +4 -0
  119. package/examples/script-draft.stillmade.json +4 -0
  120. package/examples/summarize-page.stillmade.json +4 -0
  121. package/examples/text-workflow.stillmade.json +7 -32
  122. package/examples/thicken-lines.stillmade.json +4 -0
  123. package/examples/timeline-polish.stillmade.json +15 -3
  124. package/examples/transcribe-audio.stillmade.json +15 -3
  125. package/examples/word-count.stillmade.json +4 -0
  126. package/package.json +1 -1
  127. package/packages/block-cli/cli.js +13 -6
  128. package/packages/block-cli/dev-host/assets/host.js +81 -38
  129. package/packages/block-cli/dev-host/assets/index.css +1 -1
  130. package/packages/block-cli/format.js +1 -1
  131. package/packages/block-cli/ready-gate.js +4 -0
  132. package/packages/block-cli/templates.js +37 -19
  133. package/packages/block-cli/type-packages.js +119 -0
  134. package/packages/block-platform/block-readiness.js +8 -1
  135. package/packages/block-platform/canvas.js +2 -1
  136. package/packages/block-platform/catalog.js +27 -48
  137. package/packages/block-platform/native-host-inventory.js +0 -226
  138. package/packages/block-platform/plain-descriptions.js +1 -25
  139. package/packages/block-platform/project-type-starters.js +13 -53
  140. package/packages/block-platform/script-handoff.js +2 -4
  141. package/packages/block-platform/type-workspace.js +2 -0
  142. package/packages/block-sdk/appearance.js +3 -1
  143. package/packages/block-sdk/audio-generation-example.js +2 -2
  144. package/packages/block-sdk/block-tier.js +1 -1
  145. package/packages/block-sdk/builder-contract.js +13 -11
  146. package/packages/block-sdk/capabilities.js +1 -1
  147. package/packages/block-sdk/capability-example.js +1 -1
  148. package/packages/block-sdk/contracts.js +6 -2
  149. package/packages/block-sdk/examples.js +3 -3
  150. package/packages/block-sdk/first-party-identities.js +1 -84
  151. package/packages/block-sdk/first-party-packages.js +3 -85
  152. package/packages/block-sdk/generation-catalog.js +15 -3
  153. package/packages/block-sdk/image-description-example.js +1 -1
  154. package/packages/block-sdk/image-generation-example.js +1 -1
  155. package/packages/block-sdk/index.d.ts +2 -1
  156. package/packages/block-sdk/media-analysis-example.js +2 -2
  157. package/packages/block-sdk/mock-host.js +7 -1
  158. package/packages/block-sdk/module-example.js +1 -1
  159. package/packages/block-sdk/module-host-calls.js +35 -10
  160. package/packages/block-sdk/module-hosted.js +15 -2
  161. package/packages/block-sdk/module-media-access.js +71 -0
  162. package/packages/block-sdk/module-node.js +1 -1
  163. package/packages/block-sdk/portable-media-actions.js +1 -1
  164. package/packages/block-sdk/runtime.js +1 -1
  165. package/packages/block-sdk/speech-example.js +1 -1
  166. package/packages/block-sdk/state-example.js +1 -1
  167. package/packages/block-sdk/timeline-proposal-example.js +1 -1
  168. package/packages/block-sdk/transcription-example.js +1 -1
  169. package/packages/block-sdk/trigger-examples.js +2 -2
  170. package/packages/block-sdk/video-generation-example.js +1 -1
  171. package/packages/block-sdk/view-bridge.js +4 -1
  172. package/packages/block-sdk/view-design.js +44 -15
  173. package/packages/block-sdk/web-example.js +2 -2
  174. package/packages/design-system/block-kit.css +53 -12
  175. package/packages/design-system/block-kit.html +3 -2
  176. package/blocks/mcp-motion-planner/versions/1.1.0/package.js +0 -97
  177. package/blocks/motion-designer/versions/1.0.1/package.js +0 -173318
  178. package/blocks/motion-designer/versions/1.0.2/package.js +0 -173318
  179. package/blocks/motion-frame-review/versions/1.1.1/package.js +0 -465
  180. package/blocks/motion-frame-review/versions/1.1.2/package.snapshot.js +0 -572
  181. package/blocks/narration/package.js +0 -1
  182. package/blocks/narration/versions/1.0.0/package.js +0 -221
  183. package/blocks/narration/versions/1.0.1/package.js +0 -221
  184. package/blocks/native/sm.animated-scene/versions/2.0.0/package.js +0 -475
  185. package/blocks/native/sm.animated-scene/versions/2.1.0/package.js +0 -498
  186. package/blocks/native/sm.animated-scene/versions/2.2.0/package.js +0 -524
  187. package/blocks/native/sm.animated-scene/versions/2.3.0/package.js +0 -618
  188. package/blocks/native/sm.animated-scene/versions/2.3.1/package.js +0 -618
  189. package/blocks/native/sm.animated-scene/versions/2.3.2/package.js +0 -723
  190. package/blocks/native/sm.animated-scene/versions/2.3.3/package.js +0 -723
  191. package/blocks/native/sm.animated-scene/versions/2.3.4/package.js +0 -676
  192. package/blocks/native/sm.animated-scene/versions/2.3.5/package.js +0 -693
  193. package/blocks/native/sm.animated-scene/versions/2.3.6/package.js +0 -700
  194. package/blocks/native/sm.animated-scene/versions/2.3.7/package.js +0 -747
  195. package/blocks/native/sm.animated-scene/versions/2.3.8/package.js +0 -769
  196. package/blocks/native/sm.animated-scene/versions/2.3.9/package.js +0 -769
  197. package/blocks/native/sm.animated-scene-assistant/versions/1.0.0/package.js +0 -183
  198. package/blocks/native/sm.blueprint/versions/2.0.0/package.js +0 -358
  199. package/blocks/native/sm.blueprint/versions/2.1.0/package.js +0 -358
  200. package/blocks/native/sm.blueprint/versions/2.1.1/package.js +0 -358
  201. package/blocks/native/sm.blueprint/versions/2.1.2/package.js +0 -358
  202. package/blocks/native/sm.blueprint/versions/2.1.3/package.js +0 -381
  203. package/blocks/native/sm.blueprint/versions/2.1.4/package.js +0 -381
  204. package/blocks/native/sm.blueprint/versions/2.1.5/package.js +0 -339
  205. package/blocks/native/sm.blueprint/versions/2.1.6/package.js +0 -356
  206. package/blocks/native/sm.blueprint/versions/2.1.7/package.js +0 -363
  207. package/blocks/native/sm.blueprint/versions/2.1.8/package.js +0 -410
  208. package/blocks/native/sm.blueprint/versions/2.1.9/package.js +0 -422
  209. package/blocks/native/sm.blueprint-assistant/versions/1.0.0/package.js +0 -172
  210. package/blocks/native/sm.chat/versions/2.0.0/package.js +0 -144
  211. package/blocks/native/sm.chat/versions/2.0.1/package.js +0 -97
  212. package/blocks/native/sm.chat/versions/2.0.2/package.js +0 -100
  213. package/blocks/native/sm.chat/versions/2.0.3/package.js +0 -100
  214. package/blocks/native/sm.continue-if/versions/1.0.0/package.js +0 -168
  215. package/blocks/native/sm.describe-media/versions/2.0.0/package.js +0 -153
  216. package/blocks/native/sm.describe-media/versions/2.0.1/package.js +0 -156
  217. package/blocks/native/sm.describe-media/versions/2.1.0/package.js +0 -140
  218. package/blocks/native/sm.image-editor/versions/2.0.0/package.js +0 -183
  219. package/blocks/native/sm.image-editor/versions/2.0.1/package.js +0 -190
  220. package/blocks/native/sm.new-items/versions/1.0.0/package.js +0 -191
  221. package/blocks/native/sm.pick-photos/versions/1.0.0/package.js +0 -334
  222. package/blocks/native/sm.quality-audit/versions/1.0.0/package.js +0 -192
  223. package/blocks/native/sm.quality-audit/versions/1.0.1/package.js +0 -192
  224. package/blocks/native/sm.quality-audit/versions/1.0.2/package.js +0 -195
  225. package/blocks/native/sm.research/versions/2.0.0/package.js +0 -175
  226. package/blocks/native/sm.research/versions/2.0.1/package.js +0 -184
  227. package/blocks/native/sm.research/versions/2.0.2/package.js +0 -187
  228. package/blocks/native/sm.script/versions/2.0.0/package.js +0 -144
  229. package/blocks/native/sm.script/versions/2.1.0/package.js +0 -144
  230. package/blocks/native/sm.script/versions/2.1.1/package.js +0 -144
  231. package/blocks/native/sm.script/versions/2.1.2/package.js +0 -105
  232. package/blocks/native/sm.script/versions/2.1.3/package.js +0 -152
  233. package/blocks/native/sm.script/versions/2.1.4/package.js +0 -156
  234. package/blocks/native/sm.script/versions/2.1.5/package.js +0 -156
  235. package/blocks/native/sm.shot-plan/versions/2.0.0/package.js +0 -301
  236. package/blocks/native/sm.shot-plan/versions/2.1.0/package.js +0 -528
  237. package/blocks/native/sm.shot-plan/versions/2.1.1/package.js +0 -528
  238. package/blocks/native/sm.shot-plan/versions/2.1.2/package.js +0 -528
  239. package/blocks/native/sm.shot-plan/versions/2.1.3/package.js +0 -536
  240. package/blocks/native/sm.shot-plan/versions/2.2.0/package.js +0 -800
  241. package/blocks/native/sm.shot-plan/versions/2.2.1/package.js +0 -920
  242. package/blocks/native/sm.shot-plan-assistant/versions/1.0.0/package.js +0 -173
  243. package/blocks/native/sm.stock-search/versions/2.0.0/package.js +0 -174
  244. package/blocks/native/sm.thumbnail/versions/2.0.0/package.js +0 -137
  245. package/blocks/native/sm.thumbnail/versions/2.0.1/package.js +0 -140
  246. package/blocks/native/sm.transcribe/versions/2.0.0/package.js +0 -163
  247. package/blocks/native/sm.transcribe/versions/2.0.1/package.js +0 -168
  248. package/blocks/native/sm.whiteboard-assistant/versions/1.0.0/package.js +0 -175
  249. package/blocks/native/sm.youtube/versions/2.0.0/package.js +0 -217
  250. package/blocks/occasion-story/package.js +0 -1
  251. package/blocks/occasion-story/versions/1.0.0/package.js +0 -1658
  252. package/blocks/occasion-story/versions/1.0.1/package.js +0 -1699
  253. package/blocks/occasion-story/versions/1.0.2/package.js +0 -1682
  254. package/blocks/photo-reel-composer/versions/1.0.0/package.js +0 -3043
  255. package/blocks/photo-reel-composer/versions/1.0.1/package.js +0 -3026
  256. package/blocks/photo-reel-composer/versions/1.0.2/package.js +0 -4149
  257. package/blocks/product-ad-variants/versions/1.0.0/package.js +0 -2911
  258. package/blocks/product-launch-director/versions/1.0.0/package.js +0 -103
  259. package/blocks/release-visuals/package.js +0 -1
  260. package/blocks/release-visuals/versions/1.0.0/package.js +0 -1492
  261. package/blocks/release-visuals/versions/1.0.1/package.js +0 -1517
  262. package/blocks/release-visuals/versions/1.0.2/package.js +0 -1500
  263. package/blocks/screen-recorder/package.js +0 -1
  264. package/blocks/screen-recorder/versions/1.0.0/package.js +0 -223
  265. package/blocks/screen-recorder/versions/1.0.1/package.js +0 -223
  266. package/blocks/short-form-finish/package.js +0 -1
  267. package/blocks/short-form-finish/versions/1.0.0/package.js +0 -1043
  268. package/blocks/short-form-finish/versions/1.0.1/package.js +0 -1043
  269. package/blocks/short-form-finish/versions/1.0.2/package.js +0 -1043
  270. package/blocks/short-form-finish/versions/1.0.3/package.js +0 -1026
  271. package/examples/saas-product-launch-reviewed-source.stillmade.json +0 -383
  272. package/examples/saas-product-launch.stillmade.json +0 -304
  273. package/packages/block-platform/dealer-inventory-video-project-type.js +0 -38
  274. package/packages/block-platform/first-revenue-project-types.js +0 -46
  275. package/packages/block-platform/fixture-starters.js +0 -13
  276. package/packages/block-platform/launch-project-source.js +0 -10
  277. package/packages/block-platform/launch-project.js +0 -30
  278. package/packages/block-platform/motion-project-types.js +0 -55
  279. package/packages/block-platform/motion-starters.js +0 -14
  280. package/packages/block-platform/product-ad-variants-project-type.js +0 -30
  281. package/packages/block-platform/product-launch-updated.js +0 -90
  282. package/packages/block-platform/revenue-review-project-types.js +0 -36
  283. package/packages/block-platform/revenue-review-starters.js +0 -13
  284. package/packages/block-platform/script-writer.js +0 -29
  285. 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
- };