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.
- 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
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"examples/camera-recorder.stillmade.json": "8d8224b319e94e4afec3551445404ae99eae8c4d6df176ca7538bb0472f426b6",
|
|
6
6
|
"examples/caption-from-text.stillmade.json": "3731a15b59043fbebee98416f2474800ef0154aa7873fb494934874ddcd2c705",
|
|
7
7
|
"examples/captions.stillmade-block": "b0fde32dddaf866f3e540018309aaa00ae56b0e74a53a498fbaf1553ce200bd6",
|
|
8
|
-
"examples/check-clip.stillmade.json": "
|
|
8
|
+
"examples/check-clip.stillmade.json": "1b666fc62b327d49ad6d35240ba3a7718d1f19bede9762e8eb41d8eb0ae7efc7",
|
|
9
9
|
"examples/clean-text.stillmade.json": "973a688879d51f7cf6c86c3a0698b68489e20946a7d28d234944f22548d24ed3",
|
|
10
10
|
"examples/comfy-invert.stillmade.json": "126bd3a8a88e14c08ae11c62a441ed099d83e16830e2062f936e14e56cb297eb",
|
|
11
11
|
"examples/comfy-text-to-image.stillmade.json": "957a616887115984c1888cf9c0eee2fe771dcbf041166ad112fb6c3feb7ad4dd",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"examples/export-timeline.stillmade-block": "7d3221dc3ec1491f420773edb0ad8612c650755111e1e8561510b68508976199",
|
|
23
23
|
"examples/foley-cue.stillmade.json": "b579a73066cf65f6da2fba48c1965af83bc4325890643470229fd1c842470fc7",
|
|
24
24
|
"examples/generate-image.stillmade.json": "81feffcda94f6e9f3c5c503d83e0ca6ffa5cefa118e44f4a3751d2a925ca9680",
|
|
25
|
-
"examples/generate-video.stillmade.json": "
|
|
25
|
+
"examples/generate-video.stillmade.json": "bc860d8e84dd9b1a179f516609ad0e101e467c3b9e08844b2add8cf6bb0813eb",
|
|
26
26
|
"examples/grayscale.stillmade.json": "8c901790c25d2544f284a6a43341f72aa6b7e9211bef272b2e1d53c92b9e5faf",
|
|
27
27
|
"examples/import-media.stillmade-block": "e9642e203080f1a145bec81871525a670f98dd1c8763862f81ab876fb15a656b",
|
|
28
28
|
"examples/javascript-cloze-quiz": "b36a370c8b53250b9bb04783591661268ec674052bc13bf8cc8910fa27151f83",
|
|
@@ -45,20 +45,18 @@
|
|
|
45
45
|
"examples/portable-regexp.stillmade-block": "04975bba1c0d719044ee41d6e0c58d73671c347f6b4ac16ba665bf5410116535",
|
|
46
46
|
"examples/portable-regexp.stillmade.json": "fd769d584a6437e2a37c7e4101a031c0fef740afc76ef91f2337e2956fb08a1a",
|
|
47
47
|
"examples/quieter-clips.stillmade.json": "23b026b267e5da522cc6a3a6af51e166a64fcc1d5391e855704fe1e1f243401b",
|
|
48
|
-
"examples/research-topic.stillmade.json": "
|
|
49
|
-
"examples/saas-product-launch-reviewed-source.stillmade.json": "2ec264a160faba338f3924965f935ce92c3fdad1fb69719921d7561353b010ab",
|
|
50
|
-
"examples/saas-product-launch.stillmade.json": "aabec7d8680ef6687980296ab170bbb002c0dc81bc15edebdf9db9750e43eddb",
|
|
48
|
+
"examples/research-topic.stillmade.json": "2ae52cdb416ea2a9d19a0dd187433d415d9361a068382b279b71af9064b1bf60",
|
|
51
49
|
"examples/scene-shots.stillmade.json": "d10a0aebb42ff090035410dc92ab708ffaf50b579edac4aa2f2cf6150b3ef537",
|
|
52
50
|
"examples/score-a-scene.stillmade.json": "6059f2f65c48309f0c1711dbb6b5ee62a957ce07502a936f53b29685b425f8ec",
|
|
53
51
|
"examples/screen-recorder.stillmade.json": "f3509a577cdd6615d6687ed0be108ddef51bf1f79ff0e2176470e46c3054640d",
|
|
54
52
|
"examples/script-draft.stillmade.json": "3e8fc6e164c7b02f5f07ceb9771159e88252d405fa96a19107427e85c0457608",
|
|
55
53
|
"examples/shot-readiness.stillmade.json": "ed73fe9038afaed7c12435368e90001f0bd3cebd8f0e6fe06508c1bb80c8cb7e",
|
|
56
54
|
"examples/summarize-page.stillmade.json": "21f8be251733d1c236328f23fa0da6b4e5381d34374489926db61bdd54f3b75f",
|
|
57
|
-
"examples/text-workflow.stillmade.json": "
|
|
55
|
+
"examples/text-workflow.stillmade.json": "1e3affc58719df116dd09ee3357faba5d90b22dceb6e38551e78a7a3291f8c7f",
|
|
58
56
|
"examples/thicken-lines.stillmade.json": "287c872d44a18b8c7f79fb2d4047c78a54c1f2b315bd6ce4c1340d4e54d87dac",
|
|
59
57
|
"examples/timeline-mixer.stillmade.json": "93220984a88ca553dcf7102ce82b23d16eadda07809a89222a8589506743b5f8",
|
|
60
|
-
"examples/timeline-polish.stillmade.json": "
|
|
61
|
-
"examples/transcribe-audio.stillmade.json": "
|
|
58
|
+
"examples/timeline-polish.stillmade.json": "6d4c62456bc1a3a4d198214f8029256c6532013d4dabb0be8445b209a42f760b",
|
|
59
|
+
"examples/transcribe-audio.stillmade.json": "62bb4365c24d17a64465bebc2504d4eda3c0498201e86f75c2e8e635fc40be14",
|
|
62
60
|
"examples/view-react-chart": "a0e7ef5148e386b34e405187761d23f1739809c3d72c68c7c6b4e2193747218e",
|
|
63
61
|
"examples/word-count.stillmade.json": "b815282e2dcd2827952e4a8bde403c5935141a98b9d54ee055da2b9d55cb43eb"
|
|
64
62
|
}
|
package/AGENTS.md
CHANGED
|
@@ -26,19 +26,20 @@ Pick the runtime from the job. No hosted AI: a recipe or isolated `javascript`,
|
|
|
26
26
|
|
|
27
27
|
## One job per Step
|
|
28
28
|
|
|
29
|
-
A Step is one job: the work between two moments where a person or the outside world must see the result. Start a new Step only at one of
|
|
29
|
+
A Step is one job: the work between two moments where a person or the outside world must see the result. A guided job, one the person fills in and then gets a result from, is one Step with one Block whose own screen holds everything: the inputs and settings, then a cheap check before the expensive run (the script and a voice sample before the video), then the result. On a wide screen the inputs sit on the left and the result's place on the right; on a phone they stack, the result's place under the button. A cheap check or a review the person does on that screen never starts a new Step. Start a new Step only at one of these points; everything else is a part of the neighboring Step.
|
|
30
30
|
|
|
31
|
-
1. **A person works with the result**:
|
|
31
|
+
1. **A person works with the result**: in a workspace they spend a while in (the Editor, a storyboard, a Canvas, a CAD or drawing tool), or someone else approves or takes it over (a hand-off). Turning what a workspace made into something else is the next Step: a CAD tool is its own Step, and the Block that takes pictures of its model and makes a video is the next one. So Bible, Canvas and Editor are separate Steps after Chat.
|
|
32
32
|
2. **Finding new things turns into handling each one**: the trigger (a schedule or an app event), the app read, its filter and "only new" are the first job; what is done with each item is the next job. A trigger is a setting of the first job, never a Step of its own.
|
|
33
33
|
3. **The result leaves StillMade**: it is sent, posted, published, paid or written into another app. Consecutive writes to the same app, with the glue that shapes data for them, are one job.
|
|
34
|
+
4. **Setup or a wait**: a one-time setup that is not part of each job (a brand kit, capturing a voice or a likeness), or a render that takes minutes and is delivered later.
|
|
34
35
|
|
|
35
|
-
In a production the Steps are the workspaces a person opens: work feeding the next workspace is its part, else it joins the one before. A Block with its own interface (a workspace, editor or picker) is always its own Step; two such Steps are never one. A video
|
|
36
|
+
In a production the Steps are the workspaces a person opens: work feeding the next workspace is its part, else it joins the one before. A Block with its own interface (a workspace, editor or picker) is always its own Step; two such Steps are never one. A Type whose own Block renders the finished video (`timeline.render`) needs no Editor Step; the Editor (1.0, captions and export built in) is a Step only when the person edits the cut by hand, and Export video is never a Step beside it.
|
|
36
37
|
|
|
37
|
-
A part that only runs in the desktop app cannot share a Step with cloud parts. Before adding a Step, name which of
|
|
38
|
+
A part that only runs in the desktop app cannot share a Step with cloud parts. Before adding a Step, name which of these reasons makes it separate; if none applies, make it a part of a neighbor. A Step nobody would ever open must not exist on its own. Prefer an app task's own filter (a Gmail query such as `has:attachment filename:png`) to an AI check, and use AI decide only for judgement.
|
|
38
39
|
|
|
39
40
|
Build one Block for a job one Block can do: a module Block calls every hosted operation the job needs (it transcribes a sermon, then finds the verses said in it), a JavaScript Block does several local transforms, a workspace owns its whole document. A Block being built never takes an ingredient's result only so the ingredient can be its own part or Step (Transcribe in front of a verse finder): it calls that operation itself. Parts in one Step (`groups` in the Project Type) are for jobs made of Blocks that already exist and app tasks, each keeping its own permission, approval and credit rules. Never invent a combined runtime.
|
|
40
41
|
|
|
41
|
-
Examples: "every new email with an image becomes a generated image" is two Steps, "Gmail · New emails with images" (When, fetch with an image filter, only new) and "Image from email" (AI write, Generate image); listing When, Fetch, Only new, AI decide, Continue only if, AI write and Generate image as seven Steps splits one job into its parts. "A new Meta lead goes to HubSpot" is three Steps: "Meta Ads · New leads", "Qualify lead" and "HubSpot · Add contact".
|
|
42
|
+
Examples: "a listing video from my photos and the home's facts" is one Step: one Block whose page takes the photos and facts, shows the script and a voice sample to check, then makes the video. "every new email with an image becomes a generated image" is two Steps, "Gmail · New emails with images" (When, fetch with an image filter, only new) and "Image from email" (AI write, Generate image); listing When, Fetch, Only new, AI decide, Continue only if, AI write and Generate image as seven Steps splits one job into its parts. "A new Meta lead goes to HubSpot" is three Steps: "Meta Ads · New leads", "Qualify lead" and "HubSpot · Add contact".
|
|
42
43
|
|
|
43
44
|
## Define the capability first
|
|
44
45
|
|
|
@@ -66,7 +67,7 @@ Give the Block a short, plain name of 40 characters or fewer that says what it d
|
|
|
66
67
|
|
|
67
68
|
## Name inputs in the job's words
|
|
68
69
|
|
|
69
|
-
Name each input for what the person brings, in the job's words: `sermonVideo` for a sermon clip Block, `listingPhotos` for a listing, `lessonSlides` for a lesson podcast. StillMade titles the input from that name ("Sermon video") and words its drop area from it ("Drop your sermon video here", the formats, "Choose a video"), in StillMade and the SDK preview, so never draw your own upload box
|
|
70
|
+
Name each input for what the person brings, in the job's words: `sermonVideo` for a sermon clip Block, `listingPhotos` for a listing, `lessonSlides` for a lesson podcast. StillMade titles the input from that name ("Sermon video") and words its drop area from it ("Drop your sermon video here", the formats, "Choose a video"), in StillMade and the SDK preview, so never draw your own upload box or `<input type="file">`: a Block's screen shows the files as tiles and adds more with `<button class="sm-add" data-stillmade-add="listingPhotos" aria-label="Add photos">`, which opens StillMade's picker and upload, and a list's tiles drop or reorder a file with `data-stillmade-remove="listingPhotos" data-index="2"` and `data-stillmade-move="listingPhotos" data-index="2" data-to="1"` buttons; the files arrive through `onInput`. Keep a bare type name (`video`, `file`) only when any file of that kind does the job. The `description` says what makes a good one.
|
|
70
71
|
|
|
71
72
|
## Speak the job
|
|
72
73
|
|
|
@@ -74,7 +75,7 @@ These are StillMade's defaults: unless the person or the creator asked for somet
|
|
|
74
75
|
|
|
75
76
|
## Interface
|
|
76
77
|
|
|
77
|
-
If the capability needs UI, use the Block UI SDK: generated `manifest.ui` controls first; a sandboxed custom view (`view.html`/`view.css`/`view.js`) only when the core interaction needs one. Build custom views from the Block kit the host injects (`block-kit.css`): the result in `sm-stage`, picks as pictures in `sm-choices`, the picked one in the kit's ink fill (never restyled to an outline, a tint or the page's background) so it reads at a glance, one solid `sm-primary` naming the action in the job's words ("Plan the tour", "Generate voiceover"; never "Run" or "Make it") and no price (StillMade's run button adds it), extras in a closed `sm-more`; a look the person names wins. Fit one laptop screen without scrolling: label beside control, status in a few words, files as tiles, rare tools as icons, (i) on unclear controls. These compact rules are for a job or an ingredient. Size the view to the Block's tier (block-tier.js): an app, a workspace a person works in for a while (video editor, 3D configurator, CAD or drawing tool), looks and works like that kind of app instead of a compact page: its canvas or stage fills the view, with the panels, toolbars, inspector or timeline such an app has, direct manipulation (select, drag, zoom), keyboard shortcuts and undo; it keeps the host appearance and Block kit controls, its panels may scroll, and on a phone its tools fold into sheets while the canvas stays usable. Never shrink an app into a form of fields and one button. StillMade centers a standard view narrower than its Step and zooms a view to fill its space; an app that lays itself out (full-size canvas or WebGL, its own scroll, pan or zoom, its own Ctrl/Cmd +/- keys) puts `data-stillmade-layout="own"` on its outermost element, and StillMade then never centers, zooms or takes those keys. StillMade draws one player for every `<video controls>` (play, timeline, time, sound and full screen, shown while the pointer is on the video, with keys and touch) and a full-screen button on result pictures in `sm-stage` or `sm-gallery` and on any element marked `data-stillmade-expand` (the same value makes one set of pictures, `off` removes it); `data-stillmade-player="native"` keeps the browser's controls, and a `<video>` without `controls` is the Block's own and is never touched. A picture or clip that cannot show here (kept on another device, or it did not open) keeps its place as a quiet `sm-media-off` tile in its own shape with the `image-off` glyph and the reason in its label, never words in its place. Drop words nobody needs; put helpful ones in a closed `sm-hint`. Mark each button `data-stillmade-action
|
|
78
|
+
If the capability needs UI, use the Block UI SDK: generated `manifest.ui` controls first; a sandboxed custom view (`view.html`/`view.css`/`view.js`) only when the core interaction needs one. Build custom views from the Block kit the host injects (`block-kit.css`): the result in `sm-stage`, drawn before the first run in the shape and size of what is coming (`data-ratio="9:16"` for a vertical clip, lines for text, a player bar for sound) so every part of the screen is in place at once and the result fills a place the person already sees instead of popping in somewhere unexpected; StillMade draws it the same way on the Steps it draws; on a wide screen what goes in sits on the left and the result on the right, side by side, and they stack only on narrow screens and phones, the result's place under the button, picks as pictures in `sm-choices`, the picked one in the kit's ink fill (never restyled to an outline, a tint or the page's background) so it reads at a glance, one solid `sm-primary` naming the action in the job's words ("Plan the tour", "Generate voiceover"; never "Run" or "Make it") and no price (StillMade's run button adds it), extras in a closed `sm-more`; a look the person names wins. Fit one laptop screen without scrolling: label beside control, status in a few words, files as tiles, rare tools as icons, (i) on unclear controls. These compact rules are for a job or an ingredient. Size the view to the Block's tier (block-tier.js): an app, a workspace a person works in for a while (video editor, 3D configurator, CAD or drawing tool), looks and works like that kind of app instead of a compact page: its canvas or stage fills the view, with the panels, toolbars, inspector or timeline such an app has, direct manipulation (select, drag, zoom), keyboard shortcuts and undo; it keeps the host appearance and Block kit controls, its panels may scroll, and on a phone its tools fold into sheets while the canvas stays usable. Never shrink an app into a form of fields and one button. StillMade centers a standard view narrower than its Step and zooms a view to fill its space; an app that lays itself out (full-size canvas or WebGL, its own scroll, pan or zoom, its own Ctrl/Cmd +/- keys) puts `data-stillmade-layout="own"` on its outermost element, and StillMade then never centers, zooms or takes those keys. StillMade draws one player for every `<video controls>` (play, timeline, time, sound and full screen, shown while the pointer is on the video, with keys and touch) and a full-screen button on result pictures in `sm-stage` or `sm-gallery` and on any element marked `data-stillmade-expand` (the same value makes one set of pictures, `off` removes it); `data-stillmade-player="native"` keeps the browser's controls, and a `<video>` without `controls` is the Block's own and is never touched. A picture or clip that cannot show here (kept on another device, or it did not open) keeps its place as a quiet `sm-media-off` tile in its own shape with the `image-off` glyph and the reason in its label, never words in its place. Drop words nobody needs; put helpful ones in a closed `sm-hint`. Mark each button `data-stillmade-action` (`run` on the one that runs the Block, which the device checks press once; a page that checks first keeps `run` on that button for both presses; what it does on the others, `"play sample"`) and label each field: Chat presses and fills them. Expose the capability, not the implementation: sensible defaults, previews, progress, clear errors, visible outputs. Show no raw JSON, internal IDs, filesystem details, provider terms or developer settings unless the Block is a developer tool. When a person chooses among options they need to hear or see (voices, music, fonts, looks, templates, images), let them preview each option before choosing: a sample or thumbnail from the Block's own files or the host's free samples, never a paid generation. Skip previews only when there is nothing to preview. Choices StillMade owns (voices, models in the run review) already show samples. Follow the host appearance (Light, Dark and White) and one elastic layout: stacked on a 320px phone with no sideways scroll (the inputs, the button in normal flow, never pinned, then the result's place under it), and from 860px the controls left (≤380px), the result filling the right. Short settings sit side by side, each label beside its control (`sm-field`, `sm-settings`; three or four short options as one `data-segmented` row); many items are one line each (`sm-list`) that open in place; input files are small tiles (`sm-gallery data-size="small"`); on a phone chip rows scroll sideways and long lists show three. Compacting moves controls, never deletes them.
|
|
78
79
|
|
|
79
80
|
## Shared editing
|
|
80
81
|
|
|
@@ -82,11 +83,11 @@ Projects are multiplayer. A custom view subscribes through `StillMade.onShared(c
|
|
|
82
83
|
|
|
83
84
|
## External services
|
|
84
85
|
|
|
85
|
-
Reach external services only through StillMade's hosted operations, the connections service (`connection.execute`), or, in a module Block, `stillmade.net.fetch` to origins declared in `permissions.network` (with the key each needs), `stillmade.net.connect` for a live WebSocket to one of them, and `stillmade.connections.call` to adapters or catalog apps in `permissions.connections`; never put keys in code, inputs or headers: StillMade adds each person's own key on its servers. The host owns the model and provider choice, BYOK keys, StillMade credits, spending consent, authorization, token refresh, rate limits, retries and provider errors; a Block never receives a secret and never names a provider unless it must. Treat provider unavailability, timeout, cancellation and partial failure as
|
|
86
|
+
Reach external services only through StillMade's hosted operations, the connections service (`connection.execute`), or, in a module Block, `stillmade.net.fetch` to origins declared in `permissions.network` (with the key each needs), `stillmade.net.connect` for a live WebSocket to one of them, and `stillmade.connections.call` to adapters or catalog apps in `permissions.connections`; never put keys in code, inputs or headers: StillMade adds each person's own key on its servers. The host owns the model and provider choice, BYOK keys, StillMade credits, spending consent, authorization, token refresh, rate limits, retries and provider errors; a Block never receives a secret and never names a provider unless it must. Treat provider unavailability, timeout, cancellation and partial failure as outcomes the Block reports, not crashes: a call the result needs throws and fails the run (see Useful failures); an optional part's failure is caught, given its fallback and named in an optional `notes` text output. Generated images, video, voices, music and sound effects come from hosted operations or the `media.generate` action, paid with the user's StillMade credits at StillMade's prices; for structured model output declare a `json` output with `capability.schema` instead of parsing prose. When a Block needs npm libraries, WebAssembly (threaded: `"threads": true` in module.json) or heavy compute, use `runtime: "module"` and reach hosted operations through `stillmade.hosted.run` with the operations listed in `permissions.capabilities`. Decode, cut, join, re-encode, extract or normalise audio and video with `stillmade.media.transform` on the device; never ask for a server render. For a rich interactive interface (React or another framework, SVG, canvas, drag), use a frame view: `src/view.config.json` with `{"runtime":"frame"}` and `src/view.js` bundled as one IIFE, colored with StillMade's theme variables. For files and structured data use the `file`, `document`, `table`, `url`, `date` and `color` types and their generated controls and presentations, not JSON text.
|
|
86
87
|
|
|
87
88
|
## Dependencies
|
|
88
89
|
|
|
89
|
-
A Block must declare everything it requires and must not assume anything is installed. Portable packages carry no package dependencies (`portable.dependencies` is empty): inline small, license-compatible code and record its license and notice in `manifest.license` and `manifest.provenance`. Desktop-only tools are reached solely through declared desktop permissions and the host desktop bridge. If a dependency cannot be delivered through the Block runtime, report the incompatibility instead of assuming the user's machine has it.
|
|
90
|
+
A Block must declare everything it requires and must not assume anything is installed. Portable packages carry no package dependencies (`portable.dependencies` is empty): inline small, license-compatible code and record its license and notice in `manifest.license` and `manifest.provenance`. The copyright holder in the Block's own `provenance.notice` is the person it is made for: replace the placeholder `create` writes with their name, never StillMade, the SDK or yourself. Desktop-only tools are reached solely through declared desktop permissions and the host desktop bridge. If a dependency cannot be delivered through the Block runtime, report the incompatibility instead of assuming the user's machine has it.
|
|
90
91
|
|
|
91
92
|
## Security
|
|
92
93
|
|
|
@@ -152,4 +153,8 @@ A Block is done only when every applicable item holds. Passing a compile, one un
|
|
|
152
153
|
- C: Missing generic platform primitive
|
|
153
154
|
- D: Security or permission restriction
|
|
154
155
|
- E: Runtime or language incompatibility
|
|
155
|
-
- F: Fundamentally incompatible capability
|
|
156
|
+
- F: Fundamentally incompatible capability
|
|
157
|
+
|
|
158
|
+
## Guides in this folder
|
|
159
|
+
|
|
160
|
+
Every guide on the StillMade site is in `docs/` here as Markdown, so you can read them offline: a link to `/docs/<path>` (in `SDK.md`, `PASTE_TO_LLM.md` or anywhere else) is the file `docs/<path>.md`, and `/docs` itself is `docs/index.md`. Start with `docs/build/quickstart.md` for a Block and `docs/project-types/build.md` for a Project Type, which also says how a Type embeds module Blocks. `docs/reference/cli.md` lists every command, `docs/reference/generation-models.md` the hosted models and `docs/reference/limits.md` the limits.
|
package/FRAME_VIEWS.md
CHANGED
|
@@ -51,6 +51,87 @@ Shared state works as in every view: keep each independently edited value in
|
|
|
51
51
|
its own field (for example `point0`, `point1`) so two people editing
|
|
52
52
|
different values never conflict.
|
|
53
53
|
|
|
54
|
+
## Adding files to an input
|
|
55
|
+
|
|
56
|
+
A one-page Block shows its input's files on its own screen as tiles and adds
|
|
57
|
+
more there. Never draw an upload box or an `<input type="file">` of your own:
|
|
58
|
+
the + tile asks StillMade, which opens its own file picker and saves the
|
|
59
|
+
files exactly as the Step's own tiles do (working copies, files kept on the
|
|
60
|
+
person's device, the limits and the error messages).
|
|
61
|
+
|
|
62
|
+
```html
|
|
63
|
+
<ul class="sm-gallery" data-size="small" id="photos">
|
|
64
|
+
<!-- one <li> per photo, drawn from onInput -->
|
|
65
|
+
<li><button type="button" class="sm-add" data-stillmade-add="listingPhotos"
|
|
66
|
+
aria-label="Add photos" title="Add photos"></button></li>
|
|
67
|
+
</ul>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`data-stillmade-add` names a declared `image`, `video`, `audio`, `asset` or
|
|
71
|
+
`file` input, or a list of one of them (`image[]`). It needs no code: a click
|
|
72
|
+
or key press on the tile opens StillMade's picker. A list gets every chosen
|
|
73
|
+
file added; a single input takes the first. The saved values reach the view
|
|
74
|
+
the way every input does, so draw the tiles from `onInput`:
|
|
75
|
+
|
|
76
|
+
```js
|
|
77
|
+
StillMade.onInput(async input => {
|
|
78
|
+
for (const photo of input.listingPhotos || []) {
|
|
79
|
+
const preview = await StillMade.previewImage(photo); // display copy
|
|
80
|
+
// ...add an <li><img src="preview.url"></li> before the + tile
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
From your own button, call `await StillMade.addFiles('listingPhotos')` inside
|
|
86
|
+
its click handler. It resolves to `{added}` (0 when the person closes the
|
|
87
|
+
picker) and rejects with a message for an undeclared input, an input that is
|
|
88
|
+
not a file input, an input an earlier Step fills, a person who can only view
|
|
89
|
+
the project, or a call that does not come from a click or key press in the
|
|
90
|
+
view. The view never receives a `File` or a `blob:` URL, only the saved
|
|
91
|
+
values. StillMade hides `[data-stillmade-add]` tiles from viewers and for
|
|
92
|
+
inputs an earlier Step fills. In the SDK preview, the tile opens your
|
|
93
|
+
computer's file chooser and the preview keeps the files like your own picks.
|
|
94
|
+
|
|
95
|
+
### Removing and reordering files
|
|
96
|
+
|
|
97
|
+
A list input's files are removed and put in order on the same screen, so a
|
|
98
|
+
person drops a bad photo or sets the tour's order without leaving the Block.
|
|
99
|
+
Put the buttons in each tile, with `data-index` (from 0) naming its place in
|
|
100
|
+
the list `onInput` gave you:
|
|
101
|
+
|
|
102
|
+
```html
|
|
103
|
+
<li>
|
|
104
|
+
<img src="..." alt="Photo 3">
|
|
105
|
+
<span class="sm-tile-tools">
|
|
106
|
+
<button type="button" data-stillmade-move="listingPhotos" data-index="2" data-to="1"
|
|
107
|
+
aria-label="Move earlier" title="Move earlier"><span class="sm-glyph" data-glyph="chevron-left" aria-hidden="true"></span></button>
|
|
108
|
+
<button type="button" data-stillmade-move="listingPhotos" data-index="2" data-to="3"
|
|
109
|
+
aria-label="Move later" title="Move later"><span class="sm-glyph" data-glyph="chevron-right" aria-hidden="true"></span></button>
|
|
110
|
+
<button type="button" data-stillmade-remove="listingPhotos" data-index="2"
|
|
111
|
+
aria-label="Remove" title="Remove"><span class="sm-glyph" data-glyph="close" aria-hidden="true"></span></button>
|
|
112
|
+
</span>
|
|
113
|
+
</li>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
`data-stillmade-remove` removes the file at `data-index`; `data-stillmade-move`
|
|
117
|
+
moves it to the place `data-to`. A `data-to` past either end of the list does
|
|
118
|
+
nothing, so the first tile's Move earlier is harmless (disable it if you like).
|
|
119
|
+
From your own code, call `await StillMade.removeFile('listingPhotos', 2)` or
|
|
120
|
+
`await StillMade.moveFile('listingPhotos', 2, 1)` inside a click handler; each
|
|
121
|
+
resolves to `{files}`, how many the list now holds. StillMade changes the
|
|
122
|
+
Step's list as its own tile buttons do, keeping each saved file's upload record
|
|
123
|
+
with it, and the new list reaches the view through `onInput`: redraw the tiles
|
|
124
|
+
from it, never from your own copy.
|
|
125
|
+
|
|
126
|
+
Both work only on list inputs (`image[]`, `video[]`, `audio[]`, `asset[]`,
|
|
127
|
+
`file[]`); `addFiles` replaces a single input's file. They are refused, as
|
|
128
|
+
`addFiles` is, for an undeclared input, an input an earlier Step fills, a
|
|
129
|
+
viewer, Chat and a call that does not come from a click or key press in the
|
|
130
|
+
view, and also when the file at that place changed after the view was given it
|
|
131
|
+
(another person edited the list): the view gets the current list and the person
|
|
132
|
+
tries again. StillMade hides these buttons wherever it hides the + tile. The SDK
|
|
133
|
+
preview changes its example input the same way.
|
|
134
|
+
|
|
54
135
|
## Theming
|
|
55
136
|
|
|
56
137
|
The theme variables from StillMade's design system are always defined:
|
|
@@ -60,6 +141,25 @@ rest. Colors written with them follow Light, Dark and White automatically.
|
|
|
60
141
|
Frame views are not required to use them; the appearance check reports
|
|
61
142
|
hard-coded colors as advice instead of refusing the view.
|
|
62
143
|
|
|
144
|
+
A color the check takes is a theme variable, `transparent` or `currentColor`,
|
|
145
|
+
or a gradient of them (`linear-gradient(to top, var(--bg), transparent)`).
|
|
146
|
+
`opacity` is not a color and is always allowed. `color-mix()`, `rgba()`,
|
|
147
|
+
`#rrggbbaa` and other written colors are what it reports. For words over a
|
|
148
|
+
photo or video, use the kit's shade: `var(--scrim)` is the page's background,
|
|
149
|
+
partly see-through, in every theme, and `class="sm-scrim"` lays it over the
|
|
150
|
+
bottom of a positioned box (an `sm-stage`) under the words inside it:
|
|
151
|
+
|
|
152
|
+
```html
|
|
153
|
+
<figure class="sm-stage" data-fill>
|
|
154
|
+
<img src="..." alt="">
|
|
155
|
+
<figcaption class="sm-scrim">12 Elm Street · 3 bed</figcaption>
|
|
156
|
+
</figure>
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
`--scrim` and `sm-scrim` are the only shade a Block uses; StillMade's own
|
|
160
|
+
`--scrim-top` and `--scrim-bottom` (theme.css) are for its pages and the check
|
|
161
|
+
reports them.
|
|
162
|
+
|
|
63
163
|
## Layout
|
|
64
164
|
|
|
65
165
|
StillMade zooms a view to fill the space its Step gives it (up to 150%), and
|
|
@@ -101,6 +201,19 @@ too: such a picture without a `tabindex` of its own joins the tab order,
|
|
|
101
201
|
keyboard focus on it shows the button, Enter or Space opens the viewer, and
|
|
102
202
|
closing the viewer gives the focus back to the picture.
|
|
103
203
|
|
|
204
|
+
## A job on one page: a check, then the run
|
|
205
|
+
|
|
206
|
+
A job the person fills in and gets a result from is one page: the inputs on the
|
|
207
|
+
left and the result's place on the right on a wide screen; on a phone they
|
|
208
|
+
stack in the page's order, the inputs, the button in normal flow (never a sticky
|
|
209
|
+
bar), then the result's place under it. When the expensive run needs a cheap
|
|
210
|
+
check first (the script and a voice sample before the video), keep it on the
|
|
211
|
+
same page: call `StillMade.run({make: 'check'})`, show what comes back, then
|
|
212
|
+
`StillMade.run({make: 'video', script})` with what the person checked. Each run
|
|
213
|
+
is priced and approved by StillMade on its own, so the view shows no price. The
|
|
214
|
+
module side and what the person sees are in MODULES.md, "A check, then the
|
|
215
|
+
expensive run, on one page".
|
|
216
|
+
|
|
104
217
|
## Assets
|
|
105
218
|
|
|
106
219
|
Images, fonts, JSON, audio and video the view needs ship as files named by
|
package/INTERFACE_DESIGN.md
CHANGED
|
@@ -18,14 +18,7 @@ wins. Open `packages/design-system/block-kit.html` in a browser to see every
|
|
|
18
18
|
piece in Light, Dark and White.
|
|
19
19
|
|
|
20
20
|
```html
|
|
21
|
-
<main class="sm-block"
|
|
22
|
-
<section class="sm-stage" id="stage" data-ratio="16:9" aria-live="polite">
|
|
23
|
-
<div class="sm-empty" id="empty">
|
|
24
|
-
<span class="sm-glyph" data-glyph="video" aria-hidden="true"></span>
|
|
25
|
-
<p>Drop a clip</p>
|
|
26
|
-
</div>
|
|
27
|
-
</section>
|
|
28
|
-
|
|
21
|
+
<main class="sm-block">
|
|
29
22
|
<fieldset class="sm-choices" id="look" data-stillmade-share="look" data-ratio="16:9">
|
|
30
23
|
<legend>Look</legend>
|
|
31
24
|
<label><input type="radio" name="look" value="warm" checked><img src="data:..." alt=""><span>Warm</span></label>
|
|
@@ -40,21 +33,33 @@ piece in Light, Dark and White.
|
|
|
40
33
|
<input id="caption" data-stillmade-input="caption" placeholder="Optional">
|
|
41
34
|
</div>
|
|
42
35
|
|
|
43
|
-
<div class="sm-actions">
|
|
44
|
-
<button type="button" class="sm-primary" id="run" data-stillmade-action="make the clip">Make the clip</button>
|
|
45
|
-
<p class="sm-status" id="status" role="status"></p>
|
|
46
|
-
</div>
|
|
47
|
-
|
|
48
36
|
<details class="sm-more">
|
|
49
37
|
<summary>More</summary>
|
|
50
38
|
<div class="sm-fields"><!-- secondary settings --></div>
|
|
51
39
|
</details>
|
|
40
|
+
|
|
41
|
+
<div class="sm-actions">
|
|
42
|
+
<button type="button" class="sm-primary" id="run" data-stillmade-action="run">Make the clip</button>
|
|
43
|
+
<p class="sm-status" id="status" role="status"></p>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<section class="sm-stage" id="stage" data-ratio="16:9" aria-live="polite">
|
|
47
|
+
<div class="sm-empty" id="empty">
|
|
48
|
+
<span class="sm-glyph" data-glyph="video" aria-hidden="true"></span>
|
|
49
|
+
<p>Your clip</p>
|
|
50
|
+
</div>
|
|
51
|
+
</section>
|
|
52
52
|
</main>
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
+
With an `sm-stage` as its direct child and no `data-layout`, `sm-block` puts
|
|
56
|
+
the inputs on the left and the stage on the right from 860 px wide. Under that
|
|
57
|
+
everything stacks in the page's order, so the stage comes last in the markup:
|
|
58
|
+
the inputs, the button, then the result's place under it.
|
|
59
|
+
|
|
55
60
|
| Class | Use it for |
|
|
56
61
|
| --- | --- |
|
|
57
|
-
| `sm-block` | The one workspace. `data-layout="split"`
|
|
62
|
+
| `sm-block` | The one workspace. With an `sm-stage` child, the controls sit left and the stage right from 860 px; narrower, they stack in the page's order. `data-layout="stack"` keeps one column; `"split"` is an older layout with the stage on the left. |
|
|
58
63
|
| `sm-stage` | The thing being made: preview, media or result. `data-ratio="16:9"`, `"9:16"` or `"1:1"`. |
|
|
59
64
|
| `sm-empty` | An empty stage: a glyph, at most five words, one action. |
|
|
60
65
|
| `sm-choices` | Picks shown as pictures (`img`, `.sm-swatch`, `.sm-glyph`) and one or two words. `data-compact` for short text chips, `data-segmented` for one connected row of three or four short options. The pick is filled with the kit's ink, so it reads at a glance; a `disabled` fieldset keeps its pick and fades the rest. Chips and segments scroll sideways on a phone. Give the `fieldset` an `id` and `data-stillmade-share` so teammates see the same pick. |
|
|
@@ -65,10 +70,12 @@ piece in Light, Dark and White.
|
|
|
65
70
|
| `sm-actions` | One `sm-primary`, then `sm-quiet` buttons and `sm-icon` buttons (each with `aria-label` and `title`). |
|
|
66
71
|
| `sm-status` | Live state beside the action: `data-state="loading"`, `"success"`, `"waiting"` or `"error"`. |
|
|
67
72
|
| `sm-more` | A closed `<details>` for secondary settings. |
|
|
68
|
-
| `sm-hint` | A closed `<details>`
|
|
73
|
+
| `sm-hint` | A closed `<details>` (i) for an explanation that might help. Its words show on hover or focus, or a tap on touch screens. |
|
|
69
74
|
| `sm-gallery` | A grid of results or media. `data-size="small"` for input files: more tiles per row as the screen widens. |
|
|
70
75
|
| `sm-media-off` | A picture or clip that cannot show here (on another device, or it did not open): a quiet tile in its own shape (`--sm-photo-ratio`, the tile's shape in a gallery) holding the `image-off` glyph, the reason in `aria-label` and `title`, no words inside. |
|
|
71
|
-
| `sm-
|
|
76
|
+
| `sm-add` | The + tile that adds files to an input: `<button type="button" class="sm-add" data-stillmade-add="listingPhotos" aria-label="Add photos">`. StillMade opens its own picker and saves the files; they arrive through `onInput`. In an `sm-gallery` it takes the tile's shape. |
|
|
77
|
+
| `sm-scrim` | Words over a photo or video, inside a positioned box such as an `sm-stage`: a see-through shade of the page under them, in every theme. `var(--scrim)` is the same shade for your own rules. |
|
|
78
|
+
| `sm-glyph` | A small icon in `currentColor`: `play`, `pause`, `plus`, `close`, `check`, `chevron`, `chevron-left`, `chevron-right`, `upload`, `image`, `image-off`, `video`, `audio`, `text`, `spark`, `info`, `warning`, `spinner`. Works in standard views, which cannot use SVG. |
|
|
72
79
|
|
|
73
80
|
**Function first.** When the person building a Block does not ask for a look,
|
|
74
81
|
use the kit as is: they want it to work and be easy to use. When they name a
|
|
@@ -137,6 +144,14 @@ person or the creator has not asked for something else. What they ask for wins.
|
|
|
137
144
|
`details`, `notes` or `listingDetails`; when a note has to be split across
|
|
138
145
|
several fields StillMade does it free. Never build your own reference
|
|
139
146
|
picker or library upload.
|
|
147
|
+
- **Files are tiles, added through StillMade.** A screen that holds an
|
|
148
|
+
input's files shows them as tiles (`sm-gallery`) ending in the kit's + tile,
|
|
149
|
+
`<button type="button" class="sm-add" data-stillmade-add="listingPhotos"
|
|
150
|
+
aria-label="Add photos">`. StillMade opens its own picker and saves the files
|
|
151
|
+
as its own tiles do; they arrive through `onInput`. From your own code call
|
|
152
|
+
`StillMade.addFiles("listingPhotos")` in a click. Never an
|
|
153
|
+
`<input type="file">` or an upload box of the Block's own. See
|
|
154
|
+
[Frame views](FRAME_VIEWS.md#adding-files-to-an-input).
|
|
140
155
|
- **Days and times are picked, never typed.** Use the `date` type. StillMade
|
|
141
156
|
shows a calendar, and a list of times as well when the input is about a time
|
|
142
157
|
(a name such as `postAt` or `startsAt`, a label with Time, When or Starts, or
|
|
@@ -146,8 +161,11 @@ person or the creator has not asked for something else. What they ask for wins.
|
|
|
146
161
|
any app is a connector Step after the Block, and StillMade words its button
|
|
147
162
|
("Post to Instagram"). A Block never posts from inside itself.
|
|
148
163
|
- **Chat can do all of it.** Every button carries `data-stillmade-action`
|
|
149
|
-
|
|
150
|
-
and
|
|
164
|
+
and every field a label, so the project's Chat can press and fill them. The
|
|
165
|
+
button that runs the Block says `run` (StillMade's phone and desktop checks
|
|
166
|
+
press it with the fixture); every other button names what it does
|
|
167
|
+
(`data-stillmade-action="play sample"`). Chat reads the value with the
|
|
168
|
+
button's own words.
|
|
151
169
|
|
|
152
170
|
## 4. Rules
|
|
153
171
|
|
|
@@ -158,7 +176,15 @@ exception, never unrelated technical UI.
|
|
|
158
176
|
1. Show the thing being made, not a technical representation of it. No JSON
|
|
159
177
|
dumps, source editors, manifests, debug consoles or "Technical result"
|
|
160
178
|
panels unless the task is about source. A collapsed disclosure is still an
|
|
161
|
-
added surface.
|
|
179
|
+
added surface. Every part shows at once (November 3, 2026): before the first
|
|
180
|
+
run the result's place is drawn in the shape and size of what is coming
|
|
181
|
+
(`<section class="sm-stage" data-ratio="9:16">` for a vertical clip, lines for
|
|
182
|
+
text, a player bar for sound), so the result fills a place the person already
|
|
183
|
+
sees instead of popping in somewhere unexpected. StillMade draws the Steps it
|
|
184
|
+
draws the same way (`ResultPlace`). On a wide screen what goes in sits on the
|
|
185
|
+
left and the result on the right, side by side (the kit's `sm-block` with an
|
|
186
|
+
`sm-stage` does this from 860px); they stack only on narrow screens and phones,
|
|
187
|
+
the result's place under the button (rule 16).
|
|
162
188
|
2. One obvious next action. Seven or fewer choices in view; strong defaults.
|
|
163
189
|
3. Choices people see or hear (voices, music, sounds, fonts, looks, colors,
|
|
164
190
|
templates, images) show a preview of each option: a thumbnail or a sample
|
|
@@ -183,7 +209,9 @@ exception, never unrelated technical UI.
|
|
|
183
209
|
12. Status is a dot or a few words ("No narration yet"), never a paragraph.
|
|
184
210
|
The reason sits behind an `sm-hint`.
|
|
185
211
|
13. Files are tiles: a saved file is a thumbnail or chip, and adding one is a
|
|
186
|
-
+ tile
|
|
212
|
+
+ tile, `<button class="sm-add" data-stillmade-add="<input>">`, which
|
|
213
|
+
opens StillMade's picker (or `StillMade.addFiles("<input>")` from your own
|
|
214
|
+
button). Never an `<input type="file">` or the browser's bare
|
|
187
215
|
"Choose File / No file chosen" picker, and no size limits in view until
|
|
188
216
|
a file is too big.
|
|
189
217
|
14. Rare tools (update, schedule, history, reload) are named icon buttons
|
|
@@ -197,8 +225,11 @@ exception, never unrelated technical UI.
|
|
|
197
225
|
16. Use the width. From 860 px wide, the kit puts the controls on the left
|
|
198
226
|
at a reading width (300–380 px) and the result (`sm-stage`, a direct
|
|
199
227
|
child of `sm-block`) fills the right, in its real shape. Under that the
|
|
200
|
-
page is one column
|
|
201
|
-
|
|
228
|
+
page is one column in the page's order: the inputs, the action in
|
|
229
|
+
normal flow (rule 5: never a sticky bar), then the result's place under
|
|
230
|
+
it, so `sm-stage` comes after `sm-actions` in the markup. Keep the
|
|
231
|
+
inputs above the button short enough that a phone shows the button
|
|
232
|
+
without scrolling far; fold the rest into `sm-more`. Extra width goes to the result, never to wider text
|
|
202
233
|
fields. Before there is a result, the stage previews what will be made
|
|
203
234
|
from the inputs given so far, not an empty box. `data-layout="stack"`
|
|
204
235
|
keeps one column. StillMade zooms a view to fill its space and centers a
|
|
@@ -241,6 +272,15 @@ exception, never unrelated technical UI.
|
|
|
241
272
|
<span class="sm-glyph" data-glyph="image-off" aria-hidden="true"></span>
|
|
242
273
|
</span>
|
|
243
274
|
```
|
|
275
|
+
23. One page per job (November 3, 2026). A job the person fills in and then
|
|
276
|
+
gets a result from is one Block on one page: the inputs and settings, a
|
|
277
|
+
cheap check before the expensive run (the script and a voice sample
|
|
278
|
+
before the video), then the result. The check is a second
|
|
279
|
+
`StillMade.run` on the same page, priced by StillMade on its own (Module
|
|
280
|
+
Blocks, "A check, then the expensive run, on one page"); it never becomes
|
|
281
|
+
a second Block or Step. A workspace the person works in for a while (a
|
|
282
|
+
CAD tool, a canvas, an editor) is its own Block, and turning what it made
|
|
283
|
+
into something else is the next one.
|
|
244
284
|
|
|
245
285
|
## 5. What StillMade checks
|
|
246
286
|
|
package/MOBILE_UI.md
CHANGED
|
@@ -60,8 +60,10 @@ For deterministic browser checks, mark a custom form control with
|
|
|
60
60
|
test fixture through the real UI before pressing its run action. This marker
|
|
61
61
|
does not change the Block's input contract or grant access to host services.
|
|
62
62
|
For a text-bearing object fixture such as `{brief:{text:"…"}}`, the profile
|
|
63
|
-
enters its `text` into the marked text field
|
|
64
|
-
`data-stillmade-action="run"`
|
|
63
|
+
enters its `text` into the marked text field, then presses the button marked
|
|
64
|
+
`data-stillmade-action="run"` (or the view's only button). Every button carries
|
|
65
|
+
`data-stillmade-action` so Chat can press it: `run` on the button that runs the
|
|
66
|
+
Block, and what it does on every other button (`data-stillmade-action="play sample"`).
|
|
65
67
|
The existing `data-stillmade-share` marker is also recognized for shared text
|
|
66
68
|
fields. A custom view without a reachable mapped control must not be counted
|
|
67
69
|
as having passed its fixture's success interaction.
|