stillmade-sdk 0.1.42 → 0.1.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/.stillmade/sdk-baseline.json +6 -8
  2. package/AGENTS.md +15 -10
  3. package/FRAME_VIEWS.md +113 -0
  4. package/INTERFACE_DESIGN.md +62 -22
  5. package/MOBILE_UI.md +4 -2
  6. package/MODULES.md +152 -6
  7. package/PASTE_TO_LLM.md +35 -25
  8. package/README.md +3 -2
  9. package/SDK.md +994 -550
  10. package/UI_AESTHETIC.md +22 -2
  11. package/blocks/generate/package.js +1 -0
  12. package/blocks/generate/versions/1.0.0/package.js +463 -0
  13. package/docs/build/audio-to-editor.md +36 -0
  14. package/docs/build/block-builder-contract.md +150 -0
  15. package/docs/build/comfyui.md +227 -0
  16. package/docs/build/concepts.md +40 -0
  17. package/docs/build/context.md +159 -0
  18. package/docs/build/cookbook.md +57 -0
  19. package/docs/build/custom-interface.md +617 -0
  20. package/docs/build/data-types.md +83 -0
  21. package/docs/build/frame-views.md +259 -0
  22. package/docs/build/generate-media.md +59 -0
  23. package/docs/build/github-applications.md +314 -0
  24. package/docs/build/hosted-images.md +214 -0
  25. package/docs/build/hosted-music.md +39 -0
  26. package/docs/build/hosted-speech.md +157 -0
  27. package/docs/build/hosted-text.md +246 -0
  28. package/docs/build/image-description.md +49 -0
  29. package/docs/build/interface-design.md +343 -0
  30. package/docs/build/javascript.md +63 -0
  31. package/docs/build/local-preview.md +61 -0
  32. package/docs/build/media-analysis.md +27 -0
  33. package/docs/build/media.md +400 -0
  34. package/docs/build/mobile-ui.md +106 -0
  35. package/docs/build/modules.md +487 -0
  36. package/docs/build/original-blocks.md +70 -0
  37. package/docs/build/outside-apis.md +128 -0
  38. package/docs/build/production-context-templates.md +12 -0
  39. package/docs/build/project-storage.md +94 -0
  40. package/docs/build/quickstart.md +48 -0
  41. package/docs/build/recipes.md +103 -0
  42. package/docs/build/script-handoff.md +45 -0
  43. package/docs/build/script-writer.md +34 -0
  44. package/docs/build/state.md +223 -0
  45. package/docs/build/testing.md +112 -0
  46. package/docs/build/timeline-edits.md +116 -0
  47. package/docs/build/timeline-proposals.md +76 -0
  48. package/docs/build/transcription.md +59 -0
  49. package/docs/build/triggers.md +59 -0
  50. package/docs/build/tutorial.md +52 -0
  51. package/docs/build/typescript.md +34 -0
  52. package/docs/build/video-generation.md +61 -0
  53. package/docs/build/web-reading.md +37 -0
  54. package/docs/build/with-your-ai.md +27 -0
  55. package/docs/changelog.md +9 -0
  56. package/docs/creators.md +21 -0
  57. package/docs/distribute/discovery.md +43 -0
  58. package/docs/distribute/imports.md +58 -0
  59. package/docs/distribute/publishing.md +29 -0
  60. package/docs/distribute/sdk-versions.md +36 -0
  61. package/docs/distribute/selling.md +14 -0
  62. package/docs/distribute/teams.md +60 -0
  63. package/docs/distribute/versioning.md +28 -0
  64. package/docs/examples.md +23 -0
  65. package/docs/gallery.md +26 -0
  66. package/docs/index.md +50 -0
  67. package/docs/native-mcp.md +307 -0
  68. package/docs/project-types/automation.md +43 -0
  69. package/docs/project-types/batches.md +50 -0
  70. package/docs/project-types/build.md +42 -0
  71. package/docs/project-types/completion.md +15 -0
  72. package/docs/project-types/conditions.md +21 -0
  73. package/docs/project-types/hosted-review.md +115 -0
  74. package/docs/project-types/onboarding.md +75 -0
  75. package/docs/project-types/running.md +309 -0
  76. package/docs/project-types/testing.md +72 -0
  77. package/docs/reference/application-artifacts.md +87 -0
  78. package/docs/reference/authoring-guide.md +134 -0
  79. package/docs/reference/browser-applications.md +267 -0
  80. package/docs/reference/capabilities.md +45 -0
  81. package/docs/reference/cli.md +71 -0
  82. package/docs/reference/connection-api.md +59 -0
  83. package/docs/reference/cooperative-jobs.md +13 -0
  84. package/docs/reference/desktop-capabilities.md +172 -0
  85. package/docs/reference/desktop-execution.md +77 -0
  86. package/docs/reference/errors.md +233 -0
  87. package/docs/reference/execution.md +800 -0
  88. package/docs/reference/first-party-blocks.md +40 -0
  89. package/docs/reference/generation-models.md +59 -0
  90. package/docs/reference/limits.md +306 -0
  91. package/docs/reference/manifest-kinds-controls.md +36 -0
  92. package/docs/reference/manifest.md +181 -0
  93. package/docs/reference/operations.md +36 -0
  94. package/docs/reference/package-jobs.md +35 -0
  95. package/docs/reference/parity.md +55 -0
  96. package/docs/reference/permissions.md +86 -0
  97. package/docs/reference/ports.md +26 -0
  98. package/docs/reference/types.md +268 -0
  99. package/docs/reference/universal-resolver.md +303 -0
  100. package/docs/reference/view-bridge.md +60 -0
  101. package/docs/reference/view-rules.md +15 -0
  102. package/docs/reference/workspace-sync.md +25 -0
  103. package/docs/sdk.md +34 -0
  104. package/docs/tools/block-remix.md +211 -0
  105. package/docs/tools/llm.md +2213 -0
  106. package/docs/tools/repository-adaptation.md +613 -0
  107. package/examples/check-clip.stillmade.json +4 -1
  108. package/examples/generate-video.stillmade.json +6 -2
  109. package/examples/research-topic.stillmade.json +5 -1
  110. package/examples/text-workflow.stillmade.json +3 -32
  111. package/examples/timeline-polish.stillmade.json +11 -3
  112. package/examples/transcribe-audio.stillmade.json +11 -3
  113. package/package.json +1 -1
  114. package/packages/block-cli/cli.js +13 -6
  115. package/packages/block-cli/dev-host/assets/host.js +76 -38
  116. package/packages/block-cli/dev-host/assets/index.css +1 -1
  117. package/packages/block-cli/format.js +1 -1
  118. package/packages/block-cli/templates.js +31 -13
  119. package/packages/block-cli/type-packages.js +119 -0
  120. package/packages/block-platform/block-readiness.js +5 -0
  121. package/packages/block-platform/canvas.js +2 -1
  122. package/packages/block-platform/catalog.js +27 -48
  123. package/packages/block-platform/native-host-inventory.js +0 -226
  124. package/packages/block-platform/plain-descriptions.js +1 -25
  125. package/packages/block-platform/project-type-starters.js +13 -53
  126. package/packages/block-platform/script-handoff.js +2 -4
  127. package/packages/block-platform/type-workspace.js +2 -0
  128. package/packages/block-sdk/appearance.js +3 -1
  129. package/packages/block-sdk/block-tier.js +1 -1
  130. package/packages/block-sdk/builder-contract.js +10 -8
  131. package/packages/block-sdk/capabilities.js +1 -1
  132. package/packages/block-sdk/contracts.js +6 -2
  133. package/packages/block-sdk/first-party-identities.js +1 -84
  134. package/packages/block-sdk/first-party-packages.js +3 -85
  135. package/packages/block-sdk/generation-catalog.js +15 -3
  136. package/packages/block-sdk/index.d.ts +2 -1
  137. package/packages/block-sdk/media-analysis-example.js +1 -1
  138. package/packages/block-sdk/mock-host.js +7 -1
  139. package/packages/block-sdk/module-host-calls.js +35 -10
  140. package/packages/block-sdk/module-hosted.js +15 -2
  141. package/packages/block-sdk/module-media-access.js +71 -0
  142. package/packages/block-sdk/module-node.js +1 -1
  143. package/packages/block-sdk/portable-media-actions.js +1 -1
  144. package/packages/block-sdk/runtime.js +1 -1
  145. package/packages/block-sdk/timeline-proposal-example.js +1 -1
  146. package/packages/block-sdk/transcription-example.js +1 -1
  147. package/packages/block-sdk/video-generation-example.js +1 -1
  148. package/packages/block-sdk/view-bridge.js +4 -1
  149. package/packages/block-sdk/view-design.js +17 -14
  150. package/packages/block-sdk/web-example.js +1 -1
  151. package/packages/design-system/block-kit.css +48 -12
  152. package/packages/design-system/block-kit.html +3 -2
  153. package/blocks/mcp-motion-planner/versions/1.1.0/package.js +0 -97
  154. package/blocks/motion-designer/versions/1.0.1/package.js +0 -173318
  155. package/blocks/motion-designer/versions/1.0.2/package.js +0 -173318
  156. package/blocks/motion-frame-review/versions/1.1.1/package.js +0 -465
  157. package/blocks/motion-frame-review/versions/1.1.2/package.snapshot.js +0 -572
  158. package/blocks/narration/package.js +0 -1
  159. package/blocks/narration/versions/1.0.0/package.js +0 -221
  160. package/blocks/narration/versions/1.0.1/package.js +0 -221
  161. package/blocks/native/sm.animated-scene/versions/2.0.0/package.js +0 -475
  162. package/blocks/native/sm.animated-scene/versions/2.1.0/package.js +0 -498
  163. package/blocks/native/sm.animated-scene/versions/2.2.0/package.js +0 -524
  164. package/blocks/native/sm.animated-scene/versions/2.3.0/package.js +0 -618
  165. package/blocks/native/sm.animated-scene/versions/2.3.1/package.js +0 -618
  166. package/blocks/native/sm.animated-scene/versions/2.3.2/package.js +0 -723
  167. package/blocks/native/sm.animated-scene/versions/2.3.3/package.js +0 -723
  168. package/blocks/native/sm.animated-scene/versions/2.3.4/package.js +0 -676
  169. package/blocks/native/sm.animated-scene/versions/2.3.5/package.js +0 -693
  170. package/blocks/native/sm.animated-scene/versions/2.3.6/package.js +0 -700
  171. package/blocks/native/sm.animated-scene/versions/2.3.7/package.js +0 -747
  172. package/blocks/native/sm.animated-scene/versions/2.3.8/package.js +0 -769
  173. package/blocks/native/sm.animated-scene/versions/2.3.9/package.js +0 -769
  174. package/blocks/native/sm.animated-scene-assistant/versions/1.0.0/package.js +0 -183
  175. package/blocks/native/sm.blueprint/versions/2.0.0/package.js +0 -358
  176. package/blocks/native/sm.blueprint/versions/2.1.0/package.js +0 -358
  177. package/blocks/native/sm.blueprint/versions/2.1.1/package.js +0 -358
  178. package/blocks/native/sm.blueprint/versions/2.1.2/package.js +0 -358
  179. package/blocks/native/sm.blueprint/versions/2.1.3/package.js +0 -381
  180. package/blocks/native/sm.blueprint/versions/2.1.4/package.js +0 -381
  181. package/blocks/native/sm.blueprint/versions/2.1.5/package.js +0 -339
  182. package/blocks/native/sm.blueprint/versions/2.1.6/package.js +0 -356
  183. package/blocks/native/sm.blueprint/versions/2.1.7/package.js +0 -363
  184. package/blocks/native/sm.blueprint/versions/2.1.8/package.js +0 -410
  185. package/blocks/native/sm.blueprint/versions/2.1.9/package.js +0 -422
  186. package/blocks/native/sm.blueprint-assistant/versions/1.0.0/package.js +0 -172
  187. package/blocks/native/sm.chat/versions/2.0.0/package.js +0 -144
  188. package/blocks/native/sm.chat/versions/2.0.1/package.js +0 -97
  189. package/blocks/native/sm.chat/versions/2.0.2/package.js +0 -100
  190. package/blocks/native/sm.chat/versions/2.0.3/package.js +0 -100
  191. package/blocks/native/sm.continue-if/versions/1.0.0/package.js +0 -168
  192. package/blocks/native/sm.describe-media/versions/2.0.0/package.js +0 -153
  193. package/blocks/native/sm.describe-media/versions/2.0.1/package.js +0 -156
  194. package/blocks/native/sm.describe-media/versions/2.1.0/package.js +0 -140
  195. package/blocks/native/sm.image-editor/versions/2.0.0/package.js +0 -183
  196. package/blocks/native/sm.image-editor/versions/2.0.1/package.js +0 -190
  197. package/blocks/native/sm.new-items/versions/1.0.0/package.js +0 -191
  198. package/blocks/native/sm.pick-photos/versions/1.0.0/package.js +0 -334
  199. package/blocks/native/sm.quality-audit/versions/1.0.0/package.js +0 -192
  200. package/blocks/native/sm.quality-audit/versions/1.0.1/package.js +0 -192
  201. package/blocks/native/sm.quality-audit/versions/1.0.2/package.js +0 -195
  202. package/blocks/native/sm.research/versions/2.0.0/package.js +0 -175
  203. package/blocks/native/sm.research/versions/2.0.1/package.js +0 -184
  204. package/blocks/native/sm.research/versions/2.0.2/package.js +0 -187
  205. package/blocks/native/sm.script/versions/2.0.0/package.js +0 -144
  206. package/blocks/native/sm.script/versions/2.1.0/package.js +0 -144
  207. package/blocks/native/sm.script/versions/2.1.1/package.js +0 -144
  208. package/blocks/native/sm.script/versions/2.1.2/package.js +0 -105
  209. package/blocks/native/sm.script/versions/2.1.3/package.js +0 -152
  210. package/blocks/native/sm.script/versions/2.1.4/package.js +0 -156
  211. package/blocks/native/sm.script/versions/2.1.5/package.js +0 -156
  212. package/blocks/native/sm.shot-plan/versions/2.0.0/package.js +0 -301
  213. package/blocks/native/sm.shot-plan/versions/2.1.0/package.js +0 -528
  214. package/blocks/native/sm.shot-plan/versions/2.1.1/package.js +0 -528
  215. package/blocks/native/sm.shot-plan/versions/2.1.2/package.js +0 -528
  216. package/blocks/native/sm.shot-plan/versions/2.1.3/package.js +0 -536
  217. package/blocks/native/sm.shot-plan/versions/2.2.0/package.js +0 -800
  218. package/blocks/native/sm.shot-plan/versions/2.2.1/package.js +0 -920
  219. package/blocks/native/sm.shot-plan-assistant/versions/1.0.0/package.js +0 -173
  220. package/blocks/native/sm.stock-search/versions/2.0.0/package.js +0 -174
  221. package/blocks/native/sm.thumbnail/versions/2.0.0/package.js +0 -137
  222. package/blocks/native/sm.thumbnail/versions/2.0.1/package.js +0 -140
  223. package/blocks/native/sm.transcribe/versions/2.0.0/package.js +0 -163
  224. package/blocks/native/sm.transcribe/versions/2.0.1/package.js +0 -168
  225. package/blocks/native/sm.whiteboard-assistant/versions/1.0.0/package.js +0 -175
  226. package/blocks/native/sm.youtube/versions/2.0.0/package.js +0 -217
  227. package/blocks/occasion-story/package.js +0 -1
  228. package/blocks/occasion-story/versions/1.0.0/package.js +0 -1658
  229. package/blocks/occasion-story/versions/1.0.1/package.js +0 -1699
  230. package/blocks/occasion-story/versions/1.0.2/package.js +0 -1682
  231. package/blocks/photo-reel-composer/versions/1.0.0/package.js +0 -3043
  232. package/blocks/photo-reel-composer/versions/1.0.1/package.js +0 -3026
  233. package/blocks/photo-reel-composer/versions/1.0.2/package.js +0 -4149
  234. package/blocks/product-ad-variants/versions/1.0.0/package.js +0 -2911
  235. package/blocks/product-launch-director/versions/1.0.0/package.js +0 -103
  236. package/blocks/release-visuals/package.js +0 -1
  237. package/blocks/release-visuals/versions/1.0.0/package.js +0 -1492
  238. package/blocks/release-visuals/versions/1.0.1/package.js +0 -1517
  239. package/blocks/release-visuals/versions/1.0.2/package.js +0 -1500
  240. package/blocks/screen-recorder/package.js +0 -1
  241. package/blocks/screen-recorder/versions/1.0.0/package.js +0 -223
  242. package/blocks/screen-recorder/versions/1.0.1/package.js +0 -223
  243. package/blocks/short-form-finish/package.js +0 -1
  244. package/blocks/short-form-finish/versions/1.0.0/package.js +0 -1043
  245. package/blocks/short-form-finish/versions/1.0.1/package.js +0 -1043
  246. package/blocks/short-form-finish/versions/1.0.2/package.js +0 -1043
  247. package/blocks/short-form-finish/versions/1.0.3/package.js +0 -1026
  248. package/examples/saas-product-launch-reviewed-source.stillmade.json +0 -383
  249. package/examples/saas-product-launch.stillmade.json +0 -304
  250. package/packages/block-platform/dealer-inventory-video-project-type.js +0 -38
  251. package/packages/block-platform/first-revenue-project-types.js +0 -46
  252. package/packages/block-platform/fixture-starters.js +0 -13
  253. package/packages/block-platform/launch-project-source.js +0 -10
  254. package/packages/block-platform/launch-project.js +0 -30
  255. package/packages/block-platform/motion-project-types.js +0 -55
  256. package/packages/block-platform/motion-starters.js +0 -14
  257. package/packages/block-platform/product-ad-variants-project-type.js +0 -30
  258. package/packages/block-platform/product-launch-updated.js +0 -90
  259. package/packages/block-platform/revenue-review-project-types.js +0 -36
  260. package/packages/block-platform/revenue-review-starters.js +0 -13
  261. package/packages/block-platform/script-writer.js +0 -29
  262. package/packages/block-platform/website-source-block.js +0 -14
@@ -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.