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
@@ -0,0 +1,400 @@
1
+ # Images and media references
2
+
3
+ Portable references are `{assetId,versionId,kind}`; a reference is not an absolute
4
+ file path. Current pure image operations require a decoded fixture/preview image:
5
+ `{width,height,data:[R,G,B,A,...]}` with 0–255 integer channels, up to 1 megapixel.
6
+ Large production media must use a host media adapter; this SDK does not pretend
7
+ to transcode an arbitrary asset reference. Line thickening uses a square dilation
8
+ kernel and thresholded luminance; it returns a new RGBA image.
9
+
10
+ Connected Project Type previews include a small, temporary media bridge. If an
11
+ image-producing Block returns pixels and the next input accepts an asset,
12
+ StillMade encodes a real PNG data URL in memory and supplies a preview media
13
+ reference. If a later image input receives that same exact generated reference,
14
+ the bridge supplies copied pixels to image-processing code. Original pixel
15
+ outputs remain visible as pixel previews; direct image-to-image connections do
16
+ not need this conversion.
17
+
18
+ This behavior is shared by the browser's connected preview, CLI `preview`, and
19
+ Project Type admission tests. It does not upload media, fetch external URLs, or
20
+ create project assets. Only references generated by that preview session can be
21
+ hydrated; changing their kind, asset/version identity, URL or semantic role fails.
22
+ Optional dimensions and labels may be omitted or changed; the private pixel copy
23
+ remains authoritative. Other references remain
24
+ inert references for the caller's supported host runner. Encoding and private
25
+ cache costs share the existing 4 MB sample budget and preview deadline, so use
26
+ small fixtures. Production execution uses its normal authorized media storage
27
+ and decoding path instead of these temporary references.
28
+
29
+ ## Saved media collections
30
+ Use an `asset[]`, `audio[]` or `video[]` input to collect media files with
31
+ standard controls. Inside a project, these controls upload, select, order and
32
+ remove files without custom host code. Project uploads are saved before the
33
+ input is published, with exact per-file receipts bound to the Block version.
34
+ Compatible direct remixes retain uploaded media. Builder previews use temporary
35
+ local files; upload in a project for durable use. Project controls admit up to
36
+ 64 list entries and 50 MiB per original file, subject to the shared format table.
37
+ The sandbox receives typed references, never upload credentials or local paths.
38
+
39
+ [Import media 2.0.0](https://stillmade.shop/block-sdk/examples/import-media.stillmade-block) is a complete
40
+ portable example. Its owned JavaScript preserves metadata and selection order,
41
+ optionally filters media kinds or removes exact duplicate references, and returns
42
+ an `asset[]` output for subsequent Blocks. It does not transcode media or claim
43
+ rights over user files. Its license covers the original Block implementation.
44
+ Empty selections return an empty list. The native legacy upload node remains
45
+ available to old placements; new SDK placements use the standard sandbox.
46
+
47
+ Validate and test the downloaded archive with the same public CLI:
48
+
49
+ ```sh
50
+ node packages/block-cli/cli.js validate import-media.stillmade-block
51
+ node packages/block-cli/cli.js test import-media.stillmade-block
52
+ node packages/block-cli/cli.js remix import-media.stillmade-block my-import.stillmade-block
53
+ node packages/block-cli/cli.js test my-import.stillmade-block
54
+ ```
55
+
56
+ ### Mandatory host-controlled exports
57
+
58
+ Blocks return typed results or `file-bundle` outputs for StillMade to deliver.
59
+ Do not create download links, invoke save-file pickers, open export destinations,
60
+ or implement a separate export/paywall/referral bypass. The upload admission
61
+ report requires **Host-controlled exports** (`host-export-1`), alongside existing
62
+ sandbox and interface checks. A passing static check is not a delivery receipt.
63
+ StillMade owns the current export policy for all creators; it may add a referral
64
+ step, checkout or other requirement without changing your Block. It can also
65
+ require the StillMade watermark on exports from accounts without a paid plan;
66
+ StillMade draws it while rendering videos and delivering images, so do not add
67
+ your own. Block pricing and export access are separate. Never claim payment or referral completion from
68
+ Block code. Native integrations must declare the host export service and route
69
+ delivery through it; an extracted source folder does not satisfy this boundary.
70
+
71
+ ## Image-processing example
72
+ ```json
73
+ {
74
+ "manifest": {
75
+ "schemaVersion": 1,
76
+ "license": "MIT",
77
+ "provenance": {
78
+ "notice": "MIT License\n\nCopyright (c) 2026 StillMade SDK contributors\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"
79
+ },
80
+ "sdkVersion": "0.1.0",
81
+ "id": "example.thicken-lines",
82
+ "action": {
83
+ "label": "Thicken lines",
84
+ "running": "Thickening lines…"
85
+ },
86
+ "version": "1.0.1",
87
+ "name": "Thicken line art",
88
+ "description": "Expands dark outlines in an image while preserving surrounding colors, creating a new image for the next production step.",
89
+ "kind": "task",
90
+ "runtime": "recipe",
91
+ "inputs": {
92
+ "image": {
93
+ "type": "image",
94
+ "primary": true,
95
+ "semantic": "source_image",
96
+ "required": true,
97
+ "description": "Line-art image whose dark outlines should be expanded."
98
+ },
99
+ "thickness": {
100
+ "type": "integer",
101
+ "default": 2,
102
+ "min": 1,
103
+ "max": 8,
104
+ "semantic": "line_thickness",
105
+ "required": false,
106
+ "description": "Number of pixels by which to expand dark outlines."
107
+ },
108
+ "threshold": {
109
+ "type": "number",
110
+ "default": 100,
111
+ "min": 0,
112
+ "max": 255,
113
+ "semantic": "darkness_threshold",
114
+ "required": false,
115
+ "description": "Brightness threshold used to identify dark outline pixels."
116
+ }
117
+ },
118
+ "outputs": {
119
+ "image": {
120
+ "type": "image",
121
+ "primary": true,
122
+ "semantic": "processed_image",
123
+ "description": "A new image with expanded dark outlines."
124
+ }
125
+ },
126
+ "permissions": {
127
+ "project": [],
128
+ "network": [],
129
+ "filesystem": [],
130
+ "secrets": []
131
+ },
132
+ "ui": [
133
+ {
134
+ "control": "asset",
135
+ "port": "image"
136
+ },
137
+ {
138
+ "control": "slider",
139
+ "port": "thickness"
140
+ },
141
+ {
142
+ "control": "slider",
143
+ "port": "threshold"
144
+ }
145
+ ]
146
+ },
147
+ "recipe": {
148
+ "schemaVersion": 1,
149
+ "steps": [
150
+ {
151
+ "id": "outlines",
152
+ "op": "image.thicken-lines",
153
+ "args": {
154
+ "image": {
155
+ "$input": "image"
156
+ },
157
+ "thickness": {
158
+ "$input": "thickness"
159
+ },
160
+ "threshold": {
161
+ "$input": "threshold"
162
+ }
163
+ }
164
+ }
165
+ ],
166
+ "outputs": {
167
+ "image": {
168
+ "$step": "outlines"
169
+ }
170
+ }
171
+ },
172
+ "tests": [
173
+ {
174
+ "name": "One dark point expands to a 3×3 square",
175
+ "input": {
176
+ "image": {
177
+ "width": 5,
178
+ "height": 5,
179
+ "data": [
180
+ 255,
181
+ 255,
182
+ 255,
183
+ 255,
184
+ 255,
185
+ 255,
186
+ 255,
187
+ 255,
188
+ 255,
189
+ 255,
190
+ 255,
191
+ 255,
192
+ 255,
193
+ 255,
194
+ 255,
195
+ 255,
196
+ 255,
197
+ 255,
198
+ 255,
199
+ 255,
200
+ 255,
201
+ 255,
202
+ 255,
203
+ 255,
204
+ 255,
205
+ 255,
206
+ 255,
207
+ 255,
208
+ 255,
209
+ 255,
210
+ 255,
211
+ 255,
212
+ 255,
213
+ 255,
214
+ 255,
215
+ 255,
216
+ 255,
217
+ 255,
218
+ 255,
219
+ 255,
220
+ 255,
221
+ 255,
222
+ 255,
223
+ 255,
224
+ 255,
225
+ 255,
226
+ 255,
227
+ 255,
228
+ 0,
229
+ 0,
230
+ 0,
231
+ 255,
232
+ 255,
233
+ 255,
234
+ 255,
235
+ 255,
236
+ 255,
237
+ 255,
238
+ 255,
239
+ 255,
240
+ 255,
241
+ 255,
242
+ 255,
243
+ 255,
244
+ 255,
245
+ 255,
246
+ 255,
247
+ 255,
248
+ 255,
249
+ 255,
250
+ 255,
251
+ 255,
252
+ 255,
253
+ 255,
254
+ 255,
255
+ 255,
256
+ 255,
257
+ 255,
258
+ 255,
259
+ 255,
260
+ 255,
261
+ 255,
262
+ 255,
263
+ 255,
264
+ 255,
265
+ 255,
266
+ 255,
267
+ 255,
268
+ 255,
269
+ 255,
270
+ 255,
271
+ 255,
272
+ 255,
273
+ 255,
274
+ 255,
275
+ 255,
276
+ 255,
277
+ 255,
278
+ 255,
279
+ 255
280
+ ]
281
+ },
282
+ "thickness": 1
283
+ },
284
+ "expected": {
285
+ "image": {
286
+ "width": 5,
287
+ "height": 5,
288
+ "data": [
289
+ 255,
290
+ 255,
291
+ 255,
292
+ 255,
293
+ 255,
294
+ 255,
295
+ 255,
296
+ 255,
297
+ 255,
298
+ 255,
299
+ 255,
300
+ 255,
301
+ 255,
302
+ 255,
303
+ 255,
304
+ 255,
305
+ 255,
306
+ 255,
307
+ 255,
308
+ 255,
309
+ 255,
310
+ 255,
311
+ 255,
312
+ 255,
313
+ 0,
314
+ 0,
315
+ 0,
316
+ 255,
317
+ 0,
318
+ 0,
319
+ 0,
320
+ 255,
321
+ 0,
322
+ 0,
323
+ 0,
324
+ 255,
325
+ 255,
326
+ 255,
327
+ 255,
328
+ 255,
329
+ 255,
330
+ 255,
331
+ 255,
332
+ 255,
333
+ 0,
334
+ 0,
335
+ 0,
336
+ 255,
337
+ 0,
338
+ 0,
339
+ 0,
340
+ 255,
341
+ 0,
342
+ 0,
343
+ 0,
344
+ 255,
345
+ 255,
346
+ 255,
347
+ 255,
348
+ 255,
349
+ 255,
350
+ 255,
351
+ 255,
352
+ 255,
353
+ 0,
354
+ 0,
355
+ 0,
356
+ 255,
357
+ 0,
358
+ 0,
359
+ 0,
360
+ 255,
361
+ 0,
362
+ 0,
363
+ 0,
364
+ 255,
365
+ 255,
366
+ 255,
367
+ 255,
368
+ 255,
369
+ 255,
370
+ 255,
371
+ 255,
372
+ 255,
373
+ 255,
374
+ 255,
375
+ 255,
376
+ 255,
377
+ 255,
378
+ 255,
379
+ 255,
380
+ 255,
381
+ 255,
382
+ 255,
383
+ 255,
384
+ 255,
385
+ 255,
386
+ 255,
387
+ 255,
388
+ 255
389
+ ]
390
+ }
391
+ }
392
+ }
393
+ ]
394
+ }
395
+ ```
396
+
397
+ ## Host boundary
398
+ The host resolves a selected image into RGBA before execution and stores accepted output as a new media version. A guest receives no filesystem path or network access. Large files require an explicit host-side conversion or resized copy.
399
+
400
+ See [batch execution](../project-types/batches.md) for whole-scene and project-wide processing.
@@ -0,0 +1,106 @@
1
+ # Mobile-compatible Block UI
2
+
3
+ # Mobile-compatible Block UI
4
+
5
+ Build one Block contract for every size. Inputs, outputs, state, actions,
6
+ permissions, and runtime do not change when the interface becomes compact.
7
+ StillMade reorganizes standard controls automatically and keeps custom views in
8
+ the existing opaque sandbox.
9
+
10
+ ## Standard UI
11
+
12
+ Prefer `manifest.ui` and `manifest.uiLayout`. The host owns field sizing, focus,
13
+ touch targets, stacked preview/results, tab overflow, safe-area spacing, and
14
+ software-keyboard behavior. Use `uiLayout` only to group complete inputs and
15
+ outputs; do not create a second mobile manifest or split an editor into tiny
16
+ Blocks.
17
+
18
+ Tabs and sections must retain every essential input and output. A compact layout
19
+ may put secondary tools behind a labelled section or sheet, but the primary
20
+ action and focused field must remain reachable. Resizing the preview does not run
21
+ the Block and must not reset its values, selection, state, progress, or result.
22
+
23
+ ## Custom UI
24
+
25
+ Custom HTML, CSS, and JavaScript continue to use `view` and `StillMade.run`.
26
+ Design from the view container rather than a device name:
27
+
28
+ ```css
29
+ .workspace { container: block-workspace / inline-size; min-width: 0; }
30
+ .layout { display: grid; grid-template-columns: minmax(0, 2fr) minmax(240px, 1fr); }
31
+ @container block-workspace (max-width: 600px) {
32
+ .layout { grid-template-columns: minmax(0, 1fr); }
33
+ }
34
+ ```
35
+
36
+ The sandbox supplies viewport-fit, safe-area padding, readable form defaults,
37
+ 44-pixel ordinary controls, media containment, and focus styling. Authored CSS
38
+ still owns specialized workspace layout. A 320 CSS-pixel phone viewport leaves
39
+ less than 320 pixels inside the host's preview gutters. Size from the embedded
40
+ view's actual container, avoid a 320-pixel minimum width, wrap long labels, and
41
+ isolate intentional canvas/timeline panning from
42
+ the surrounding toolbar. A `<video controls>` gets StillMade's player, whose
43
+ 44-pixel controls a tap shows for 3 seconds (a first tap never starts playback),
44
+ and a result picture's full-screen button shows for 3 seconds after a tap on it. Provide visible buttons or menus for actions otherwise
45
+ available by hover, drag, right-click, or keyboard shortcut. Label fields and
46
+ announce loading, errors, and completed output with `role="status"`,
47
+ `role="alert"`, or `aria-live` as appropriate. For deterministic custom-view
48
+ checks, set `data-stillmade-state="loading"`, `"error"`, or `"success"` on the
49
+ visible result area as each state occurs. The browser profile runs the local
50
+ success fixture, then injects a local executor failure to exercise the same
51
+ view's error path without calling a provider. Standard controls receive the
52
+ same failure and must show their error result. A permanently mounted live region
53
+ does not demonstrate that an error was actually shown. If the test never
54
+ reaches a state, phone support remains unverified rather than inferred.
55
+
56
+ The maintained `examples/custom-interface.stillmade.json` demonstrates one
57
+ custom workspace whose settings and result stack from the same state and action
58
+ contract.
59
+
60
+ For deterministic browser checks, mark a custom form control with
61
+ `data-stillmade-input="portName"` so the phone profile can enter the package's
62
+ test fixture through the real UI before pressing its run action. This marker
63
+ does not change the Block's input contract or grant access to host services.
64
+ For a text-bearing object fixture such as `{brief:{text:"…"}}`, the profile
65
+ enters its `text` into the marked text field, then presses the button marked
66
+ `data-stillmade-action="run"` (or the view's only button). Every button carries
67
+ `data-stillmade-action` so Chat can press it: `run` on the button that runs the
68
+ Block, and what it does on every other button (`data-stillmade-action="play sample"`).
69
+ The existing `data-stillmade-share` marker is also recognized for shared text
70
+ fields. A custom view without a reachable mapped control must not be counted
71
+ as having passed its fixture's success interaction.
72
+
73
+ ## Preview and authoritative validation
74
+
75
+ The Create preview includes Compact (320), Phone (390), Tablet (768), phone
76
+ landscape (844 × 390), and Desktop (1280) container presets. Changing a preset
77
+ only changes available space. Its quick check helps find immediate host overflow
78
+ and small touch targets; imported and published packages still run the
79
+ authoritative profile in the real Block/Project Type host.
80
+
81
+ The SDK `testPlatforms` gate records the exact package digest plus SDK, renderer,
82
+ and check versions. A trusted browser adapter covers Light, Dark, and White at
83
+ 320, 390, 768, 1280, and phone landscape. It checks the main touch task, empty,
84
+ populated, loading, error, success, long-label and enlarged-text states, and
85
+ continuity through resize/rotation and panel toggles. Custom views must visibly
86
+ enter each claimed state during the check; source markup alone is not evidence
87
+ of a working error path. Fixture execution is local
88
+ or mocked; the mobile UI profile never authorizes a provider call or spends
89
+ credits.
90
+
91
+ Reports supplied inside a package are ignored. A changed package or changed
92
+ renderer/check version needs a new report. Failures name the affected view,
93
+ control, and CSS size and remain repairable in draft preview. Passing the profile
94
+ does not make an unavailable desktop binary, local GPU, provider, or credential
95
+ available on a phone; runtime capability checks remain separate.
96
+
97
+ For a local preview build, `node scripts/platform-tests/run.mjs --engine=chromium --require-complete` uses that same trusted embedded profile
98
+ and saves per-size captures and a digest-bound report. Firefox and WebKit runs
99
+ are exploratory layout checks; they cannot supply the profile's state and
100
+ continuity evidence. A report from any local command does not grant a
101
+ Marketplace support claim or replace StillMade's server-owned import review.
102
+
103
+ Before public release, StillMade also smoke-tests representative shared UI in
104
+ real iOS Safari and Android Chrome. Gesture-heavy custom editors require a
105
+ focused real-device check. Those operational checks complement the deterministic
106
+ gate; they are not inferred from an author claim.