stillmade-sdk 0.1.42 → 0.1.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.stillmade/sdk-baseline.json +6 -8
- package/AGENTS.md +15 -10
- package/FRAME_VIEWS.md +113 -0
- package/INTERFACE_DESIGN.md +62 -22
- package/MOBILE_UI.md +4 -2
- package/MODULES.md +152 -6
- package/PASTE_TO_LLM.md +35 -25
- package/README.md +3 -2
- package/SDK.md +994 -550
- package/UI_AESTHETIC.md +22 -2
- package/blocks/generate/package.js +1 -0
- package/blocks/generate/versions/1.0.0/package.js +463 -0
- package/docs/build/audio-to-editor.md +36 -0
- package/docs/build/block-builder-contract.md +150 -0
- package/docs/build/comfyui.md +227 -0
- package/docs/build/concepts.md +40 -0
- package/docs/build/context.md +159 -0
- package/docs/build/cookbook.md +57 -0
- package/docs/build/custom-interface.md +617 -0
- package/docs/build/data-types.md +83 -0
- package/docs/build/frame-views.md +259 -0
- package/docs/build/generate-media.md +59 -0
- package/docs/build/github-applications.md +314 -0
- package/docs/build/hosted-images.md +214 -0
- package/docs/build/hosted-music.md +39 -0
- package/docs/build/hosted-speech.md +157 -0
- package/docs/build/hosted-text.md +246 -0
- package/docs/build/image-description.md +49 -0
- package/docs/build/interface-design.md +343 -0
- package/docs/build/javascript.md +63 -0
- package/docs/build/local-preview.md +61 -0
- package/docs/build/media-analysis.md +27 -0
- package/docs/build/media.md +400 -0
- package/docs/build/mobile-ui.md +106 -0
- package/docs/build/modules.md +487 -0
- package/docs/build/original-blocks.md +70 -0
- package/docs/build/outside-apis.md +128 -0
- package/docs/build/production-context-templates.md +12 -0
- package/docs/build/project-storage.md +94 -0
- package/docs/build/quickstart.md +48 -0
- package/docs/build/recipes.md +103 -0
- package/docs/build/script-handoff.md +45 -0
- package/docs/build/script-writer.md +34 -0
- package/docs/build/state.md +223 -0
- package/docs/build/testing.md +112 -0
- package/docs/build/timeline-edits.md +116 -0
- package/docs/build/timeline-proposals.md +76 -0
- package/docs/build/transcription.md +59 -0
- package/docs/build/triggers.md +59 -0
- package/docs/build/tutorial.md +52 -0
- package/docs/build/typescript.md +34 -0
- package/docs/build/video-generation.md +61 -0
- package/docs/build/web-reading.md +37 -0
- package/docs/build/with-your-ai.md +27 -0
- package/docs/changelog.md +9 -0
- package/docs/creators.md +21 -0
- package/docs/distribute/discovery.md +43 -0
- package/docs/distribute/imports.md +58 -0
- package/docs/distribute/publishing.md +29 -0
- package/docs/distribute/sdk-versions.md +36 -0
- package/docs/distribute/selling.md +14 -0
- package/docs/distribute/teams.md +60 -0
- package/docs/distribute/versioning.md +28 -0
- package/docs/examples.md +23 -0
- package/docs/gallery.md +26 -0
- package/docs/index.md +50 -0
- package/docs/native-mcp.md +307 -0
- package/docs/project-types/automation.md +43 -0
- package/docs/project-types/batches.md +50 -0
- package/docs/project-types/build.md +42 -0
- package/docs/project-types/completion.md +15 -0
- package/docs/project-types/conditions.md +21 -0
- package/docs/project-types/hosted-review.md +115 -0
- package/docs/project-types/onboarding.md +75 -0
- package/docs/project-types/running.md +309 -0
- package/docs/project-types/testing.md +72 -0
- package/docs/reference/application-artifacts.md +87 -0
- package/docs/reference/authoring-guide.md +134 -0
- package/docs/reference/browser-applications.md +267 -0
- package/docs/reference/capabilities.md +45 -0
- package/docs/reference/cli.md +71 -0
- package/docs/reference/connection-api.md +59 -0
- package/docs/reference/cooperative-jobs.md +13 -0
- package/docs/reference/desktop-capabilities.md +172 -0
- package/docs/reference/desktop-execution.md +77 -0
- package/docs/reference/errors.md +233 -0
- package/docs/reference/execution.md +800 -0
- package/docs/reference/first-party-blocks.md +40 -0
- package/docs/reference/generation-models.md +59 -0
- package/docs/reference/limits.md +306 -0
- package/docs/reference/manifest-kinds-controls.md +36 -0
- package/docs/reference/manifest.md +181 -0
- package/docs/reference/operations.md +36 -0
- package/docs/reference/package-jobs.md +35 -0
- package/docs/reference/parity.md +55 -0
- package/docs/reference/permissions.md +86 -0
- package/docs/reference/ports.md +26 -0
- package/docs/reference/types.md +268 -0
- package/docs/reference/universal-resolver.md +303 -0
- package/docs/reference/view-bridge.md +60 -0
- package/docs/reference/view-rules.md +15 -0
- package/docs/reference/workspace-sync.md +25 -0
- package/docs/sdk.md +34 -0
- package/docs/tools/block-remix.md +211 -0
- package/docs/tools/llm.md +2213 -0
- package/docs/tools/repository-adaptation.md +613 -0
- package/examples/check-clip.stillmade.json +4 -1
- package/examples/generate-video.stillmade.json +6 -2
- package/examples/research-topic.stillmade.json +5 -1
- package/examples/text-workflow.stillmade.json +3 -32
- package/examples/timeline-polish.stillmade.json +11 -3
- package/examples/transcribe-audio.stillmade.json +11 -3
- package/package.json +1 -1
- package/packages/block-cli/cli.js +13 -6
- package/packages/block-cli/dev-host/assets/host.js +76 -38
- package/packages/block-cli/dev-host/assets/index.css +1 -1
- package/packages/block-cli/format.js +1 -1
- package/packages/block-cli/templates.js +31 -13
- package/packages/block-cli/type-packages.js +119 -0
- package/packages/block-platform/block-readiness.js +5 -0
- package/packages/block-platform/canvas.js +2 -1
- package/packages/block-platform/catalog.js +27 -48
- package/packages/block-platform/native-host-inventory.js +0 -226
- package/packages/block-platform/plain-descriptions.js +1 -25
- package/packages/block-platform/project-type-starters.js +13 -53
- package/packages/block-platform/script-handoff.js +2 -4
- package/packages/block-platform/type-workspace.js +2 -0
- package/packages/block-sdk/appearance.js +3 -1
- package/packages/block-sdk/block-tier.js +1 -1
- package/packages/block-sdk/builder-contract.js +10 -8
- package/packages/block-sdk/capabilities.js +1 -1
- package/packages/block-sdk/contracts.js +6 -2
- package/packages/block-sdk/first-party-identities.js +1 -84
- package/packages/block-sdk/first-party-packages.js +3 -85
- package/packages/block-sdk/generation-catalog.js +15 -3
- package/packages/block-sdk/index.d.ts +2 -1
- package/packages/block-sdk/media-analysis-example.js +1 -1
- package/packages/block-sdk/mock-host.js +7 -1
- package/packages/block-sdk/module-host-calls.js +35 -10
- package/packages/block-sdk/module-hosted.js +15 -2
- package/packages/block-sdk/module-media-access.js +71 -0
- package/packages/block-sdk/module-node.js +1 -1
- package/packages/block-sdk/portable-media-actions.js +1 -1
- package/packages/block-sdk/runtime.js +1 -1
- package/packages/block-sdk/timeline-proposal-example.js +1 -1
- package/packages/block-sdk/transcription-example.js +1 -1
- package/packages/block-sdk/video-generation-example.js +1 -1
- package/packages/block-sdk/view-bridge.js +4 -1
- package/packages/block-sdk/view-design.js +17 -14
- package/packages/block-sdk/web-example.js +1 -1
- package/packages/design-system/block-kit.css +48 -12
- package/packages/design-system/block-kit.html +3 -2
- package/blocks/mcp-motion-planner/versions/1.1.0/package.js +0 -97
- package/blocks/motion-designer/versions/1.0.1/package.js +0 -173318
- package/blocks/motion-designer/versions/1.0.2/package.js +0 -173318
- package/blocks/motion-frame-review/versions/1.1.1/package.js +0 -465
- package/blocks/motion-frame-review/versions/1.1.2/package.snapshot.js +0 -572
- package/blocks/narration/package.js +0 -1
- package/blocks/narration/versions/1.0.0/package.js +0 -221
- package/blocks/narration/versions/1.0.1/package.js +0 -221
- package/blocks/native/sm.animated-scene/versions/2.0.0/package.js +0 -475
- package/blocks/native/sm.animated-scene/versions/2.1.0/package.js +0 -498
- package/blocks/native/sm.animated-scene/versions/2.2.0/package.js +0 -524
- package/blocks/native/sm.animated-scene/versions/2.3.0/package.js +0 -618
- package/blocks/native/sm.animated-scene/versions/2.3.1/package.js +0 -618
- package/blocks/native/sm.animated-scene/versions/2.3.2/package.js +0 -723
- package/blocks/native/sm.animated-scene/versions/2.3.3/package.js +0 -723
- package/blocks/native/sm.animated-scene/versions/2.3.4/package.js +0 -676
- package/blocks/native/sm.animated-scene/versions/2.3.5/package.js +0 -693
- package/blocks/native/sm.animated-scene/versions/2.3.6/package.js +0 -700
- package/blocks/native/sm.animated-scene/versions/2.3.7/package.js +0 -747
- package/blocks/native/sm.animated-scene/versions/2.3.8/package.js +0 -769
- package/blocks/native/sm.animated-scene/versions/2.3.9/package.js +0 -769
- package/blocks/native/sm.animated-scene-assistant/versions/1.0.0/package.js +0 -183
- package/blocks/native/sm.blueprint/versions/2.0.0/package.js +0 -358
- package/blocks/native/sm.blueprint/versions/2.1.0/package.js +0 -358
- package/blocks/native/sm.blueprint/versions/2.1.1/package.js +0 -358
- package/blocks/native/sm.blueprint/versions/2.1.2/package.js +0 -358
- package/blocks/native/sm.blueprint/versions/2.1.3/package.js +0 -381
- package/blocks/native/sm.blueprint/versions/2.1.4/package.js +0 -381
- package/blocks/native/sm.blueprint/versions/2.1.5/package.js +0 -339
- package/blocks/native/sm.blueprint/versions/2.1.6/package.js +0 -356
- package/blocks/native/sm.blueprint/versions/2.1.7/package.js +0 -363
- package/blocks/native/sm.blueprint/versions/2.1.8/package.js +0 -410
- package/blocks/native/sm.blueprint/versions/2.1.9/package.js +0 -422
- package/blocks/native/sm.blueprint-assistant/versions/1.0.0/package.js +0 -172
- package/blocks/native/sm.chat/versions/2.0.0/package.js +0 -144
- package/blocks/native/sm.chat/versions/2.0.1/package.js +0 -97
- package/blocks/native/sm.chat/versions/2.0.2/package.js +0 -100
- package/blocks/native/sm.chat/versions/2.0.3/package.js +0 -100
- package/blocks/native/sm.continue-if/versions/1.0.0/package.js +0 -168
- package/blocks/native/sm.describe-media/versions/2.0.0/package.js +0 -153
- package/blocks/native/sm.describe-media/versions/2.0.1/package.js +0 -156
- package/blocks/native/sm.describe-media/versions/2.1.0/package.js +0 -140
- package/blocks/native/sm.image-editor/versions/2.0.0/package.js +0 -183
- package/blocks/native/sm.image-editor/versions/2.0.1/package.js +0 -190
- package/blocks/native/sm.new-items/versions/1.0.0/package.js +0 -191
- package/blocks/native/sm.pick-photos/versions/1.0.0/package.js +0 -334
- package/blocks/native/sm.quality-audit/versions/1.0.0/package.js +0 -192
- package/blocks/native/sm.quality-audit/versions/1.0.1/package.js +0 -192
- package/blocks/native/sm.quality-audit/versions/1.0.2/package.js +0 -195
- package/blocks/native/sm.research/versions/2.0.0/package.js +0 -175
- package/blocks/native/sm.research/versions/2.0.1/package.js +0 -184
- package/blocks/native/sm.research/versions/2.0.2/package.js +0 -187
- package/blocks/native/sm.script/versions/2.0.0/package.js +0 -144
- package/blocks/native/sm.script/versions/2.1.0/package.js +0 -144
- package/blocks/native/sm.script/versions/2.1.1/package.js +0 -144
- package/blocks/native/sm.script/versions/2.1.2/package.js +0 -105
- package/blocks/native/sm.script/versions/2.1.3/package.js +0 -152
- package/blocks/native/sm.script/versions/2.1.4/package.js +0 -156
- package/blocks/native/sm.script/versions/2.1.5/package.js +0 -156
- package/blocks/native/sm.shot-plan/versions/2.0.0/package.js +0 -301
- package/blocks/native/sm.shot-plan/versions/2.1.0/package.js +0 -528
- package/blocks/native/sm.shot-plan/versions/2.1.1/package.js +0 -528
- package/blocks/native/sm.shot-plan/versions/2.1.2/package.js +0 -528
- package/blocks/native/sm.shot-plan/versions/2.1.3/package.js +0 -536
- package/blocks/native/sm.shot-plan/versions/2.2.0/package.js +0 -800
- package/blocks/native/sm.shot-plan/versions/2.2.1/package.js +0 -920
- package/blocks/native/sm.shot-plan-assistant/versions/1.0.0/package.js +0 -173
- package/blocks/native/sm.stock-search/versions/2.0.0/package.js +0 -174
- package/blocks/native/sm.thumbnail/versions/2.0.0/package.js +0 -137
- package/blocks/native/sm.thumbnail/versions/2.0.1/package.js +0 -140
- package/blocks/native/sm.transcribe/versions/2.0.0/package.js +0 -163
- package/blocks/native/sm.transcribe/versions/2.0.1/package.js +0 -168
- package/blocks/native/sm.whiteboard-assistant/versions/1.0.0/package.js +0 -175
- package/blocks/native/sm.youtube/versions/2.0.0/package.js +0 -217
- package/blocks/occasion-story/package.js +0 -1
- package/blocks/occasion-story/versions/1.0.0/package.js +0 -1658
- package/blocks/occasion-story/versions/1.0.1/package.js +0 -1699
- package/blocks/occasion-story/versions/1.0.2/package.js +0 -1682
- package/blocks/photo-reel-composer/versions/1.0.0/package.js +0 -3043
- package/blocks/photo-reel-composer/versions/1.0.1/package.js +0 -3026
- package/blocks/photo-reel-composer/versions/1.0.2/package.js +0 -4149
- package/blocks/product-ad-variants/versions/1.0.0/package.js +0 -2911
- package/blocks/product-launch-director/versions/1.0.0/package.js +0 -103
- package/blocks/release-visuals/package.js +0 -1
- package/blocks/release-visuals/versions/1.0.0/package.js +0 -1492
- package/blocks/release-visuals/versions/1.0.1/package.js +0 -1517
- package/blocks/release-visuals/versions/1.0.2/package.js +0 -1500
- package/blocks/screen-recorder/package.js +0 -1
- package/blocks/screen-recorder/versions/1.0.0/package.js +0 -223
- package/blocks/screen-recorder/versions/1.0.1/package.js +0 -223
- package/blocks/short-form-finish/package.js +0 -1
- package/blocks/short-form-finish/versions/1.0.0/package.js +0 -1043
- package/blocks/short-form-finish/versions/1.0.1/package.js +0 -1043
- package/blocks/short-form-finish/versions/1.0.2/package.js +0 -1043
- package/blocks/short-form-finish/versions/1.0.3/package.js +0 -1026
- package/examples/saas-product-launch-reviewed-source.stillmade.json +0 -383
- package/examples/saas-product-launch.stillmade.json +0 -304
- package/packages/block-platform/dealer-inventory-video-project-type.js +0 -38
- package/packages/block-platform/first-revenue-project-types.js +0 -46
- package/packages/block-platform/fixture-starters.js +0 -13
- package/packages/block-platform/launch-project-source.js +0 -10
- package/packages/block-platform/launch-project.js +0 -30
- package/packages/block-platform/motion-project-types.js +0 -55
- package/packages/block-platform/motion-starters.js +0 -14
- package/packages/block-platform/product-ad-variants-project-type.js +0 -30
- package/packages/block-platform/product-launch-updated.js +0 -90
- package/packages/block-platform/revenue-review-project-types.js +0 -36
- package/packages/block-platform/revenue-review-starters.js +0 -13
- package/packages/block-platform/script-writer.js +0 -29
- 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&×tamp<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
|
-
};
|