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,465 +0,0 @@
1
- // Generated immutable package data.
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.1",
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.0.0'},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><header><div><small>Styleframe approval gate</small><h1>Motion Frame Review</h1><p>Approve the images the coded motion workspace will build on.</p></div><div class=\"cost\"><strong>Clear cost split</strong><span>Planning and review are local. Only Generate missing images opens a quoted AI action.</span></div></header><section><div class=\"section-head\"><div><h2>1. Choose the visual sampling rate</h2><p id=\"source\">Connect a Director package to plan styleframes.</p></div><label>One image 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></div><div class=\"actions\"><button id=\"plan\" type=\"button\">Plan styleframes · free</button><button id=\"generate\" type=\"button\" class=\"paid\">Generate missing images · quoted</button><button id=\"approve-all\" class=\"secondary\" type=\"button\">Approve all ready</button><button id=\"reject-all\" class=\"secondary\" type=\"button\">Clear all</button></div><output id=\"status\" role=\"status\" aria-live=\"polite\">Waiting for a Director package.</output><div id=\"frames\" class=\"frames\"><p>Planned styleframes will appear here.</p></div></section><section class=\"handoff\"><div><h2>2. Confirm images for coded motion</h2><p>Approved exact image versions are attached to their scenes. Motion Designer then creates editable SVG/type/shape/image layers, keyframes, cameras, masks, and transitions around them.</p></div><button id=\"confirm\" type=\"button\">Confirm styleframes</button></section><aside><strong>What stays local</strong><p>Cadence, prompts, supplied-asset reuse, selection, notes, layer planning, motion editing, remixing, and deterministic rendering. Generated art is the only action here that can spend credits, and it cannot run before the host shows the batch maximum.</p></aside></main>",
116
- "css": "main{max-width:1220px;margin:0 auto;padding:22px;color:var(--fg);font-family:var(--font-body)}header,.section-head,.handoff{display:flex;align-items:flex-start;justify-content:space-between;gap:18px}header{margin-bottom:18px}h1{margin:4px 0 8px;font-family:var(--font-display);font-size:40px;font-style:italic;font-weight:200}h2{margin:0 0 6px;font-size:18px}p,small,output,.cost span{color:var(--fg-muted)}section,aside{margin-top:14px;padding:16px;border:1px solid var(--border-tok);border-radius:var(--r-3);background:var(--bg-elev-1)}.cost{display:grid;gap:3px;min-width:250px;padding:12px;border:1px solid var(--signal);border-radius:var(--r-2);background:color-mix(in srgb,var(--signal) 10%,var(--bg))}.cost strong{color:var(--signal)}label{display:grid;gap:6px;font-size:13px;font-weight:650}select,textarea{box-sizing:border-box;width:100%;padding:9px;border:1px solid var(--border-tok);border-radius:var(--r-2);background:var(--bg);color:var(--fg);font:inherit}.actions{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0 8px}button{min-height:44px;padding:10px 16px;border:0;border-radius:999px;background:var(--fg);color:var(--bg);font:inherit}.paid{background:var(--signal);color:#111}button.secondary{border:1px solid var(--border-tok);background:transparent;color:var(--fg)}button:disabled{opacity:.5}.frames{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-top:14px}.frame{overflow:hidden;border:1px solid var(--border-tok);border-radius:var(--r-3);background:var(--bg)}.frame.approved{border-color:var(--signal);box-shadow:0 0 0 1px var(--signal)}.preview{display:grid;place-items:center;width:100%;aspect-ratio:16/9;background:linear-gradient(145deg,#171717,#292929);color:#aaa}.frame img{display:block;width:100%;aspect-ratio:16/9;object-fit:contain;background:#111}.frame-body{display:grid;gap:9px;padding:11px}.frame-head{display:flex;justify-content:space-between;gap:10px}.frame-head small{font-variant-numeric:tabular-nums}.approve{display:flex;grid-template-columns:auto 1fr;align-items:center;gap:8px;margin:0;font-weight:650}.approve input{width:auto}.prompt{max-height:120px;overflow:auto;white-space:pre-wrap;font-size:11px}.handoff{align-items:center}aside{display:grid;grid-template-columns:auto 1fr;gap:12px}aside p{margin:0}output{display:block;min-height:22px}@media(max-width:800px){header,.section-head,.handoff{flex-direction:column}.cost{min-width:0}.frames{grid-template-columns:1fr}aside{grid-template-columns:1fr}}",
117
- "javascript": "const e=id=>document.getElementById(id),status=e('status');let designPackage=null,assets=[],generatedImages=[],plan=null,decisions=new Map(),busy=false;const text=value=>value===undefined||value===null?'':String(value),clock=value=>{const seconds=Math.max(0,Number(value)||0),minutes=Math.floor(seconds/60),rest=(seconds-minutes*60).toFixed(2).padStart(5,'0');return String(minutes).padStart(2,'0')+':'+rest},imageFor=item=>item.image||generatedImages.find(image=>text(image.panelId)===item.panelId),card=(item,index)=>{const image=imageFor(item),decision=decisions.get(item.panelId)||{approved:!!image,notes:''};return {tag:'article',className:'frame'+(decision.approved?' approved':''),children:[image?{tag:'img',id:'styleframe-image-'+String(index),label:'Styleframe at '+clock(item.timestampSec)}:{tag:'div',className:'preview',children:[{tag:'strong',text:'Image needed'},{tag:'small',text:'Quoted generation only'}]},{tag:'div',className:'frame-body',children:[{tag:'div',className:'frame-head',children:[{tag:'strong',text:item.sceneLabel},{tag:'small',text:clock(item.timestampSec)}]},{tag:'label',className:'approve',children:[{tag:'input',type:'checkbox',action:'approve:'+String(index),checked:decision.approved,disabled:!image,label:'Approve '+item.panelId},{tag:'span',text:image?(item.status==='supplied'?'Use supplied asset':'Use generated image'):'Generate before approval'}]},{tag:'label',children:[{tag:'span',text:'Revision note'},{tag:'textarea',action:'notes:'+String(index),value:decision.notes,placeholder:'What should Motion Designer preserve or change?'}]},{tag:'details',children:[{tag:'summary',text:'Styleframe brief'},{tag:'p',className:'prompt',text:item.brief}]}]}]}},draw=()=>{const items=plan?.items||[];StillMade.render('frames',items.length?items.map(card):[{tag:'p',text:'Planned styleframes will appear here.'}]);items.forEach((item,index)=>{const image=imageFor(item),target=e('styleframe-image-'+String(index));if(image&&target)StillMade.previewImage(image).then(preview=>{target.src=preview.url}).catch(()=>{target.hidden=true})});e('generate').disabled=busy||!items.some(item=>!imageFor(item));e('confirm').disabled=busy||!items.some(item=>{const decision=decisions.get(item.panelId);return !!imageFor(item)&&decision?.approved})},request=async action=>{if(!designPackage)throw Error('Connect a Director package first.');return 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)}))}:{})})};StillMade.onInput(values=>{designPackage=values.designPackage||null;assets=(values.assets||[]).filter(asset=>asset&&asset.assetId&&asset.versionId);generatedImages=Array.isArray(values.generatedImages)?values.generatedImages:[];if(generatedImages.length&&plan){plan={...plan,items:plan.items.map(item=>{const image=imageFor(item);return image?{...item,image,status:'ready'}:item})};}e('source').textContent='Director package connected · '+String(assets.length)+' exact project assets available.';status.textContent=generatedImages.length?String(generatedImages.length)+' generated styleframes returned. Review each image, then confirm.':'Choose a cadence and plan the stills.';draw()});StillMade.onAction(event=>{const parts=event.action.split(':'),item=plan?.items?.at(Number(parts.at(1)));if(!item)return;const current=decisions.get(item.panelId)||{approved:!!imageFor(item),notes:''};if(parts.at(0)==='approve')current.approved=event.checked;if(parts.at(0)==='notes')current.notes=event.value.slice(0,500);decisions.set(item.panelId,current);draw()});e('plan').addEventListener('click',async()=>{if(busy)return;busy=true;draw();status.textContent='Planning timestamps and reusing exact supplied assets locally…';try{const result=await request('prepare');plan=result.styleframePlan;decisions=new Map(plan.items.map(item=>[item.panelId,{approved:!!imageFor(item),notes:''}]));status.textContent=String(plan.items.length)+' styleframes planned · '+String(plan.items.filter(item=>!!imageFor(item)).length)+' already use supplied or completed images.'}catch(error){status.textContent=error.message||'The styleframe plan could not be prepared.'}finally{busy=false;draw()}});e('generate').addEventListener('click',async()=>{if(busy)return;busy=true;draw();status.textContent='Preparing the exact missing-image batch. Review the maximum cost before approving it.';try{await request('generate-batch');status.textContent='The quoted generation action is ready below. Approve it only if the batch and maximum look right.'}catch(error){status.textContent=error.message||'The image batch could not be prepared.'}finally{busy=false;draw()}});e('approve-all').addEventListener('click',()=>{(plan?.items||[]).forEach(item=>{if(imageFor(item))decisions.set(item.panelId,{approved:true,notes:text(decisions.get(item.panelId)?.notes)})});draw()});e('reject-all').addEventListener('click',()=>{(plan?.items||[]).forEach(item=>decisions.set(item.panelId,{approved:false,notes:text(decisions.get(item.panelId)?.notes)}));draw()});e('confirm').addEventListener('click',async()=>{if(busy)return;busy=true;draw();status.textContent='Binding approved images to the coded scene handoff…';try{const result=await request('confirm');status.textContent=String(result.frameReview.approved.length)+' exact styleframes approved. Motion Designer can now build the editable layer stack on them.'}catch(error){status.textContent=error.message||'The styleframes could not be confirmed.'}finally{busy=false;draw()}});",
118
- "themedCss": ".cost{background:var(--bg-elev-2);border-color:var(--signal)}.cost strong{color:var(--signal)}.paid{background:var(--signal);color:var(--fg-on-accent)}.preview{background:var(--bg-inset);color:var(--fg-muted)}"
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
- };